TL;DR —
Columns("C").Insertne fait pas apparaître une colonne vierge à partir de rien. Il pousse la colonne C et tout ce qui se trouve à sa droite d'une colonne vers la droite, et Excel réécrit chaque formule qui pointait dans cette zone pour qu'elle retombe sur les mêmes données. Insert est un décalage. Deux règles le maintiennent sûr : opérez sur la colonne entière (Columns(...)ou.EntireColumn, jamais une plage partielle), et insérez plusieurs colonnes en un seul appel plutôt qu'une à une dans une boucle vers l'avant.
Sub InsertMarginColumn()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Report")
ws.Columns("D").Insert CopyOrigin:=xlFormatFromRightOrBelow
ws.Columns("D").ClearFormats ' demarrer la nouvelle colonne propre, pas le style du voisin de gauche
End Sub
Insérer une colonne, supprimer une colonne, et insérer ou supprimer une plage partielle sont une même idée
sous trois habits : toutes décalent physiquement la grille, et tout se décale avec elles — y compris les
références de formule, qui soit suivent les données, soit volent en éclats en #REF!. Les opérations sur
colonne entière se décalent dans une seule direction sans ambiguïté : ce sont donc le cas sûr. Maîtrisez
celle-ci et les deux autres ne sont pour l'essentiel que le même mécanisme visant quelque chose de plus
étroit.
Ce que vous allez apprendre
- Le modèle mental — Insert fait de la place en poussant, pas en effaçant
- La règle unique qui évite les dispositions déchirées — insérez l'
EntireColumn, jamais une plage partielle - Pourquoi vos formules survivent à un insert mais pas vos adresses VBA en dur
- Comment insérer plusieurs colonnes d'un coup, et pourquoi une boucle vers l'avant les éparpille
- La règle
CopyOriginderrière « pourquoi ma nouvelle colonne est-elle déjà mise en forme ? »
Le modèle mental : Insert pousse, il n'efface pas
Columns("C").Insert ne signifie pas « placer une colonne vierge en C ». Cela signifie « faire de la place
en C en poussant tout le monde vers la droite ». La colonne C devient D, D devient E, et ainsi de suite
jusqu'au bord de la feuille. Les anciennes données de la colonne C n'ont pas disparu — elles ont bougé. Une
colonne vierge est simplement l'espace vide laissé au point d'insertion.
Cela compte parce qu'un décalage a des conséquences qu'un effacement n'aurait pas. Quand les données
bougent, Excel déplace les références avec elles : une formule située trois feuilles plus loin qui lisait
=SUM(C2:C100) devient =SUM(D2:D100) à l'instant où vous insérez avant C, parce qu'Excel la maintient
pointée sur les mêmes nombres. C'est la fonctionnalité. Le piège, plus bas, c'est que votre code VBA ne
bénéficie pas du même traitement.
La règle qui compte le plus : insérer l'EntireColumn
Tout insert fiable opère sur une colonne entière :
ws.Columns("C").Insert ' une colonne complete avant C
ws.Range("C:C").EntireColumn.Insert ' identique, ecrit en toutes lettres
La première façon de déchirer une disposition, c'est d'insérer plutôt une plage partielle :
ws.Range("C1:C10").Insert Shift:=xlShiftToRight ' ne decale que 10 cellules vers la droite
Cela pousse dix cellules vers la droite pendant que le reste de la colonne C reste en place — une marche
irrégulière enfoncée au milieu de la grille, avec les lignes 11 et suivantes désormais désalignées par
rapport aux lignes 1 à 10. Cela s'exécute sans erreur et paraît correct jusqu'à ce que quelqu'un fasse
défiler vers le bas. La règle est simple : pour insérer une colonne, nommez une colonne — Columns(...)
ou .EntireColumn. Les inserts de plage partielle sont un vrai outil, mais c'est un autre travail (traité
dans VBA Insert Cells), et y recourir quand vous vouliez « une colonne » est le
bug.
Les références suivent les données — mais pas votre code
Voici l'asymétrie qui surprend. Insérez une colonne avant C, et :
- Les formules de la feuille s'ajustent.
=D5*E5,=VLOOKUP(A2, C:F, 2, 0), la plage source d'un graphique — Excel les réécrit toutes pour qu'elles continuent de pointer sur les mêmes données. Vous n'avez pas à y toucher. - Les adresses en dur dans votre VBA ne s'ajustent pas. Si votre macro exécute plus tard
ws.Range("D5").Value = 100, ce littéral"D5"désigne toujours la cellule en colonne D, ligne 5 — mais après l'insert, c'est une autre cellule que celle à laquelle vous pensiez. La chaîne ignore qu'une colonne est apparue à sa gauche.
Le danger n'est donc pas l'insert lui-même ; c'est le code écrit avant l'insert qui présuppose l'ancienne disposition. Deux parades, par ordre de préférence :
' 1. Capturez ce qui vous importe comme objet AVANT d'inserer - l'objet suit le deplacement
Dim total As Range
Set total = ws.Range("D5")
ws.Columns("C").Insert
total.Value = 100 ' toujours la bonne cellule ; l'objet a suivi le decalage
' 2. Ou trouvez les colonnes par nom d'en-tete APRES l'insertion, jamais par lettre figee
Dim col As Long
col = ws.Rows(1).Find("Amount", LookAt:=xlWhole).Column
Le jugement : considérez toute adresse de cellule littérale comme périmée dès l'instant où vous insérez ou
supprimez à proximité. Conservez les références comme objets Range, ou retrouvez-les par un en-tête que
vous pouvez localiser par son nom.
Insérer plusieurs colonnes en un seul appel
Pour insérer trois colonnes, insérez une plage de trois colonnes :
ws.Columns("C:E").Insert ' trois colonnes apparaissent avant C, en un seul decalage
N'insérez pas une colonne trois fois dans une boucle vers l'avant :
Dim i As Long
For i = 1 To 3
ws.Columns("C").Insert ' FAUX - chaque insert pousse le suivant plus loin
Next i
Chaque Insert renumérote tout ce qui est à sa droite, si bien que le « C » de la deuxième itération n'est
pas là où vous le croyez. Vous obtenez des colonnes éparpillées sur la feuille au lieu d'un bloc net. C'est
le même piège de renumérotation qui fait sauter des colonnes à une suppression dans une boucle vers
l'avant — l'image miroir, traitée dans VBA Delete Column. Insérez le bloc en
une seule instruction, ou si les positions sont calculées et doivent être parcourues en boucle, procédez de
droite à gauche pour que les premiers inserts ne déplacent jamais les cibles suivantes.
CopyOrigin : pourquoi la nouvelle colonne arrive déjà mise en forme
Une colonne fraîchement insérée n'est pas vraiment vierge — par défaut, elle hérite de la mise en forme de
la colonne située à sa gauche (CopyOrigin:=xlFormatFromLeftOrAbove, la valeur par défaut). Si le voisin
de gauche est un total en gras ou une bande ombrée, votre nouvelle colonne « vide » apparaît en gras ou
ombrée. C'est la réponse à « pourquoi ma colonne insérée est-elle déjà stylée ? ».
ws.Columns("D").Insert CopyOrigin:=xlFormatFromRightOrBelow ' heriter plutot du voisin de DROITE
' - ou - prendre la valeur par defaut, puis l'effacer :
ws.Columns("D").Insert
ws.Columns("D").ClearFormats
Choisissez délibérément. Hériter de la gauche est le bon choix quand vous prolongez un bloc mis en forme ; effacer est le bon choix quand vous voulez une colonne réellement neuve. Ce qu'il faut éviter, c'est de s'en remettre à la valeur par défaut et d'être surpris.
Comment ExcelMaster vous aide
Insérer une colonne ressemble à une seule ligne et cache trois décisions — insérer la colonne entière (pas une plage partielle), garder vos références ultérieures valides malgré le décalage, et contrôler de quel voisin la nouvelle colonne hérite la mise en forme — et se tromper sur l'une d'elles échoue en silence : une disposition déchirée, une macro qui écrit désormais dans la mauvaise cellule, ou une colonne en gras égarée.
ExcelMaster vous laisse dire ce
que vous voulez — « insère une colonne de marge après Amount, mise en forme vierge, et garde intacte la
formule des totaux » — et il écrit l'EntireColumn.Insert, trouve la colonne par son en-tête plutôt que par
une lettre figée, règle CopyOrigin (ou efface la mise en forme) en conséquence, et insère un bloc de
plusieurs colonnes en un seul appel quand vous en demandez plusieurs. Vous gardez le classeur et le code.
Questions fréquentes
Comment insérer une colonne en VBA ?
Utilisez Columns("C").Insert pour insérer une colonne complète avant la colonne C. Tout ce qui va de C vers
la droite se décale d'une colonne vers la droite, et les formules de la feuille qui référençaient ces
cellules s'ajustent automatiquement. Préférez la forme qualifiée
ThisWorkbook.Worksheets("Report").Columns("C").Insert pour qu'elle ne dépende pas de la feuille qui se
trouve être active.
Comment insérer plusieurs colonnes d'un coup ?
Insérez une plage de plusieurs colonnes : Columns("C:E").Insert insère trois colonnes avant C en un seul
décalage. Ne bouclez pas trois fois sur Columns("C").Insert — chaque insert renumérote les colonnes qui le
suivent, si bien que les répétitions atterrissent au mauvais endroit. Un seul appel, un seul bloc net.
Pourquoi ma colonne insérée a-t-elle déjà une mise en forme ?
Parce qu'Insert copie par défaut la mise en forme de la colonne située à sa gauche
(CopyOrigin:=xlFormatFromLeftOrAbove). Passez CopyOrigin:=xlFormatFromRightOrBelow pour hériter plutôt de
la droite, ou appelez .ClearFormats sur la nouvelle colonne ensuite pour la rendre réellement vierge.
Mes formules se cassent-elles quand j'insère une colonne ?
Les formules de la feuille ne se cassent pas — Excel réécrit leurs références pour suivre les données à
travers le décalage. Ce qui ne se met pas à jour, c'est une adresse en dur dans votre VBA, comme
Range("D5") : ce littéral pointe toujours sur la colonne D, qui est maintenant une autre cellule. Capturez
les cellules comme objets Range avant l'insert, ou retrouvez-les ensuite par leur nom d'en-tête.
Comment insérer une colonne avant un en-tête précis plutôt qu'une lettre fixe ?
Trouvez l'en-tête, puis insérez sur son EntireColumn :
Rows(1).Find("Amount", LookAt:=xlWhole).EntireColumn.Insert. Cela survit aux changements de disposition,
car cela localise la colonne par ce qu'elle est plutôt que par l'endroit où elle se trouve actuellement.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 15/09/2026.
Guides associés : VBA Delete Column · VBA Insert Cells · VBA Insert Rows · VBA Hide Columns · VBA Column Width
