En bref — Masquer est la plus douce des trois modifications structurelles, et la plus mal comprise. Contrairement à la suppression (qui retire des lignes) ou à l'insertion (qui en ajoute), masquer ne change rien aux données — cela met la taille d'affichage d'une colonne ou d'une ligne à zéro. Les cellules sont toujours là, toujours dans chaque
SUM, toujours copiées quand vous copiez la plage, toujours pleinement modifiables par le code..Hidden = Trueappartient à.EntireColumn/.EntireRow, pas à une cellule isolée. Le piège qui attrape tout le monde : masquer une colonne ne la retire pas d'un total —SUM(B:B)additionne toujours la colonne masquée B. Masquez pour la présentation ; si vous voulez sortir quelque chose d'un calcul, c'est supprimer, filtrer ouSUBTOTAL— pas masquer.
' Masquer les colonnes d'appoint B:D ; masquer toute ligne dont Status vaut "Done".
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
ws.Columns("B:D").Hidden = True ' colonnes entières, une seule instruction
ws.Rows("2:1000").EntireRow.Hidden = False ' partir de tout-visible, puis masquer sélectivement
Dim i As Long
For i = 2 To 1000
ws.Rows(i).Hidden = (ws.Cells(i, "Status").Value = "Done")
Next i
Masquer a l'air de la plus simple des trois opérations, et mécaniquement c'est le cas — une seule propriété booléenne. Ce qui justifie un guide, c'est le modèle mental, car « masquer » signifie discrètement autre chose que ce que la plupart des gens supposent. Ils y recourent pour exclure des données — d'une vue, d'un total, d'une copie — et masquer ne fait que la première de ces choses. Bien saisir cela, c'est toute la bataille ; la syntaxe tient en une ligne à peine.
Ce que vous allez apprendre
- Le modèle mental — masquer redimensionne à zéro, cela ne retire ni n'exclut les données
- Pourquoi
.Hiddenappartient à.EntireColumnet.EntireRow - Le piège qui attrape tout le monde — les cellules masquées comptent encore dans les formules et les copies
- Réafficher — la moitié oubliée, et la ligne qui sauve une feuille bloquée
- Les lignes masquées à la main face aux lignes masquées par AutoFilter quand vous bouclez
Le modèle mental : masqué signifie largeur nulle, pas disparu
Supprimer retire une ligne ; insérer en ajoute une. Masquer ne fait ni l'un ni l'autre — cela prend
une ligne ou une colonne existante et met sa hauteur ou sa largeur à zéro pour qu'elle ne s'affiche
plus à l'écran. Tout le reste est inchangé. Les données restent exactement où elles étaient, à
exactement la même adresse ; Range("B2") lit et écrit toujours sans accroc la valeur d'une colonne
B masquée. Une ligne masquée n'est pas une ligne supprimée déguisée — c'est une ligne pleinement
présente que vous avez simplement demandé à Excel de ne pas afficher.
C'est pourquoi masquer est la modification structurelle non structurelle : cela change l'affichage, pas la grille. La ligne 6 reste la ligne 6 quand elle est masquée ; rien n'a remonté, rien n'a descendu, il n'y a donc aucun piège de sens de boucle ici — vous pouvez masquer et réafficher dans une simple boucle vers le bas toute la journée. La subtilité n'est pas dans la façon de masquer ; elle est dans le fait de croire que les données sont parties quelque part. Elles ne le sont pas.
La règle de syntaxe : .Hidden vit sur la colonne ou la ligne entière
Hidden est une propriété d'une colonne entière ou d'une ligne entière — pas d'une cellule ou d'un
bloc quelconque. Vous ne pouvez pas masquer B2:B10 ; vous masquez les colonnes ou les lignes
auxquelles ces cellules appartiennent. Vous adressez donc soit la colonne/ligne entière directement,
soit vous promouvez une plage de cellules avec .EntireColumn / .EntireRow :
ws.Columns("B").Hidden = True ' masquer la colonne B
ws.Columns("B:D").Hidden = True ' masquer B, C et D
ws.Rows("10:20").Hidden = True ' masquer les lignes 10 à 20
ws.Range("B2:D2").EntireColumn.Hidden = True ' promouvoir une plage de cellules en ses colonnes entières
Essayez de définir .Hidden sur une plage partielle et vous obtiendrez soit une erreur, soit vous
masquerez plus que prévu, car la propriété n'est tout simplement pas définie à l'échelle de la
cellule. .EntireColumn et .EntireRow sont les mêmes promotions que celles employées pour
supprimer et insérer — le geste récurrent qui vous fait passer de « ces cellules » à « la
colonne/ligne entière dans laquelle elles se trouvent ».
Le piège qui attrape tout le monde : les cellules masquées comptent encore
Voici la croyance qui provoque de vrais bugs : masquer une colonne la retire de mes totaux. Non.
Masquer est un réglage d'affichage ; cela n'a aucun effet sur le calcul. =SUM(B:B) inclut la
colonne masquée B. =SUM(A2:A100) inclut chaque ligne masquée de cet intervalle. Copiez une plage
qui traverse des colonnes masquées et les valeurs masquées suivent dans le collage. Représentez une
série masquée dans un graphique et — sauf indication contraire donnée au graphique — elle peut
disparaître, ou non. Masquer change ce qu'un humain voit, et presque rien à ce que fait une
formule ou une copie.
Donc si votre véritable objectif est « laisser ces valeurs hors du total », masquer est le mauvais outil, et y recourir produit un rapport dont les chiffres ne correspondent pas à ses lignes visibles. Les bons outils :
SUBTOTAL(109, ...)ouAGGREGATE— ceux-là ignorent bel et bien les lignes masquées par un filtre (etSUBTOTAL(109)ignore aussi les lignes masquées à la main), si bien qu'un total filtré se met à jour au fil du filtrage.- AutoFilter — masque et exclut de
SUBTOTAL, la façon honnête de « n'afficher et ne totaliser que les lignes correspondantes ». - Supprimer — si les données ne devraient vraiment pas exister, retirez-les (voir VBA Delete Rows).
Utilisez .Hidden quand les données doivent rester, rester dans les calculs, et simplement ne pas
encombrer la vue — colonnes d'appoint derrière un tableau de bord, lignes de travail à côté d'un
récapitulatif imprimé. C'est à cela que sert masquer.
Réafficher : la moitié oubliée et la ligne de secours
Chaque masquage exige un réaffichage correspondant, et le bug consiste à oublier qu'une sélection
plus large doit se charger du réaffichage. Si la colonne B est masquée et que vous ne touchez
jamais qu'à Columns("B"), un utilisateur qui ne lance jamais votre macro ne peut pas la récupérer
facilement à la main — il doit sélectionner de part et d'autre du trou. Dans le code, le secours
fiable consiste à réafficher sur une plage généreuse, ou sur la feuille entière :
ws.Columns("A:Z").Hidden = False ' réafficher toute colonne masquée de A:Z
ws.Rows("1:1000").Hidden = False ' réafficher toute ligne masquée de cet intervalle
ws.Cells.EntireColumn.Hidden = False ' option nucléaire : réafficher CHAQUE colonne de la feuille
ws.Cells.EntireRow.Hidden = False ' ...et chaque ligne
ws.Cells.EntireColumn.Hidden = False est la ligne à retenir — elle réaffiche tout, quelles que
soient les colonnes masquées et par qui. Une distinction de plus à connaître : définir
Columns("B").ColumnWidth = 0 rend aussi une colonne invisible, mais ce n'est pas la même
chose que .Hidden = True — .Hidden est la vraie propriété, elle survit proprement aux
allers-retours, et c'est elle que bascule « Afficher » dans l'interface. Préférez .Hidden ;
traitez une largeur littérale de zéro comme un bug à corriger, pas comme une technique.
Lignes masquées contre lignes filtrées : le même indicateur, différent quand vous bouclez
Une ligne masquée à la main comme une ligne masquée par AutoFilter renvoient toutes deux
.Hidden = True, si bien qu'une boucle qui teste If ws.Rows(i).Hidden ne peut pas les distinguer
— ce qui compte quand vous voulez agir sur « seulement les lignes que l'utilisateur voit ». La façon
propre de récupérer les cellules visibles, c'est SpecialCells :
' Boucler uniquement sur les lignes actuellement visibles (ignore à la fois les lignes masquées et filtrées).
Dim rng As Range, area As Range
On Error Resume Next
Set rng = ws.Range("A2:A1000").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rng Is Nothing Then
For Each area In rng.Areas ' les cellules visibles reviennent en plusieurs blocs
' ... traiter area ...
Next area
End If
Deux choses à intégrer. Premièrement, SpecialCells(xlCellTypeVisible) renvoie les cellules
visibles sous forme de plusieurs zones (chaque suite ininterrompue de lignes visibles forme une
zone), donc parcourez .Areas, pas un unique bloc contigu. Deuxièmement, une simple boucle
For i = 2 To 1000 visite les lignes masquées et filtrées comme n'importe quelle autre — masquer ne
retire pas une ligne de l'itération, seulement de la vue. Si vous pensez « les lignes à l'écran »,
demandez explicitement les cellules visibles ; ne supposez pas que la boucle saute les lignes
masquées.
Comment ExcelMaster aide
Masquer fait trébucher non pas sur la syntaxe mais sur les attentes : des totaux qui incluent
obstinément les colonnes masquées, une feuille que personne n'arrive à débloquer parce que la plage
de réaffichage était trop étroite, une boucle qui traite les lignes filtrées parce que .Hidden ne
voulait pas dire ce qu'on croyait. Les correctifs sont tous petits et tous faciles à manquer.
ExcelMaster vous laisse
décrire l'intention — « masque les colonnes d'appoint B à D », « masque chaque ligne marquée Done »,
« n'affiche que les lignes visibles dans le total ». Il écrit correctement .EntireColumn.Hidden /
.EntireRow.Hidden, recourt à SUBTOTAL ou SpecialCells(xlCellTypeVisible) quand vous voulez en
réalité « exclure du calcul » plutôt que simplement « masquer », et vous donne un chemin
tout-afficher pour qu'aucune feuille ne reste bloquée. Vous gardez le classeur et le code ; vous
vous épargnez la surprise d'un total qui ignore ce que vos yeux vous disent.
Questions fréquentes
Comment masquer une colonne en VBA ?
Définissez .Hidden = True sur la colonne entière : ws.Columns("B").Hidden = True, ou
ws.Columns("B:D").Hidden = True pour plusieurs. À partir d'une plage de cellules, promouvez-la
d'abord : ws.Range("B2:D2").EntireColumn.Hidden = True. .Hidden est une propriété d'une colonne
ou d'une ligne entière, vous ne pouvez donc pas l'appliquer à une plage partielle.
Masquer une colonne la retire-t-elle d'un SUM dans Excel ?
Non. Masquer ne change que l'affichage — =SUM(B:B) inclut toujours la colonne masquée B, et copier
une plage copie toujours les valeurs masquées. Pour exclure des cellules d'un total, utilisez
SUBTOTAL(109, ...) ou AGGREGATE (qui ignorent les lignes filtrées, et avec 109 aussi celles
masquées à la main), appliquez un AutoFilter, ou supprimez les données. Masquer, c'est de la
présentation, pas du calcul.
Comment réafficher toutes les colonnes et lignes en VBA ?
Utilisez ws.Cells.EntireColumn.Hidden = False pour réafficher chaque colonne et
ws.Cells.EntireRow.Hidden = False pour réafficher chaque ligne. Comme cela vise la feuille
entière, cela fonctionne quelles que soient les colonnes ou lignes masquées — le secours fiable pour
une feuille où vous ne retrouvez pas les éléments masqués à la main.
Comment masquer des lignes selon la valeur d'une cellule ?
Bouclez sur les lignes et définissez .Hidden à partir d'un test :
ws.Rows(i).Hidden = (ws.Cells(i, "C").Value = "Done"). Comme masquer ne décale pas la grille, une
simple boucle vers le bas convient — inutile de boucler à rebours comme pour une suppression. Partez
d'un état tout-visible pour que les lignes précédemment masquées se réinitialisent.
Pourquoi ma boucle traite-t-elle encore les lignes masquées ?
Parce que masquer une ligne ne la retire pas de l'itération — une boucle For i = 2 To 1000 visite
les lignes masquées et filtrées au même titre que les visibles. Pour n'agir que sur ce qui est à
l'écran, récupérez les cellules visibles avec Range(...).SpecialCells(xlCellTypeVisible) et
parcourez ses .Areas ; un test .Hidden manuel ne peut pas distinguer les lignes masquées par
filtre de celles masquées à la main.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 07/08/2026.
Guides associés : VBA Delete Rows · VBA Insert Rows and Columns · VBA Range · VBA For Loop · VBA Last Row
