TL;DR —
Worksheet.Copyprend le même positionnementBefore:=/After:=que vous utilisez pour Add, mais avec deux différences qui piègent tout le monde. D'abord, il ne renvoie rien — il n'y a pas deSet ws = sheet.Copy, vous saisissez donc la copie fraîche viaActiveSheetà la ligne juste après. Ensuite, et c'est la grosse affaire : unws.Copysans destination ne copie pas dans le classeur — il crée un tout nouveau classeur contenant la copie. Passez toujours unBeforeou unAfter, à moins qu'un nouveau fichier soit précisément ce que vous voulez.
Sub DuplicateTemplate()
Dim src As Worksheet, copy As Worksheet
Set src = ThisWorkbook.Worksheets("Template")
src.Copy After:=ThisWorkbook.Worksheets(Worksheets.Count) ' duplique a la fin
Set copy = ActiveSheet ' la copie est maintenant active
copy.Name = "Template " & Format(Now, "hhmmss") ' renommez-la immediatement
End Sub
Worksheet.Copy est le code derrière clic droit sur un onglet ▸ Déplacer ou copier ▸ Créer une copie.
C'est ainsi que les macros de reporting produisent chaque mois une feuille neuve à partir d'un modèle.
C'est aussi la méthode la plus surprenante de toute la famille de gestion des feuilles, car l'appel
« évident » — Sheets("Template").Copy sans argument — fait quelque chose de tout à fait différent de ce
que son nom suggère.
Ce que vous allez apprendre
- Le modèle mental —
Copyest le jumeau d'Add : même positionnement, pas de valeur de retour - La surprise qui casse la plupart des macros — un
Copysans argument fait apparaître un nouveau classeur - Comment référencer la copie quand la méthode ne renvoie rien
- Ce qui voyage avec une feuille copiée — formules, mise en forme, code et noms définis
- Comment
MovereflèteCopyavec l'intention inverse, et comment copier vers un autre classeur
Le modèle mental : Copy est le jumeau d'Add, sans valeur de retour
Ajouter et copier une feuille partagent une grammaire. Les deux acceptent Before:= et After:= pour
dire où atterrit la feuille, et les deux se rabattent sur une position plutôt que sur la fin. La
différence, c'est qu'Add est une fonction qui vous remet la nouvelle feuille, tandis que Copy est
une méthode qui ne renvoie absolument rien. Vous ne pouvez pas écrire Set ws = src.Copy ; c'est une
erreur de compilation.
Excel ne vous laisse donc qu'une seule façon de saisir le doublon frais : juste après l'exécution de
Copy, la copie devient la feuille active. Capturez-la à la ligne suivante, avant que quoi que ce
soit d'autre puisse voler le focus :
src.Copy After:=Worksheets(Worksheets.Count)
Dim copy As Worksheet
Set copy = ActiveSheet ' c'est LA copie - saisissez-la maintenant
C'est l'un des rares endroits où s'appuyer sur ActiveSheet est correct plutôt que négligent, car Copy
laisse réellement la nouvelle feuille active et il n'y a pas de meilleure prise. La discipline, c'est de
le faire immédiatement — un Calculate, un DoEvents ou un gestionnaire d'événement entre Copy et
Set copy = ActiveSheet peut déplacer le focus et vous remettre la mauvaise feuille.
La surprise qui casse la plupart des macros : un Copy sans argument fait apparaître un nouveau classeur
Voici le comportement qui envoie les gens sur les moteurs de recherche. Vous vous attendriez
raisonnablement à ce que Sheets("Template").Copy — sans argument — duplique la feuille dans le classeur
courant. Ce n'est pas le cas. Un Copy sans Before ni After crée un nouveau classeur à une seule
feuille et y place la copie. Lancez-le dans une boucle et vous obtenez un tas de nouvelles fenêtres au
lieu d'un tas de nouveaux onglets.
src.Copy ' PAS un doublon local - un tout nouveau classeur apparait
La règle est simple : passez toujours une destination quand vous voulez un doublon dans le classeur. La forme sans argument n'est pas un bug pour autant — c'est l'idiome le plus propre de tout VBA pour exporter une feuille comme son propre fichier :
src.Copy ' nouveau classeur avec juste cette feuille
ActiveWorkbook.SaveAs "C:\Reports\September.xlsx", FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close SaveChanges:=False
La même méthode sert donc deux intentions selon un seul argument. Décidez de celle que vous visez, et ne
laissez jamais un After manquant transformer un « duplique cet onglet » en « ouvre quarante
classeurs ».
Ce qui voyage avec une feuille copiée
Copy clone l'objet, pas seulement les valeurs — et c'est plus que ce que la plupart des gens
imaginent. Une feuille copiée emporte ses formules, sa mise en forme, ses graphiques, ses formes, sa mise
en forme conditionnelle, le code de son module de feuille et tout nom défini de portée feuille.
Deux conséquences en découlent :
- Les formules qui référençaient d'autres feuilles gardent ces références, si bien qu'une copie dans le même classeur peut discrètement pointer sur les voisines de l'original — vérifiez si vous vouliez que les liens soient redirigés.
- Les noms définis dupliqués sont l'effet de bord classique : copiez une feuille dotée d'un nom de portée feuille et Excel peut vous avertir qu'un nom existe déjà, ou en créer silencieusement un second, de portée différente.
Si vous ne voulez que les données, ne copiez pas la feuille — copiez la plage. dst.Range("A1:Z100").Value = src.Range("A1:Z100").Value déplace les valeurs sans aucun bagage. Copier la feuille entière est le bon
outil quand vous voulez délibérément reproduire le modèle intact — disposition, formules et code.
Nommer la copie, et comment Move reflète Copy
Excel nomme automatiquement un doublon Template (2), Template (3), et ainsi de suite, si bien que
vous le renommez presque toujours aussitôt. Comme il n'y a pas de valeur de retour, renommez via la
feuille active à la ligne juste après Copy, et les mêmes règles que l'article
Add s'appliquent — 31 caractères, unique, sans : \ / ? * [ ].
Worksheet.Move est l'image miroir de Copy. Il prend les arguments Before:=/After:= identiques,
mais il déplace la feuille au lieu de la dupliquer, et un Move sans destination ouvre lui aussi
un nouveau classeur — sortant entièrement la feuille du classeur courant. Même forme d'argument,
intention inverse :
src.Move After:=Worksheets(Worksheets.Count) ' deplace a la fin (pas de doublon)
src.Copy To:=Workbooks("Report.xlsx").Worksheets(1) ' copie DANS un autre classeur ouvert
Pour copier dans un autre classeur, ciblez sa feuille dans l'argument Before/After — les deux
fichiers doivent être ouverts. Le jugement sur toute la méthode : passez toujours une destination,
capturez la copie via ActiveSheet à la ligne suivante, souvenez-vous que la copie emporte code et noms,
et ne recourez à la forme sans argument que lorsque « nouveau classeur » est le véritable objectif.
Comment ExcelMaster vous aide
Copier une feuille cache une mine — la forme sans argument ouvre un nouveau classeur au lieu de dupliquer — et deux pièges plus discrets : aucune valeur de retour à saisir, et une copie qui traîne son code et ses noms définis avec elle.
ExcelMaster vous laisse énoncer
l'intention clairement — « duplique la feuille Template à la fin et nomme-la d'après aujourd'hui » ou
« exporte cette feuille comme son propre fichier » — et il écrit la bonne forme pour chacune : un Copy
positionné avec une capture ActiveSheet et un renommage pour le doublon dans le classeur, ou un Copy
sans argument plus SaveAs pour l'export. Il vous avertit aussi quand une feuille copiée emporte des
formules ou des noms qui vont entrer en collision. Vous gardez le classeur et le code.
Questions fréquentes
Comment copier une feuille de calcul en VBA ?
Utilisez Worksheet.Copy avec une destination : src.Copy After:=Worksheets(Worksheets.Count) duplique
la feuille à la fin. Comme Copy ne renvoie rien, saisissez la nouvelle feuille via ActiveSheet à la
ligne suivante — Set copy = ActiveSheet — puis renommez-la. Passez toujours Before:= ou After:= ;
la forme sans argument fait autre chose.
Pourquoi ma macro Copy ouvre-t-elle un nouveau classeur ?
Parce que vous avez appelé Copy sans argument Before ni After. Un Worksheet.Copy sans argument ne
duplique pas dans le classeur courant — il crée un nouveau classeur à une seule feuille contenant la
copie. Passez une destination (After:=Worksheets(Worksheets.Count)) pour dupliquer sur place, et
réservez la forme sans argument à l'export d'une feuille comme son propre fichier.
Comment obtenir une référence à la feuille copiée ?
Copy n'a pas de valeur de retour : vous ne pouvez donc pas écrire Set ws = src.Copy. À la place, la
copie devient la feuille active juste après l'appel, alors capturez-la avec Set copy = ActiveSheet à la
ligne juste après — avant qu'un Calculate, un DoEvents ou un gestionnaire d'événement puisse déplacer
le focus et vous remettre la mauvaise feuille.
Comment copier une feuille vers un autre classeur ?
Ciblez une feuille de l'autre classeur dans l'argument de positionnement, les deux fichiers étant
ouverts : src.Copy After:=Workbooks("Report.xlsx").Worksheets(Worksheets.Count). La copie emporte ses
formules, sa mise en forme et son code ; surveillez les formules qui référençaient le classeur source,
car elles peuvent pointer sur le fichier d'origine.
Quelle est la différence entre Copy et Move ?
Worksheet.Copy duplique la feuille ; Worksheet.Move la déplace, en la retirant de sa position
d'origine. Les deux prennent les mêmes arguments Before:=/After:=, et les deux ouvrent un nouveau
classeur quand on les appelle sans destination. Utilisez Copy pour produire un doublon et Move pour
réordonner ou extraire une feuille.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 14/09/2026.
Guides associés : VBA Add Sheet · VBA Delete Sheet · VBA Worksheets · VBA Open Workbook · VBA ThisWorkbook
