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

VBA insérer des lignes et des colonnes dans Excel — décaler la grille dans le bon sens (et insérer dans une boucle sans chaos)

|

VBA insérer des lignes et des colonnes dans Excel — décaler la grille dans le bon sens (et insérer dans une boucle sans chaos)

En bref — Insérer est l'image miroir de supprimer. .EntireRow.Insert ne fait pas surgir de l'espace vide à partir de rien — il pousse chaque ligne existante vers le bas pour ouvrir un trou, exactement comme la suppression les fait remonter. Le même problème de grille-qui-bouge-sous-vos-pieds s'applique donc : insérez dans une boucle vers le bas et les lignes que vous n'avez pas encore atteintes ne cessent de s'éloigner. Insérez une ligne entière avec .EntireRow.Insert ; sur une plage partielle, nommez le sens avec Shift:=xlDown (ou xlToRight) ; contrôlez de quel voisin la nouvelle ligne copie le format avec CopyOrigin ; et pour ajouter de nombreuses lignes, insérez une plage multi-lignes en un seul appel plutôt que de boucler.

' Insérer une ligne vide AU-DESSUS de la ligne 5, en poussant 5, 6, 7... d'un cran vers le bas.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Data")

ws.Rows(5).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Une fois que vous avez rencontré le piège de la suppression de lignes — une boucle vers le bas qui saute des lignes parce que supprimer fait remonter la grille —, insérer ne réserve aucune surprise, car c'est la même idée dans l'autre sens. Insérer pousse la grille vers le bas. Tout ce qui rendait la suppression subtile (les numéros bougent, ligne entière contre partielle, une seule fois contre en boucle) a un exact équivalent côté insertion. Ce guide les parcourt dans ce miroir, de sorte que le modèle que vous possédez déjà fait l'essentiel du travail.

Ce que vous allez apprendre

  • Le modèle mental — insérer pousse la grille vers le bas, cela ne remplit pas un espace vide
  • L'insertion d'une ligne entière face à une plage partielle, et pourquoi Shift décide du sens
  • CopyOrigin — de quel voisin la ligne ou la colonne insérée hérite le format
  • Insérer dans une boucle sans retraiter vos propres nouvelles lignes
  • La méthode en un seul appel pour insérer de nombreuses lignes d'un coup

Le modèle mental : insérer pousse la grille vers le bas

De même que supprimer une ligne la retire et referme le trou, insérer une ligne ouvre un trou et pousse tout vers le bas pour faire de la place. ws.Rows(5).EntireRow.Insert n'écrit pas dans la ligne 5 — il crée une toute nouvelle ligne 5 vide, l'ancienne ligne 5 devient la 6, l'ancienne 6 devient la 7, et ainsi de suite jusqu'au bas de la plage utilisée. La nouvelle ligne apparaît ; chaque ligne existante située sous le point d'insertion descend d'un cran.

C'est le seul fait à retenir, car il est à l'origine à la fois du comportement quotidien et du piège de la boucle. Insérer « au-dessus de la ligne 5 » revient en réalité à dire « fais de la place en 5 et fais glisser le reste vers le bas ». Les colonnes fonctionnent de la même façon à l'horizontale : Columns("C").Insert ouvre une nouvelle colonne C et pousse D, E, F vers la droite. La grille est élastique, et Insert l'étire — ce qui signifie que l'adresse de tout ce qui se trouve en dessous (ou à droite) du point d'insertion vient de changer.

La règle pour les plages partielles : nommez le sens avec Shift

Quand vous insérez une ligne ou une colonne entière, aucune ambiguïté — une ligne entière ne peut aller que vers le bas, une colonne entière ne peut aller que vers la droite. Mais insérez une plage partielle et Excel doit deviner dans quel sens pousser les voisins, et sa supposition se fonde sur la forme de la plage :

ws.Range("B5:D5").Insert Shift:=xlDown      ' pousser B:D vers le bas, laisser les colonnes A et E tranquilles
ws.Range("B5:B8").Insert Shift:=xlToRight   ' pousser ces cellules vers la droite

Omettez Shift sur une plage partielle et Excel choisit un sens selon que le bloc est plus large que haut — une règle que personne ne retient, et voilà comment vous vous retrouvez avec des cellules poussées sur le côté alors que vous les vouliez vers le bas. Dès que la plage n'est pas une ligne ou une colonne entière, indiquez Shift explicitement. Et la plupart du temps, vous ne voulez pas d'insertion partielle du tout : décaler un sous-bloc de cellules désaligne chaque colonne qu'il n'inclut pas, la même corruption que provoque la suppression d'une seule cellule. Optez pour .EntireRow.Insert / .EntireColumn.Insert sauf si vous voulez réellement déplacer un bloc :

ws.Rows(5).EntireRow.Insert          ' ligne entière - chaque colonne reste alignée
ws.Columns("C").EntireColumn.Insert  ' colonne entière - chaque ligne reste alignée

La règle qui surprend : CopyOrigin décide du format

Une ligne fraîchement insérée n'est pas vierge de mise en forme — Excel copie l'apparence d'un voisin, et CopyOrigin choisit lequel. Par défaut, c'est xlFormatFromLeftOrAbove, donc une nouvelle ligne hérite du format de la ligne située au-dessus d'elle. En général, cela convient — jusqu'à ce que la ligne du dessus soit un en-tête en gras et ombré, et votre nouvelle ligne de données arrive elle aussi habillée en en-tête :

' La nouvelle ligne copie le format de la ligne DU DESSOUS au lieu de l'en-tête au-dessus.
ws.Rows(2).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow

xlFormatFromRightOrBelow indique à Excel de prendre la mise en forme de la ligne située sous le point d'insertion — exactement ce que vous voulez quand vous insérez une ligne de données juste sous un en-tête. C'est un petit paramètre au résultat bien visible : mal réglé, chaque ligne insérée porte le mauvais habit ; bien réglé, les insertions ont l'air natives. Si vous voulez une ligne vraiment vierge, insérez d'abord, puis effacez explicitement les formats avec .ClearFormats.

Le piège de la boucle, en miroir : insérez à rebours, sinon vous retraitez vos propres lignes

Insérer dans une boucle présente le même danger que supprimer dans une boucle, pointé dans le sens inverse. Supposons que vous parcouriez vers le bas en insérant une ligne de séparation vide après chaque ligne "Total". Insérez en avançant vers le bas et la nouvelle ligne pousse vos lignes non parcourues encore plus bas — et selon la façon dont vous progressez, la boucle peut tomber droit sur la ligne qu'elle vient de créer et insérer encore, et encore. La grille grandit sous vos pieds.

Le correctif propre est le même que pour la suppression : bouclez de bas en haut, pour que chaque insertion se produise sous les lignes qu'il vous reste à visiter et ne perturbe jamais leurs numéros :

Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

For i = lastRow To 2 Step -1
    If ws.Cells(i, "A").Value = "Total" Then
        ws.Rows(i + 1).EntireRow.Insert Shift:=xlDown   ' insérer en dessous ; les lignes du dessus ne bougent pas
    End If
Next i

En sens inverse, chaque ligne insérée atterrit sous des cellules que vous avez déjà traitées, si bien que les lignes encore en attente conservent leur adresse. C'est exactement la discipline de VBA Delete Rows — quand une boucle modifie le nombre de lignes, parcourez-la en Step -1.

Insérer de nombreuses lignes d'un coup : redimensionnez, ne répétez pas

Appeler .Insert cent fois pour ajouter cent lignes est lent — chaque appel restructure la grille et recalcule. Pour insérer n lignes contiguës, insérez une plage de n lignes en une seule opération. Saisissez la ligne cible, redimensionnez-la à la hauteur voulue avec .Resize(n), et insérez-la :

' Insérer 5 lignes vides au-dessus de la ligne 10 en un seul appel.
ws.Rows(10).Resize(5).EntireRow.Insert Shift:=xlDown

Rows(10).Resize(5), ce sont les lignes 10 à 14 ; insérer ce bloc ouvre cinq lignes d'un coup et pousse le reste vers le bas ensemble. Un seul changement structurel au lieu de cinq. Pour des insertions éparpillées sur une grande feuille, le schéma le plus rapide consiste souvent à ajouter une colonne d'appoint, à trier ou filtrer pour regrouper les lignes, puis à insérer en masse — le même principe « faire la modification structurelle une seule fois » qui rend les suppressions en masse rapides. Enveloppez les grosses insertions dans Application.ScreenUpdating = False et un calcul manuel, et elles se terminent instantanément.

Comment ExcelMaster aide

Le code d'insertion échoue de manière discrète et cosmétique : une plage partielle poussée dans le mauvais sens parce que Shift a été omis, de nouvelles lignes portant le gras d'un en-tête, une boucle vers le bas qui insère dans sa propre sortie, une centaine d'insertions séparées qui font ramer un rapport. Chacune ressemble à « l'insertion n'a pas tout à fait marché » plutôt qu'à une vraie erreur.

ExcelMaster vous laisse dire ce que vous voulez — « ajoute une ligne vide après chaque sous-total », « insère trois lignes au-dessus du récapitulatif », « place une nouvelle colonne entre C et D ». Il écrit .EntireRow.Insert (ou .EntireColumn.Insert) avec les bons Shift et CopyOrigin, boucle dans le bon sens, regroupe les insertions multi-lignes en un seul appel et sauvegarde d'abord la feuille. Vous gardez le classeur et le code ; vous vous épargnez les devinettes sur le sens dans lequel la grille va bouger.

Questions fréquentes

Comment insérer une ligne en VBA ?

Utilisez .EntireRow.Insert sur la ligne que vous voulez pousser vers le bas : ws.Rows(5).EntireRow.Insert crée une nouvelle ligne 5 vide et déplace l'ancienne ligne 5 et tout ce qui la suit d'un cran vers le bas. Ajoutez Shift:=xlDown pour la clarté et CopyOrigin pour contrôler de quel voisin la nouvelle ligne hérite le format.

À quoi sert l'argument Shift lors d'une insertion ?

Shift indique à Excel dans quel sens pousser les cellules existantes lorsque vous insérez une plage partiellexlDown les déplace vers le bas, xlToRight vers la droite. Il est inutile pour une ligne ou une colonne entière (elles ne peuvent aller que dans un sens) mais important pour un sous-bloc, où Excel devine autrement le sens à partir de la forme de la plage.

Pourquoi ma ligne insérée a-t-elle la mauvaise mise en forme ?

Les lignes insérées copient le format d'un voisin, choisi par CopyOrigin. La valeur par défaut xlFormatFromLeftOrAbove copie la ligne du dessus — insérer sous un en-tête donne donc à la nouvelle ligne l'allure d'un en-tête. Passez CopyOrigin:=xlFormatFromRightOrBelow pour copier plutôt la ligne du dessous, ou appelez .ClearFormats sur la nouvelle ligne après l'insertion.

Comment insérer plusieurs lignes d'un coup en VBA ?

Redimensionnez la ligne cible au nombre voulu et insérez ce bloc en un seul appel : ws.Rows(10).Resize(5).EntireRow.Insert insère cinq lignes au-dessus de la ligne 10. Une unique insertion multi-lignes est bien plus rapide que d'appeler .Insert cinq fois, car Excel ne restructure la grille qu'une seule fois.

Faut-il boucler vers le bas ou à rebours pour insérer des lignes ?

À rebours, pour la même raison que la suppression. Insérer pousse les lignes non parcourues encore plus bas, et une boucle vers le bas peut finir par insérer dans les lignes qu'elle vient de créer. Boucler For i = lastRow To 2 Step -1 maintient chaque insertion sous les cellules qu'il vous reste à traiter, si bien que leurs numéros de ligne ne se décalent jamais.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 07/08/2026.

Guides associés : VBA Delete Rows · VBA Hide Columns and Rows · VBA Last Row · VBA Range · VBA For Loop