TL;DR — Insérer ou supprimer une colonne ou une ligne entière est sûr, parce qu'il n'y a qu'un seul sens de décalage possible. Dès l'instant où vous insérez ou supprimez une plage partielle —
Range("B2:D3").Insert— il y a deux directions légales, vous devez donc dire laquelle :Shift:=xlShiftDownouxlShiftToRightpourInsert,xlShiftUpouxlShiftToLeftpourDelete. OmettezShiftet Excel devine d'après la forme de la plage, et la mauvaise devinette fait glisser vos voisines dans le mauvais sens sans aucune erreur.
Sub OpenGapForNote()
' Pousser un bloc 2x3 vers le BAS pour ouvrir de la place - indiquez le sens, ne laissez jamais Excel deviner
Range("B2:D3").Insert Shift:=xlShiftDown, CopyOrigin:=xlFormatFromLeftOrAbove
End Sub
Sub CloseGap()
Range("B2:D3").Delete Shift:=xlShiftUp ' remonter le bloc du dessous dans le vide
End Sub
C'est le même Insert et le même Delete que vous employez sur les colonnes
entières et les lignes — pointés sur une sous-plage
au lieu d'une ligne complète. C'est en voyant le cas partiel que tout s'éclaire : les opérations sur ligne
entière ne sont que le cas particulier et sûr où le sens du décalage est imposé. Partout ailleurs, la
direction est un choix, et c'est dans ce choix que loge le bug.
Ce que vous allez apprendre
- Le modèle mental — une plage partielle a deux sens de décalage légaux, vous devez donc en choisir un
- Pourquoi les lignes et colonnes entières « marchent tout seules » — le décalage est imposé, il n'y a rien à rater
- Le bug numéro un — omettre
Shiftet laisser Excel deviner d'après la forme de la plage - Les constantes exactes —
xlShiftDown/xlShiftToRightpour Insert,xlShiftUp/xlShiftToLeftpour Delete - Quand un insert partiel est le bon choix, et quand vous vouliez en fait une ligne entière
Le modèle mental : pas de ligne entière signifie une décision
Insérez une colonne entière et Excel n'a qu'une seule chose à faire : pousser les colonnes vers la droite.
Insérez une ligne entière et il ne peut que pousser les lignes vers le bas. Une direction, aucune ambiguïté —
c'est exactement pourquoi Columns("C").Insert ne vous demande jamais rien.
Une plage partielle brise cela. Demandez à Excel d'insérer B2:D3 — un bloc de 2 colonnes sur 3 lignes posé
au milieu de vos données — et quelque chose doit bouger pour faire de la place, mais quoi ? Les cellules du
dessous peuvent glisser vers le bas, ou les cellules de droite peuvent glisser vers la droite. Les deux sont
légales. C'est pourquoi Range.Insert et Range.Delete prennent un argument Shift dont le seul rôle est
de répondre à cette question. Une plage partielle est le cas général ; une ligne entière est le cas dégénéré
où la réponse est imposée.
La règle qui compte le plus : toujours passer Shift sur une plage partielle
Quand vous omettez Shift, Excel ne refuse pas — il devine d'après la forme de la plage. En gros : une
plage plus haute que large se décale horizontalement, une plage plus large que haute se décale verticalement,
et une plage carrée est un pile ou face. La devinette n'est pas documentée dans l'esprit et n'est pas fiable
en pratique, et quand elle contredit votre intention, les cellules adjacentes glissent dans le mauvais sens
et vos colonnes se désalignent — en silence, sans aucune erreur.
Range("B2:D3").Insert ' devinette basee sur la forme - un bug latent
Range("B2:D3").Insert Shift:=xlShiftDown ' explicite - fait exactement ceci, a chaque fois
La règle est inconditionnelle : sur toute plage partielle, nommez la direction. Traitez l'heuristique de
forme comme un générateur de bugs que vous coupez en étant toujours explicite. Les constantes valent la peine
d'être mémorisées, car Insert et Delete en utilisent de différentes :
| Opération | Déplacer les cellules... | Constante |
|---|---|---|
Insert |
vers le bas | xlShiftDown |
Insert |
vers la droite | xlShiftToRight |
Delete |
vers le haut | xlShiftUp |
Delete |
vers la gauche | xlShiftToLeft |
Encore un piège de constante : xlDown et xlToRight sont des valeurs XlDirection utilisées par
Range.End pour la navigation — ce ne sont pas les constantes de décalage. Passer Shift:=xlDown à
Insert fonctionne par coïncidence de valeur dans certaines versions, mais c'est faux dans l'intention ;
utilisez la famille xlShift... pour que votre code dise ce qu'il veut dire.
Pourquoi les opérations sur ligne entière sont le cas sûr
Voici la récompense. Columns("C").Insert signifie en réalité « insérer une plage qui se trouve être une
colonne entière », et une colonne entière ne peut se décaler que vers la droite — il n'y a donc pas de
décision Shift à rater, et aucune déchirure de ligne partielle possible. C'est toute la raison pour
laquelle les opérations sur ligne entière sont la valeur par défaut fiable :
- Vous voulez déplacer une colonne ou une ligne entière ? Utilisez
Columns(...)/Rows(...). AucunShiftnécessaire, les références s'ajustent proprement, rien ne se déchire. - Vous devez ouvrir ou fermer un vide à l'intérieur d'un bloc ? Utilisez
Range(...).Insert/.Deleteavec unShift:=explicite.
Supprimer une plage partielle comporte le même danger de #REF! que supprimer une colonne : des cellules
disparaissent, et les formules qui pointaient dedans se cassent. Et CopyOrigin fonctionne ici exactement
comme pour les colonnes — un bloc inséré hérite de la mise en forme des cellules situées au-dessus ou à
gauche, sauf indication contraire.
Quand un insert partiel est vraiment le bon choix
Soyez honnête sur la fréquence : la plupart du temps, « insérer une cellule » est un travail de ligne entière déguisé. Si vous ajoutez un enregistrement à une liste, vous voulez que la ligne entière se déplace pour que chaque colonne reste alignée — un insert partiel qui ne décale que certaines colonnes vers le bas est précisément le désalignement que vous cherchez à éviter.
L'insert et le delete partiels méritent leur place avec des modifications vraiment rectangulaires :
décaler vers le bas un bloc étiqueté d'un formulaire pour faire place à un nouveau champ, refermer un vide
laissé par un sous-tableau retiré, réorganiser une disposition en grille où les lignes et les colonnes ne
sont pas l'unité de sens. Dans ces cas, le bloc est l'objet même, et le sens du Shift est un vrai choix
de conception. Partout ailleurs, tournez-vous d'abord vers une ligne ou une colonne entière — c'est plus
propre, sûr pour les références, et cela ne vous demande jamais de deviner.
Comment ExcelMaster vous aide
L'insert et le delete de plage partielle sont un outil tranchant : le sens du Shift est obligatoire, facile
à inverser, et échoue en silence quand vous le laissez à Excel — et la variante Delete peut casser des
formules de la même façon qu'une suppression de colonne.
ExcelMaster vous laisse décrire la
modification — « pousse ce bloc vers le bas pour faire place à un nouveau champ » — et décide si c'est une
ligne entière qu'il vous faut vraiment, écrit le Shift:=xlShiftDown (ou xlShiftToRight) explicite plutôt
que de se fier à la devinette de forme, règle CopyOrigin pour s'accorder à la mise en forme environnante,
et signale un Delete partiel qui casserait une référence. Vous gardez le classeur et le code.
Questions fréquentes
Comment insérer des cellules en VBA ?
Appelez Insert sur une plage et indiquez le sens : Range("B2:C4").Insert Shift:=xlShiftDown déplace les
cellules du dessous vers le bas pour faire de la place, et Shift:=xlShiftToRight déplace les cellules de
droite vers la droite. Passez toujours Shift sur une plage partielle — sans lui, Excel devine le sens
d'après la forme de la plage.
À quoi sert l'argument Shift, et pourquoi dois-je le passer ?
Shift indique à Excel dans quel sens déplacer les cellules environnantes pour ouvrir de la place (Insert)
ou refermer le vide (Delete). Une plage partielle a deux directions légales, le choix vous revient donc.
Omettez-le et Excel décide selon que la plage est plus haute ou plus large — une devinette qui fait glisser
en silence vos voisines dans le mauvais sens quand elle contredit votre intention.
Quelle est la différence entre insérer des cellules et insérer une colonne entière ?
Une colonne entière ne peut se décaler que dans un sens (vers la droite) : Columns("C").Insert n'a donc
besoin d'aucune direction et ne déchire jamais la disposition. Une plage partielle peut se décaler dans deux
sens : Range(...).Insert exige donc un Shift explicite. Si vous vous surprenez à insérer des cellules
pour ajouter un enregistrement, c'est presque toujours une ligne entière que vous vouliez.
Comment supprimer des cellules et décaler vers le haut ou la gauche en VBA ?
Utilisez Range("B2:C4").Delete Shift:=xlShiftUp pour remonter les cellules du dessous, ou
Shift:=xlShiftToLeft pour ramener vers la gauche les cellules de droite. Comme pour une suppression de
colonne, toute formule qui référençait les cellules retirées s'effondre en #REF!, vérifiez donc d'abord les
dépendantes.
Dois-je utiliser xlDown ou xlShiftDown ?
Utilisez xlShiftDown. Les constantes xlDown et xlToRight appartiennent à XlDirection et sont
destinées à la navigation Range.End, pas à l'argument Shift d'Insert/Delete. Employer la famille
xlShift... rend l'intention explicite et évite de s'appuyer sur des constantes qui ne font que partager une
valeur.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 15/09/2026.
Guides associés : VBA Insert Column · VBA Delete Column · VBA Insert Rows · VBA Range · VBA Cells
