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

VBA AutoFill dans Excel — remplir une série ou une formule sans le piège de Destination

|

VBA AutoFill dans Excel — remplir une série ou une formule sans le piège de Destination

TL;DRsource.AutoFill Destination, Type prolonge un motif ; ce n'est pas une copie. Deux règles vous sauvent : la Destination doit inclure la sourceRange("A1").AutoFill Destination:=Range("A1:A10") (A1 est à l'intérieur de A1:A10) ; exclure l'amorce déclenche l'erreur d'exécution 1004. Et le Type décide si vous obtenez une série (xlFillSeries → 1, 2, 3) ou une copie (xlFillCopy → 1, 1, 1) ; le défaut xlFillDefault devine. Si vous voulez seulement copier une cellule vers le bas d'une colonne, Range("B2:B1000").FillDown est plus simple que de lutter contre AutoFill.

' Serie : amorcez la ou les premieres valeurs, puis prolongez
Range("A1").Value = 1
Range("A1").AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries  ' 1..10

' Formule vers le bas d'une colonne : les refs relatives s'ajustent par ligne
Range("B2").Formula = "=A2*1.2"
Range("B2").AutoFill Destination:=Range("B2:B1000")

' Copie simplement la cellule du haut vers le bas - sans gymnastique de Destination
Range("B2:B1000").FillDown

AutoFill est la version code du glissement de la poignée de recopie, et on s'attend à ce qu'il se comporte comme une copie — d'où la surprise quand il transforme 1 en 1, 2, 3, 4, et le désarroi quand un extrait déclenche 1004 sans raison apparente. Les deux prennent sens dès qu'on tient l'idée centrale : AutoFill prolonge un motif à partir d'une amorce sur une destination qui doit contenir cette amorce. La copie répète ; AutoFill génère. Réglez correctement la destination et le type, et c'est la façon la plus propre de poser une série ou de pousser une formule vers le bas d'une colonne.

Ce que vous allez apprendre

  • Le modèle mental — AutoFill prolonge un motif, il ne copie pas
  • La règle de destination — la source doit être à l'intérieur de la destination, sinon 1004
  • Type — série contre copie, et pourquoi la supposition par défaut n'est pas fiable
  • Remplir une formule vers le bas pour que ses références s'ajustent ligne par ligne
  • Quand FillDown / FillRight (ou un tableau) l'emportent sur AutoFill

Le modèle mental : AutoFill prolonge un motif

La copie prend une valeur et la répète. AutoFill prend une amorce — la première cellule ou les deux premières — et prolonge le motif qu'il détecte : un nombre devient une suite, 1, 2 devient une série arithmétique, Jan devient les mois, une date devient des jours consécutifs. C'est pourquoi il existe indépendamment de Copy :

Range("A1").Value = 5
Range("A1").AutoFill Destination:=Range("A1:A5"), Type:=xlFillCopy    ' 5, 5, 5, 5, 5

Range("C1").Value = 5
Range("C1").AutoFill Destination:=Range("C1:C5"), Type:=xlFillSeries  ' 5, 6, 7, 8, 9

Même amorce, même destination — un Type différent, un résultat complètement différent. Dès que vous voyez AutoFill comme un générateur qui lit une amorce et produit un motif, les deux règles ci-dessous cessent d'être arbitraires : l'amorce doit faire partie de ce que vous remplissez, et vous devez lui dire quel motif vous voulez.

La règle de destination : la source doit être à l'intérieur de la destination

Voici le bug d'AutoFill qui bloque tout débutant : la plage Destination doit contenir la plage source. La source est l'amorce, et l'amorce est la première partie du remplissage.

' FAUX - la destination exclut l'amorce -> erreur d'execution 1004
Range("A1").AutoFill Destination:=Range("A2:A10")

' JUSTE - la destination inclut A1, l'amorce
Range("A1").AutoFill Destination:=Range("A1:A10")

Voyez-le comme « remplir A1 jusqu'à A10 », et non « remplir A1 dans A2:A10 ». La ligne d'amorce est là où le motif commence, elle vit donc en haut de la destination. Les amorces multi-cellules fonctionnent pareil — amorcez A1:A2 avec 1 et 2, puis AutoFill Destination:=Range("A1:A100") et Excel lit le pas à partir des deux cellules d'amorce. Presque toutes les questions du genre « AutoFill déclenche 1004 » sont une destination qui a oublié d'inclure la source.

Type : série contre copie, et le défaut peu fiable

Omettez Type et vous obtenez xlFillDefault, qui laisse Excel deviner à partir de l'amorce — un nombre seul se copie, 1, 2 fait une série, Mon fait des jours de semaine. Pratique dans l'interface, risqué dans le code, car votre intention n'est pas écrite et la supposition peut basculer. Nommez le type :

Ce que vous voulez Type
1, 2, 3, … xlFillSeries
1, 1, 1, … xlFillCopy
Mon, Tue, Wed (sauter les week-ends) xlFillWeekdays
Jours / mois / années consécutifs xlFillDays / xlFillMonths / xlFillYears
Mise en forme uniquement xlFillFormats
Valeurs sans mise en forme xlFillValues
Range("A1").Value = Date
Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillMonths  ' mois par mois

La règle est simple : si le motif compte, énoncez-le. Vous fier à xlFillDefault, c'est ainsi qu'on obtient un 1, 1, 1 copié là où on voulait 1, 2, 3, ou une série incrémentée là où on voulait une répétition.

Remplir une formule vers le bas d'une colonne

L'AutoFill le plus utile au quotidien, c'est pousser une formule vers le bas d'une colonne. Remplissez une formule et ses références relatives s'ajustent ligne par ligne, exactement comme un glissement de la poignée de recopie :

Range("B2").Formula = "=A2*C2"
Range("B2").AutoFill Destination:=Range("B2:B1000")   ' B3 devient =A3*C3, B4 =A4*C4, ...

xlFillDefault gère cela correctement pour les formules, vous avez donc rarement besoin de préciser Type ici. C'est l'idiome « appliquer cette formule à toute la colonne », et c'est pourquoi AutoFill mérite sa place même si FillDown existe — AutoFill peut amorcer et prolonger une vraie série, ce qu'une simple copie ne peut pas. Si vous préférez écrire la formule une fois et la laisser s'ajuster sans le modèle de la poignée de recopie, .FormulaR1C1 fait le même travail ; voir VBA Formula.

Quand FillDown, FillRight ou un tableau l'emportent sur AutoFill

AutoFill est un moteur de motifs. Quand vous ne générez pas de motif — vous voulez juste répéter la cellule du haut vers le bas ou en travers — les outils plus simples sont plus clairs et évitent le cérémonial de la destination-qui-inclut-la-source :

Range("B2:B1000").FillDown        ' copie B2 vers le bas sur toute la plage
Range("B2:Z2").FillRight          ' copie B2 en travers sur toute la ligne

FillDown et FillRight ne prennent ni Type ni Destination séparée — la plage sur laquelle vous les appelez est le remplissage, la cellule du haut servant d'amorce. Pour une série purement numérique sans formules, écrire un tableau Variant dans la plage en une seule affectation est encore plus rapide et évite complètement l'opération sur la feuille. Ma règle : recourez à AutoFill uniquement quand vous avez besoin du moteur de motifs d'Excel — une vraie série, des jours de semaine, des listes personnalisées — et utilisez FillDown / FillRight ou un tableau pour une copie ordinaire. Pour les gros remplissages, désactivez d'abord le recalcul et le rafraîchissement de l'écran ; voir VBA Calculation et VBA ScreenUpdating.

Comment ExcelMaster aide

Les erreurs d'AutoFill qui font perdre du temps sont prévisibles : la destination qui exclut l'amorce et déclenche 1004, le Type manquant qui a copié quand vous vouliez une série, et la lutte avec AutoFill pour un travail qui n'était qu'un FillDown d'une ligne. Aucune n'est difficile une fois qu'on la connaît — elles sont juste faciles à rater de mémoire.

ExcelMaster choisit le bon outil selon la forme du travail. Demandez-lui de « numéroter ces lignes de 1 à 500 » et il amorce et prolonge une série avec la destination incluant l'amorce ; demandez-lui de « copier cette formule vers le bas jusqu'à la dernière ligne » et il utilise FillDown sur la used range plutôt qu'une hauteur codée en dur et fragile. Il énonce le Type pour que l'intention soit sur la page, et il bascule vers une simple écriture de tableau quand vous n'avez besoin que des valeurs. Vous décrivez le motif ; il le pose sans le 1004.

Questions fréquentes

Comment utiliser AutoFill en VBA ?

Appelez AutoFill sur la plage d'amorce et passez une Destination qui inclut l'amorce : Range("A1").AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries. L'amorce est la première valeur ou les deux premières, la Destination est toute la plage à remplir (amorce incluse), et Type indique s'il faut prolonger une série ou copier. Définissez d'abord la cellule d'amorce, puis appelez AutoFill.

Pourquoi ai-je l'erreur d'exécution 1004 avec AutoFill ?

Presque toujours parce que la Destination ne contient pas la source. Range("A1").AutoFill Destination:=Range("A2:A10") exclut l'amorce A1 et déclenche 1004 ; utilisez plutôt Range("A1:A10") pour que l'amorce se place en haut de la destination. Lisez-le comme « remplir A1 jusqu'à A10 », et non « remplir A1 dans A2:A10 ».

Quelle est la différence entre AutoFill et FillDown en VBA ?

FillDown copie la cellule du haut d'une plage vers le bas sur toute la plage — pas de Type, pas de Destination séparée, juste Range("B2:B1000").FillDown. AutoFill prolonge un motif à partir d'une amorce et a besoin d'une Destination qui inclut l'amorce. Utilisez FillDown (ou FillRight) pour une copie ordinaire, et AutoFill quand vous avez besoin d'une vraie série comme 1, 2, 3 ou les mois.

Comment faire un AutoFill d'une formule vers le bas d'une colonne en VBA ?

Écrivez la formule dans la cellule d'amorce, puis faites un AutoFill vers le bas : Range("B2").Formula = "=A2*C2" suivi de Range("B2").AutoFill Destination:=Range("B2:B1000"). Les références relatives s'ajustent ligne par ligne, donc B3 devient =A3*C3. Vous pouvez omettre Type pour les formules. Range("B2:B1000").FillDown fait la même chose plus simplement.

Comment remplir une série de dates ou de mois avec AutoFill ?

Amorcez la première date et passez un Type de date : Range("A1").Value = Date puis Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillDays pour des jours consécutifs, ou xlFillMonths / xlFillWeekdays / xlFillYears pour ces pas. Nommer le type évite de compter sur xlFillDefault pour deviner le motif à partir de l'amorce.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 01/09/2026.

Guides connexes : VBA Cell Value · VBA Formula · VBA Copy Paste · VBA Range · VBA ScreenUpdating