TL;DR —
Columns("C").Delete, c'estInsertà l'envers : il retire la colonne C et tire tout ce qui est à sa droite d'une colonne vers la gauche. Même décalage, direction opposée — avec une torsion destructrice. Toute formule qui référençait une cellule supprimée n'a plus rien où pointer, elle s'effondre donc en#REF!de façon permanente. Et supprimer à l'intérieur d'une boucle vers l'avant fait sauter des colonnes, parce que chaque suppression renumérote celles qui la suivent. Supprimez de droite à gauche, ou rassemblez les cibles dans unUnionet supprimez une seule fois.
Sub DeleteFlaggedColumns()
Dim ws As Worksheet, c As Long, kill As Range
Set ws = ThisWorkbook.Worksheets("Report")
For c = ws.UsedRange.Columns.Count To 1 Step -1 ' parcourir, ne PAS supprimer en cours de boucle
If ws.Cells(1, c).Value = "" Then
If kill Is Nothing Then Set kill = ws.Columns(c) _
Else Set kill = Union(kill, ws.Columns(c))
End If
Next c
If Not kill Is Nothing Then kill.Delete ' un seul decalage, rien ne se renumerote
End Sub
Supprimer une colonne utilise exactement le même décalage de grille qu'en insérer une — il tire simplement vers la gauche au lieu de pousser vers la droite. Ce qui fait de Delete l'outil le plus tranchant, c'est que le décalage est destructeur : les données partent, et les références qui les visaient se cassent. Deux modes de défaillance expliquent presque tous les bugs de suppression de colonne — références cassées et colonnes sautées — et les deux découlent directement du décalage.
Ce que vous allez apprendre
- Le modèle mental — Delete tire la grille vers la gauche, et les références vers le vide meurent
- Pourquoi vous obtenez
#REF!, et quelles formules survivent au décalage face à celles qui volent en éclats - Le piège de la boucle vers l'avant — pourquoi une boucle de suppression saute des colonnes, et le correctif de droite à gauche
- La suppression par condition avec un seul
Unionpour que rien ne se renumérote en cours de boucle - Quand vous vouliez
ClearContents, pasDelete
Le modèle mental : Delete tire vers la gauche, et le vide emporte les références avec lui
Columns("C").Delete retire la colonne C, puis fait glisser D à la place de C, E à celle de D, et ainsi de
suite. Excel ajuste les références qui survivent — une formule qui lit =SUM(D2:D100) devient
=SUM(C2:C100) parce que ces données se sont déplacées vers la gauche et qu'Excel les a suivies. Cette
partie-là est amicale.
La partie hostile, ce sont les références qui pointaient dans la colonne C elle-même. Une fois C disparue,
une formule comme =C5*A5 ne peut pas se décaler sur du néant — il n'y a aucune cellule où atterrir — elle
devient donc =#REF!*A5 et reste cassée. #REF! n'est pas un pépin passager ; c'est Excel qui vous dit que
la référence a été détruite. Et cela peut frapper sur une feuille que vous ne regardez même pas, car une
formule trois onglets plus loin peut discrètement dépendre de la colonne que vous venez de supprimer.
La règle qui en découle : avant de supprimer une colonne que d'autres formules lisent, décidez de ce qu'il
advient de ces formules — repointez-les, ou convertissez d'abord les dépendantes en valeurs. Supprimez la
colonne à l'aveugle et vous risquez de trouver des #REF! éparpillés dans tout le classeur après que la
macro a « réussi ».
Le piège de la boucle vers l'avant : le bug de suppression numéro un
Vous voulez supprimer les colonnes C, E et G. L'instinct, c'est une boucle vers l'avant :
Dim c As Long
For c = 3 To 7 Step 2
ws.Columns(c).Delete ' FAUX - supprime les mauvaises colonnes
Next c
Observez ce qui se passe. Supprimer la colonne 3 (C) tire tout vers la gauche, si bien que l'ancienne colonne E est maintenant la colonne D, et l'ancienne G est maintenant F. La boucle supprime ensuite la colonne 5 — qui n'est plus E — et au troisième passage, elle supprime ce qui a dérivé jusqu'à la colonne 7. Vous finissez par retirer les mauvaises colonnes et par laisser celles que vous vouliez enlever. La suppression renumérote les colonnes que vous n'avez pas encore atteintes.
Il y a deux correctifs justes, et le second est meilleur :
' Correctif 1 : bouclez de DROITE A GAUCHE pour que les premieres suppressions ne bougent pas les cibles suivantes
For c = 7 To 3 Step -2
ws.Columns(c).Delete
Next c
' Correctif 2 (prefere) : rassemblez dans un Union, supprimez UNE SEULE fois - l'ordre cesse d'importer
Dim kill As Range
Set kill = Union(ws.Columns(3), ws.Columns(5), ws.Columns(7))
kill.Delete
C'est la même maladie que vous soignez déjà en supprimant des lignes — là, vous
bouclez de bas en haut pour exactement cette raison. Ici l'axe est horizontal, c'est donc de droite à gauche.
L'approche Union contourne entièrement la question de la direction et est nettement plus rapide : une
suppression déclenche un décalage et un recalcul, tandis que N suppressions séparées en déclenchent N de
chaque.
Supprimer par condition : rassembler, puis supprimer une seule fois
Le motif Union brille quand vous supprimez des colonnes selon une règle — chaque colonne à en-tête vide, chaque colonne dont le titre figure dans une liste, chaque colonne vide. La discipline, c'est : parcourez et rassemblez, ne supprimez jamais à l'intérieur du parcours.
Sub DeleteEmptyColumns()
Dim ws As Worksheet, c As Long, kill As Range
Set ws = ThisWorkbook.Worksheets("Data")
For c = 1 To ws.UsedRange.Columns.Count
If Application.WorksheetFunction.CountA(ws.Columns(c)) = 0 Then
If kill Is Nothing Then Set kill = ws.Columns(c) _
Else Set kill = Union(kill, ws.Columns(c))
End If
Next c
If Not kill Is Nothing Then kill.Delete
End Sub
Comme la suppression a lieu après la boucle, le parcours peut se faire dans n'importe quel sens — rien ne se
renumérote pendant que vous décidez encore. Testez Not kill Is Nothing avant d'appeler .Delete, sinon un
ensemble de correspondances vide déclenche l'erreur d'exécution 91 (« Object variable not set »).
Delete face à ClearContents : sachez lequel vous vouliez
La source la plus fréquente de #REF! accidentel, c'est de recourir à Delete quand vous vouliez seulement
faire disparaître les données :
Columns("C").Deleteretire la structure de la colonne et décale tout vers la gauche. Les références qui pointaient dedans se cassent ; la disposition des colonnes de la feuille change.Columns("C").ClearContentsvide les cellules et ne décale rien. Les formules qui lisent la colonne C voient désormais des blancs (ou des zéros), la disposition est intacte, et aucune référence ne se casse.
Si une formule en aval, un graphique, un tableau ListObject ou une plage nommée dépend de l'existence de
cette colonne, c'est ClearContents qu'il vous faut. Réservez Delete aux cas où la colonne ne devrait
vraiment pas être là. Et quand une colonne appartient à un tableau, supprimez-la via le tableau —
ws.ListObjects("Sales").ListColumns("Tax").Delete — plutôt que par Columns(...).Delete, qui contrarie la
structure propre du tableau.
Comment ExcelMaster vous aide
Supprimer une colonne paraît trivial et cache trois pièges — des références qui se cassent en #REF! sur des
feuilles que vous ne surveillez pas, une boucle qui se renumérote elle-même et supprime les mauvaises
colonnes, et le choix entre Delete et Clear qui décide si votre disposition survit.
ExcelMaster vous laisse dire ce
que vous voulez — « supprime toute colonne sans en-tête, garde les totaux intacts » — et il rassemble les
correspondances dans un seul Union, les supprime en un seul décalage pour que rien ne se renumérote, vous
avertit quand une suppression casserait une formule ailleurs, et utilise ClearContents quand vous vouliez
« vider » plutôt que « retirer ». Vous gardez le classeur et le code.
Questions fréquentes
Comment supprimer une colonne en VBA ?
Utilisez Columns("C").Delete pour retirer la colonne C ; chaque colonne à sa droite se décale d'un cran
vers la gauche. Qualifiez-le — ThisWorkbook.Worksheets("Report").Columns("C").Delete — pour qu'il n'agisse
pas sur la feuille qui se trouve être active. Columns("C:E").Delete retire trois colonnes adjacentes en un
seul appel.
Pourquoi ai-je #REF! après avoir supprimé une colonne ?
Parce qu'une formule référençait une cellule dans la colonne supprimée, et une fois cette colonne disparue,
la référence n'a plus rien où pointer : elle devient #REF! de façon permanente. Les formules qui
référençaient des colonnes à droite de la suppression vont bien — Excel les décale vers la gauche avec les
données. Seules les références dans la plage supprimée se cassent. Vérifiez aussi les autres feuilles ; la
formule cassée n'est pas forcément là où vous avez supprimé.
Pourquoi ma boucle de suppression saute-t-elle des colonnes ?
Parce que supprimer une colonne renumérote toutes les colonnes qui la suivent : une boucle vers l'avant
For c = 1 To n dépasse donc des colonnes qui ont glissé dans un emplacement déjà franchi. Bouclez de droite
à gauche (For c = n To 1 Step -1), ou — mieux — rassemblez les colonnes cibles dans un Union et appelez
.Delete une seule fois, ce qui les retire en un seul décalage quel que soit l'ordre.
Comment supprimer plusieurs colonnes d'un coup ?
Pour des colonnes adjacentes, Columns("C:E").Delete. Pour des colonnes éparpillées, construisez un Union
— Union(Columns(3), Columns(5), Columns(7)).Delete — pour qu'elles partent toutes en un seul décalage.
C'est à la fois juste (aucune renumérotation) et bien plus rapide que de les supprimer une à une.
Quelle est la différence entre Delete et ClearContents pour une colonne ?
Delete retire la colonne et décale le reste vers la gauche, ce qui peut casser des références et modifier
votre disposition. ClearContents vide les cellules et ne décale rien, laissant la structure et chaque
référence intactes. Si quoi que ce soit en aval dépend de l'existence de la colonne, utilisez ClearContents.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 15/09/2026.
Guides associés : VBA Insert Column · VBA Insert Cells · VBA Delete Rows · VBA Hide Columns · VBA SpecialCells
