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").CutpuisColumns("F").Insertouvre 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").CutpuisColumns("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 où 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
