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

VBA Copy Sheet dans Excel — dupliquer une feuille sans créer de nouveau classeur

|

VBA Copy Sheet dans Excel — dupliquer une feuille sans créer de nouveau classeur

TL;DRWorksheet.Copy prend le même positionnement Before:=/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 de Set ws = sheet.Copy, vous saisissez donc la copie fraîche via ActiveSheet à la ligne juste après. Ensuite, et c'est la grosse affaire : un ws.Copy sans destination ne copie pas dans le classeur — il crée un tout nouveau classeur contenant la copie. Passez toujours un Before ou un After, à 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 — Copy est le jumeau d'Add : même positionnement, pas de valeur de retour
  • La surprise qui casse la plupart des macros — un Copy sans 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 Move reflète Copy avec 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