🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA masquer des colonnes et des lignes dans Excel — masquer n'est pas supprimer (et pourquoi vos totaux ne changent pas)

|

VBA masquer des colonnes et des lignes dans Excel — masquer n'est pas supprimer (et pourquoi vos totaux ne changent pas)

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 = True appartient à .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 ou SUBTOTAL — 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 .Hidden appartient à .EntireColumn et .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, ...) ou AGGREGATE — ceux-là ignorent bel et bien les lignes masquées par un filtre (et SUBTOTAL(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