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

VBA Move Columns dans Excel — repositionner des colonnes avec couper et insérer (EntireColumn)

|

VBA Move Columns dans Excel — repositionner des colonnes avec couper et insérer (EntireColumn)

TL;DR — Déplacer une colonne, c'est déplacer une ligne sur l'autre axe : coupez la colonne entière et insérez-la, ne la collez pas. Columns("C").Cut Destination:=Columns("F") colle par-dessus la colonne F et l'efface. Columns("C").Cut puis Columns("F").Insert ouvre un espace avant F, y dépose la colonne, et referme le trou en C — rien n'est perdu. Deux règles gardent l'opération propre : coupez l'EntireColumn (jamais une plage partielle), et souvenez-vous qu'un déplacement est un décalage, si bien que couper une colonne à gauche de votre cible tire la cible d'une colonne vers la gauche.

Sub MoveColumn()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Report")
    ws.Columns("C").Cut                       ' ramasser la colonne entiere
    ws.Columns("F").Insert Shift:=xlToRight    ' INSERER avant la colonne F, le reste se decale vers la droite
    Application.CutCopyMode = False
End Sub

Déplacer une colonne, c'est le jumeau horizontal de déplacer une ligne, piloté par le même Range.Cut. Tout ce que vous savez du cas des lignes se transpose — insérer au lieu de coller, surveiller le décalage, déplacer un bloc en un seul appel — vous coupez simplement des colonnes et elles glissent latéralement au lieu de descendre.

Ce que vous allez apprendre

  • Pourquoi vous coupez l'EntireColumn, et ce qui arrive si vous coupez une plage partielle par erreur
  • Le bug numéro un — Cut Destination:= colle par-dessus la colonne cible et perd ses données
  • Pourquoi déplacer une colonne vers la droite décale votre colonne cible d'un cran vers la gauche (le même piège du décalage, à l'horizontale)
  • Comment réordonner plusieurs colonnes selon une disposition figée sans qu'elles atterrissent dans le mauvais ordre
  • Pourquoi les références suivent une colonne déplacée au lieu de virer en #REF!

Le modèle mental : couper la colonne entière, puis insérer

Un déplacement de colonne, ce sont deux gestes, exactement comme un déplacement de ligne. Vous ramassez la colonne avec Columns("C").Cut, puis vous la reposez — et le choix entre coller et insérer est tout l'enjeu :

  • Coller (Cut Destination:=Columns("F")) dépose les cellules de la colonne C par-dessus la colonne F et écrase tout ce que F contenait.
  • Insérer (Columns("C").Cut puis Columns("F").Insert) ouvre un espace avant la colonne F, y glisse la colonne coupée, et referme le trou en C. Les autres colonnes glissent vers la droite pour faire de la place.

Pour déplacer une colonne dans une disposition, vous insérez toujours. Coller sert à écraser une colonne vide, pas à réarranger. C'est déplacer des lignes tourné de 90 degrés : la grille s'ouvre et se referme à l'horizontale, et les colonnes à droite se renumérotent.

Couper l'EntireColumn, pas une plage partielle

Un déplacement de colonne n'a de sens que sur des colonnes entières. Coupez une plage partielle et tentez de l'insérer comme une colonne, et soit vous déchirez la grille, soit vous n'obtenez rien d'utile :

ws.Range("C1:C50").Cut                        ' FAUX - une plage partielle, pas la colonne
ws.Range("F1:F50").Insert Shift:=xlToRight     ' ne decale que 50 lignes ; la ligne 51 et suivantes sont desormais desalignees

Cela décale cinquante cellules latéralement et laisse le reste de la colonne F là où il était — les données sous la ligne 50 ne s'alignent plus avec les lignes auxquelles elles appartiennent. Déplacez la colonne entière pour que chaque ligne voyage ensemble :

ws.Columns("C").Cut                            ' BON - la colonne entiere, toutes les lignes au pas
ws.Columns("F").Insert Shift:=xlToRight

Quand vous localisez la colonne par son en-tête plutôt que par une lettre, résolvez-la tout de même vers la colonne entière avec .EntireColumn :

Dim col As Range
Set col = ws.Rows(1).Find("Region", LookAt:=xlWhole)   ' trouver la cellule d'en-tete
col.EntireColumn.Cut                                    ' couper la colonne ENTIERE qui la contient
ws.Columns("B").Insert Shift:=xlToRight

Cela reflète la règle de l'insertion de colonne : les opérations structurelles sur colonne agissent sur Columns / .EntireColumn, jamais sur une plage partielle.

Le piège du décalage, à l'horizontale : déplacer vers la droite décale votre cible vers la gauche

Le même décalage qui renumérote les lignes renumérote les colonnes. Coupez la colonne C et insérez-la en colonne F, et le trou en C se referme dans le même mouvement, si bien que les colonnes D à F glissent chacune d'un cran vers la gauche — la colonne qui était en F est maintenant en E, et votre colonne coupée atterrit par rapport à la grille décalée.

Déplacez par recherche d'en-tête, pas par lettres de colonne, et le décalage ne peut pas vous mordre, car Find localise se trouve la colonne une fois que tout s'est stabilisé :

ws.Columns("C").Cut
ws.Rows(1).Find("Total", LookAt:=xlWhole).EntireColumn.Insert Shift:=xlToRight
Application.CutCopyMode = False

Si vous tenez aux lettres, déplacer une colonne vers la gauche (source à droite de la cible) laisse la lettre de la cible intacte ; la déplacer vers la droite (source à gauche) décale la cible d'une colonne plus tôt.

Réordonner plusieurs colonnes selon une disposition figée

Réordonner les colonnes un Cut/Insert à la fois, c'est là que les dispositions se brouillent : chaque déplacement rebat les lettres des colonnes que vous n'avez pas encore placées. Le schéma fiable consiste à cesser de courir après des lettres mouvantes et à placer chaque colonne par nom d'en-tête selon l'ordre voulu, en travaillant de gauche à droite pour que chaque colonne placée devienne un point d'ancrage stable pour la suivante :

Dim wanted As Variant, k As Long
wanted = Array("Date", "Region", "Product", "Amount")   ' l'ordre voulu, de gauche a droite
For k = LBound(wanted) To UBound(wanted)
    Dim src As Range
    Set src = ws.Rows(1).Find(wanted(k), LookAt:=xlWhole)
    If Not src Is Nothing Then
        src.EntireColumn.Cut
        ws.Columns(k + 1).Insert Shift:=xlToRight        ' la placer dans l'emplacement k+1, puis passer a la suite
    End If
Next k
Application.CutCopyMode = False

Parce que chaque étape vise un numéro d'emplacement fixe et trouve la source par son nom, les lettres qui se décalent ne font jamais dérailler la disposition.

Couper déplace les références ; supprimer les casse

Comme pour les lignes, Cut + Insert est sûr parce qu'Excel le suit. Une formule qui lit =Report!C2 est réécrite pour suivre la colonne C jusqu'à sa nouvelle position, si bien qu'elle continue de lire les mêmes données après le déplacement. C'est l'inverse de la suppression d'une colonne, où une formule qui pointe dans la colonne retirée s'effondre en =#REF!. Déplacer relocalise les données et emporte ses références avec elles ; supprimer détruit les données et les laisse orphelines.

Comment ExcelMaster vous aide

Réordonner des colonnes cache les mêmes trois pièges que les lignes, à l'horizontale — insérer plutôt que coller (données conservées ou détruites), le décalage qui renumérote les colonnes que vous n'avez pas encore placées, et couper la colonne entière plutôt qu'une plage partielle — et chacun échoue sans erreur : une colonne cible écrasée en silence, une disposition brouillée à une lettre près, ou une demi-colonne laissée désalignée sous la ligne 50.

ExcelMaster vous laisse dire la disposition que vous voulez — « mets les colonnes dans l'ordre Date, Region, Product, Amount » — et il coupe chaque colonne entière, la trouve par son en-tête pour que les lettres qui se décalent ne puissent pas le tromper, et l'insère à sa place au lieu de coller par-dessus ce qui s'y trouve. Vous gardez le classeur et le code.

Questions fréquentes

Comment déplacer une colonne en VBA sans perdre de données ?

Coupez la colonne entière et insérez-la : ws.Columns("C").Cut puis ws.Columns("F").Insert Shift:=xlToRight. L'Insert ouvre un espace et décale les autres colonnes vers la droite, si bien que rien n'est écrasé. Columns("C").Cut Destination:=Columns("F") colle par-dessus la colonne F et la détruit — ne l'utilisez que lorsque F est vide.

Pourquoi mes colonnes se décalent-elles quand j'en déplace une ?

Parce qu'un déplacement est un décalage. Couper la colonne C la retire et referme le trou, si bien que les colonnes à sa droite glissent d'un cran vers la gauche avant que votre colonne coupée soit insérée — la cible que vous aviez nommée par sa lettre est maintenant une colonne plus tôt. Insérez par rapport à un en-tête trouvé avec Find, pas une lettre figée, et le décalage cesse d'avoir de l'importance.

Comment réordonner des colonnes selon un ordre précis en VBA ?

Trouvez chaque colonne par son nom d'en-tête et insérez-la dans un emplacement fixe, en travaillant de gauche à droite : Rows(1).Find("Region").EntireColumn.Cut puis Columns(2).Insert, et ainsi de suite. Viser un numéro d'emplacement stable tout en localisant la source par son nom fait que les lettres qui se décalent ne brouillent jamais la disposition.

Puis-je déplacer une plage de colonne partielle plutôt que la colonne entière ?

Vous le pouvez, mais cela désaligne vos données : couper Range("C1:C50") et l'insérer ne décale que ces cinquante cellules latéralement et laisse le reste de la grille en arrière, si bien que les lignes sous la 50 ne s'alignent plus. Pour un vrai déplacement de colonne, coupez Columns("C") ou .EntireColumn pour que chaque ligne voyage ensemble.

Faut-il utiliser Cut ou Copy pour déplacer une colonne ?

Utilisez Cut. Il vide la colonne source une fois la colonne posée, si bien que vous terminez avec un seul exemplaire à la nouvelle position. Copy laisse la source en place, et il vous faudrait la supprimer vous-même — une étape de plus, facile à rater. Voyez VBA Cut pour la mécanique complète du déplacement face à la duplication.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 17/09/2026.

Guides associés : VBA Move Rows · VBA Cut · VBA Insert Columns · VBA Delete Columns · VBA Copy Paste