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

VBA Move Rows dans Excel — couper et insérer sans écraser (pas couper-coller)

|

VBA Move Rows dans Excel — couper et insérer sans écraser (pas couper-coller)

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).Cut suivi de Rows(20).Insert ouvre 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 ramassezRows(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 .Cut puis .Paste manuel) 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).Cut puis Rows(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