En bref — Insérer est l'image miroir de supprimer.
.EntireRow.Insertne 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 avecShift:=xlDown(ouxlToRight) ; contrôlez de quel voisin la nouvelle ligne copie le format avecCopyOrigin; 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
Shiftdé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 partielle — xlDown 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
