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

VBA Insert Cells dans Excel — insérer ou supprimer une plage et choisir vous-même le sens du décalage

|

VBA Insert Cells dans Excel — insérer ou supprimer une plage et choisir vous-même le sens du décalage

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 partielleRange("B2:D3").Insert — il y a deux directions légales, vous devez donc dire laquelle : Shift:=xlShiftDown ou xlShiftToRight pour Insert, xlShiftUp ou xlShiftToLeft pour Delete. Omettez Shift et 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 Shift et laisser Excel deviner d'après la forme de la plage
  • Les constantes exactes — xlShiftDown / xlShiftToRight pour Insert, xlShiftUp / xlShiftToLeft pour 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(...). Aucun Shift né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 / .Delete avec un Shift:= 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