TL;DR — Pour déplacer une ligne sans effacer de données, vous la coupez puis vous l'insérez — vous ne la collez pas.
Rows(5).Cut Destination:=Rows(20)dépose la ligne par-dessus la ligne 20 et écrase ce qui s'y trouvait.Rows(5).Cutsuivi deRows(20).Insertouvre un espace en ligne 20, y dépose la ligne, et referme le trou d'où elle venait — rien n'est détruit. Un déplacement est un décalage, alors attention au piège : quand vous déplacez une ligne vers le bas, le trou qu'elle laisse tire toutes les lignes en dessous — y compris votre cible — d'un cran vers le haut.
Sub MoveRow()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Data")
ws.Rows(5).Cut ' ramasser la ligne (bordure clignotante), source pas encore vide
ws.Rows(20).Insert Shift:=xlDown ' INSERER la ligne coupee avant la ligne 20, le reste se decale vers le bas
Application.CutCopyMode = False ' liberer le presse-papiers une fois termine
End Sub
Déplacer des lignes, déplacer des colonnes et le verbe Cut qui les sous-tend ne sont qu'une seule idée :
vous ramassez des données puis vous choisissez comment les reposer. Insert ouvre un espace par décalage et
préserve tout ; Paste atterrit par-dessus et écrase. Maîtrisez le cas des lignes — couper, insérer,
surveiller le décalage — et déplacer des colonnes n'est que le même geste tourné de 90 degrés, bâti sur le
même Range.Cut.
Ce que vous allez apprendre
- Le modèle mental — déplacer, c'est couper et insérer (ouvrir un espace), pas coller
- Le bug numéro un —
Cut Destination:=et le collage écrasent la cible et perdent des données - Pourquoi déplacer une ligne vers le bas renumérote tout ce qui se trouve sous la source, si bien que la cible remonte d'un cran
- Comment déplacer plusieurs lignes d'un coup sans qu'elles atterrissent dans le mauvais ordre (procéder de bas en haut)
- Pourquoi les références de formule suivent une ligne coupée au lieu de virer en
#REF!comme à une suppression
Le modèle mental : un déplacement est un décalage, pas un collage
Deux gestes se cachent dans « déplacer cette ligne ». D'abord vous la ramassez — Rows(5).Cut place la
ligne dans le presse-papiers en mode couper (la bordure clignotante). Ensuite vous la reposez, et c'est
là que commence chaque histoire de perte de données, car il existe deux façons complètement différentes de le
faire :
- La coller (
Cut Destination:=Rows(20), ou un.Cutpuis.Pastemanuel) dépose la ligne par-dessus la ligne 20. L'ancien contenu de la ligne 20 disparaît, en silence, sans le moindre avertissement. - L'insérer (
Rows(5).CutpuisRows(20).Insert) ouvre un espace neuf en ligne 20, y dépose la ligne coupée, et referme le trou en ligne 5. Tout le reste glisse pour faire de la place. Rien n'est perdu.
Déplacer une ligne, c'est toujours le second geste. C'est le même décalage que vous connaissez déjà de l'insertion et de la suppression de lignes : la grille s'ouvre et se referme physiquement, et tout ce qui est sous la modification se renumérote. Retenez-le — tout l'article découle de « un déplacement est un décalage ».
Le bug numéro un : coller par-dessus écrase la cible
Ceci a l'air de déplacer une ligne, et c'est la façon la plus courante de détruire des données dans une macro :
ws.Rows(5).Cut Destination:=ws.Rows(20) ' FAUX pour un deplacement - ceci COLLE sur la ligne 20
Cut Destination:= est un collage. Il copie les cellules de la ligne 5 sur la ligne 20, écrase les données
de la ligne 20, puis vide la ligne 5. Si la ligne 20 contenait quoi que ce soit, c'est perdu. C'est
acceptable quand la ligne 20 est un espace de travail réellement vide, mais c'est un désastre quand vous
vouliez « glisser cette ligne entre les autres ».
Le déplacement qui préserve vos données, c'est couper, puis Insert :
ws.Rows(5).Cut ' la ramasser
ws.Rows(20).Insert Shift:=xlDown ' BON - ouvrir un espace, l'y deposer, rien d'ecrase
Quand le presse-papiers contient des cellules coupées, .Insert réalise une insertion de cellules coupées
— il fait de la place au lieu d'atterrir par-dessus. La règle est sans détour : pour déplacer, insérez ce
que vous avez coupé ; ne le collez jamais. Ne recourez à Cut Destination:= que lorsque vous voulez
réellement écraser une cible vide.
Le piège du décalage : déplacer vers le bas renumérote votre cible
Voici la surprise qui remplit les forums d'entraide — « j'ai coupé une ligne, je l'ai insérée plus bas, et toutes mes données ont remonté ». Ce n'est pas un bug ; c'est le décalage qui reste cohérent.
La coupe et l'insertion ne forment qu'une seule opération. Quand vous déplacez la ligne 5 vers la ligne 20,
le trou en ligne 5 se referme dans le même mouvement, si bien que les lignes 6 à 20 glissent chacune d'un
cran vers le haut — et la ligne qui était en 20 se retrouve en 19. Votre ligne atterrit par rapport à la
grille décalée, pas aux numéros de ligne que vous aviez en tête en écrivant 20.
Le correctif consiste à cesser de déplacer par numéros de ligne figés, car ces numéros bougent sous vos pieds. Repérez le point de repère par sa valeur et insérez par rapport à lui, pour que le décalage ne puisse pas vous tromper :
Dim target As Range
Set target = ws.Columns("A").Find("Subtotal", LookAt:=xlWhole) ' trouver OU, pas un numero
ws.Rows(5).Cut
target.EntireRow.Insert Shift:=xlDown ' insere au-dessus de la vraie ligne "Subtotal", decalage ou pas
Application.CutCopyMode = False
Si vous devez utiliser des numéros, souvenez-vous du sens : déplacer vers le haut (source sous la cible) laisse le numéro de la cible intact ; déplacer vers le bas (source au-dessus de la cible) remonte la cible d'un cran. Dans le doute, insérez au-dessus d'un point de repère trouvé par recherche.
Déplacer plusieurs lignes : de bas en haut
Déplacez les lignes une à une dans une boucle vers l'avant et chaque déplacement renumérote celles que vous n'avez pas encore touchées, si bien que le deuxième déplacement attrape la mauvaise ligne. C'est la même discipline que supprimer des lignes dans une boucle — procédez de bas en haut pour que les décalages se produisent sous votre curseur, là où ils ne peuvent pas perturber les lignes qu'il vous reste à déplacer :
Dim i As Long
For i = lastRow To firstRow Step -1 ' de bas en haut : les decalages tombent en dessous, pas au-dessus
If ws.Cells(i, "D").Value = "Archive" Then
ws.Rows(i).Cut
ws.Rows(archiveTop).Insert Shift:=xlDown
End If
Next i
Application.CutCopyMode = False
Pour un bloc contigu, déplacez-le en une seule fois — ws.Rows("5:9").Cut puis un unique .Insert — plutôt
que de boucler cinq fois et de lutter contre cinq décalages. Une coupe, une insertion, aucune surprise de
renumérotation en pleine boucle.
Couper déplace les références ; supprimer les casse
Il y a une raison de plus pour laquelle Cut + Insert est le déplacement sûr : Excel le suit. Une
formule ailleurs qui lit =Data!B5 est réécrite pour pointer sur le nouveau domicile de la ligne après le
déplacement, si bien qu'elle continue de lire les mêmes données. C'est l'inverse de la suppression d'une
ligne, où une formule qui pointe dans la ligne supprimée s'effondre en =#REF!
et reste cassée. Un déplacement relocalise les données et emporte ses références avec elles ; une suppression
détruit les données et les laisse orphelines. Quand votre objectif est « les mêmes chiffres, à un autre
endroit », c'est exactement le comportement que vous voulez.
Comment ExcelMaster vous aide
Déplacer une ligne, c'est trois décisions déguisées en une seule ligne — insérer plutôt que coller (données conservées ou détruites), dans quel sens court le décalage (et si votre numéro de cible veut encore dire ce que vous croyez), et s'il faut déplacer un bloc en un seul appel ou boucler de bas en haut — et se tromper sur n'importe laquelle échoue en silence : une ligne cible écrasée sans bruit, des lignes qui atterrissent à un cran près, ou une demi-boucle déplacée dans les mauvais emplacements.
ExcelMaster vous laisse dire ce que vous voulez — « déplace chaque ligne Archive en haut du bloc d'archives, en conservant les données déjà présentes » — et il coupe et insère au lieu de coller, repère le point de repère par sa valeur pour que le décalage ne le trompe pas, et boucle de bas en haut quand il y en a plusieurs. Vous gardez le classeur et le code.
Questions fréquentes
Comment déplacer une ligne en VBA sans écraser de données ?
Coupez la ligne puis insérez-la, ne la collez pas : ws.Rows(5).Cut suivi de
ws.Rows(20).Insert Shift:=xlDown. L'Insert ouvre un espace à la destination et décale les autres lignes
vers le bas, si bien que rien n'est écrasé. Rows(5).Cut Destination:=Rows(20) colle par-dessus la ligne 20
et détruit son contenu — n'utilisez cela que lorsque la cible est vide.
Pourquoi mes données remontent-elles après avoir coupé et inséré une ligne ?
Parce que le déplacement est un décalage unique. Quand vous coupez une ligne et l'insérez plus bas, le trou qu'elle laisse se referme dans la même opération, si bien que chaque ligne sous la source — y compris celle que vous visiez — glisse d'un cran vers le haut. Insérez par rapport à un point de repère trouvé par sa valeur plutôt que par un numéro de ligne figé, et le décalage cesse d'avoir de l'importance.
Comment déplacer plusieurs lignes d'un coup en VBA ?
Pour un bloc contigu, coupez toute la plage et insérez une seule fois : ws.Rows("5:9").Cut puis .Insert.
Pour des lignes éparses sélectionnées par une condition, bouclez de la dernière ligne vers la première
(Step -1) pour que chaque déplacement décale les lignes sous votre position, jamais celles qu'il vous
reste à déplacer.
Comment déplacer une ligne vers une autre feuille ?
Coupez la ligne et insérez-la sur l'autre feuille : ThisWorkbook.Worksheets("Data").Rows(5).Cut puis
ThisWorkbook.Worksheets("Archive").Rows(2).Insert Shift:=xlDown. C'est le même couper-insérer ; seule la
feuille de destination change. Qualifiez les deux feuilles pour que la macro ne dépende pas de celle qui se
trouve être active.
Quelle est la différence entre Cut et Copy pour déplacer une ligne ?
Cut déplace — il vide la source une fois la ligne posée, si bien que vous terminez avec un seul exemplaire.
Copy duplique — la source reste, et il vous faudrait la supprimer vous-même, ce qui est facile à rater.
Pour déplacer une ligne, utilisez Cut ; voyez VBA Cut pour la mécanique complète.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 17/09/2026.
Guides associés : VBA Cut · VBA Move Columns · VBA Insert Rows · VBA Delete Rows · VBA Copy Paste
