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

VBA Add Sheet dans Excel — créer une feuille et la capturer correctement

|

VBA Add Sheet dans Excel — créer une feuille et la capturer correctement

TL;DRWorksheets.Add renvoie la feuille qu'il vient de créer. Capturez cette valeur de retour — Set ws = Worksheets.Add(...) — et vous n'avez plus jamais à deviner laquelle est la nouvelle. Les deux choses qui piègent tout le monde sont la position et le nom : un Worksheets.Add sans argument dépose la feuille à gauche de la feuille active (pas à la fin), et vous ne pouvez pas passer le nom dans l'appel Add — vous définissez .Name ensuite, où un nom en double, vide ou trop long déclenche l'erreur d'exécution 1004.

Sub AddMonthSheet()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets.Add(After:=Worksheets(Worksheets.Count))
    ws.Name = "Sep 2026"          ' <= 31 caracteres, unique, sans : \ / ? * [ ]
End Sub

Worksheets.Add est le code derrière Accueil ▸ Insérer ▸ Insérer une feuille et le petit + à côté des onglets. C'est l'une des premières choses que fait une macro de reporting, et elle échoue toujours aux deux mêmes endroits — la feuille apparaît là où vous ne l'attendiez pas, ou la ligne de renommage explose. Les deux problèmes disparaissent dès l'instant où vous voyez Add comme une fabrique qui vous remet la feuille finie, plutôt que comme une commande qui vous laisse partir à sa recherche.

Ce que vous allez apprendre

  • Le modèle mental — Add renvoie la nouvelle feuille : capturez-la et cessez d'utiliser ActiveSheet
  • La règle qui évite la plupart des bugs — affectez la valeur de retour à une variable Worksheet
  • Pourquoi un Add sans argument place la feuille à gauche, et comment Before et After corrigent cela
  • Pourquoi vous ne pouvez pas nommer la feuille dans Add, et les règles qui font que .Name déclenche 1004
  • Comment ajouter une feuille seulement si elle n'existe pas déjà

Le modèle mental : Add vous remet la feuille

Worksheets.Add n'est pas une commande qu'on lance et qu'on oublie. C'est une fonction qui crée une feuille et en renvoie une référence. L'erreur la plus courante de toutes est de jeter cette référence :

Worksheets.Add                    ' la nouvelle feuille est creee... puis perdue
Worksheets(Worksheets.Count).Name = "Data"   ' on devine ou elle est allee

La deuxième ligne est une supposition. Elle part du principe que la nouvelle feuille est la dernière, ce qui est faux par défaut, et renomme donc le mauvais onglet. Tout ce qui suit — écrire des en-têtes, mettre en forme, ajouter des formules — vise alors une feuille choisie au hasard. Capturez plutôt la valeur de retour et les devinettes disparaissent pour de bon :

Dim ws As Worksheet
Set ws = Worksheets.Add
ws.Name = "Data"                  ' c'est sans ambiguite la feuille que vous venez de creer

Une fois que ws contient le véritable objet, la position cesse de compter pour la justesse du code — vous pouvez placer la feuille où vous voulez, votre code s'adresse toujours à la bonne.

La règle qui compte le plus : affecter la valeur de retour

Toute routine d'ajout de feuille fiable commence de la même façon : Set ws = Worksheets.Add(...). C'est la règle qui supprime une catégorie entière de bugs, car les deux solutions de repli fragiles cèdent toutes deux dans des conditions ordinaires :

  • ActiveSheet après Add pointe en général sur la nouvelle feuille — mais pas si un événement, un Calculate ou une autre ligne a d'abord déplacé le focus. C'est une convention, pas une garantie.
  • Sheets(Sheets.Count) suppose que la nouvelle feuille est la dernière, ce qui n'est vrai que si vous l'y avez ajoutée.

La valeur de retour est la seule référence toujours correcte, immédiatement, peu importe où la feuille a atterri ou ce qui s'exécute ensuite. Traitez « ajouter une feuille » et « garder la feuille sous la main » comme une seule étape indivisible.

Positionnement : Before, After, et pourquoi la valeur par défaut atterrit à gauche

Worksheets.Add accepte les arguments Before:= et After:= — une feuille devant ou derrière laquelle insérer. N'en passez qu'un au plus. Sans aucun des deux, Excel insère la nouvelle feuille juste avant la feuille active, ce qui surprend presque tout le monde la première fois : on attend « la fin », et l'onglet apparaît au milieu du classeur.

Pour ajouter à la fin — la position que veulent réellement la plupart des macros — ancrez-vous sur la dernière feuille avec After :

Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count))   ' toujours en dernier
Set ws = Worksheets.Add(Before:=Worksheets(1))                 ' toujours en premier

Worksheets(Worksheets.Count) est l'idiome pour « la dernière feuille de calcul ». Notez qu'il compte les feuilles de calcul, pas toutes les feuilles — si le classeur contient aussi des feuilles graphiques, Sheets.Count et Worksheets.Count diffèrent. Dans le doute, positionnez explicitement ; ne comptez jamais sur la valeur par défaut « à gauche de l'active » dans du code que d'autres liront.

C'est au nommage qu'Add plante

Il n'y a pas d'argument Name sur Add. Vous créez la feuille, puis vous définissez .Name sur l'objet que vous avez capturé. C'est dans cette deuxième étape que loge l'erreur d'exécution 1004, car Excel applique des règles strictes aux noms de feuille — et ce sont les mêmes règles que vous nommiez une feuille toute neuve ou que vous en renommiez une ancienne :

  • 31 caractères maximum
  • Doit être unique dans le classeur (sans distinction de casse) — un doublon est le plantage numéro un
  • Ne peut pas être vide
  • Ne peut pas contenir : \ / ? * [ ]

Enfreignez l'une d'elles et .Name = ... déclenche 1004. Le déclencheur le plus courant est de relancer une macro qui a déjà créé "Data" une fois — la deuxième exécution entre en collision. Comme les règles sont identiques pour la création et le renommage, il vaut la peine de protéger le nom en un seul endroit :

Function SafeName(nm As String) As String
    nm = Left$(nm, 31)
    Dim bad As Variant, ch As Variant
    For Each ch In Array(":", "\", "/", "?", "*", "[", "]")
        nm = Replace(nm, ch, "-")
    Next ch
    SafeName = nm
End Function

Cela gère la longueur et les caractères illégaux ; l'unicité, vous la gérez en vérifiant d'abord, ce qui est l'objet de la section suivante.

Ajouter seulement si la feuille n'existe pas déjà

Il n'existe pas de Exists intégré pour les feuilles : c'est donc à vous d'éviter la collision au relancement. Vérifiez la collection par le nom avant d'ajouter, et réutilisez la feuille si elle est déjà là :

Function GetOrAddSheet(nm As String) As Worksheet
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If StrComp(ws.Name, nm, vbTextCompare) = 0 Then
            Set GetOrAddSheet = ws          ' reutilise celle qui existe
            Exit Function
        End If
    Next ws
    Set GetOrAddSheet = ThisWorkbook.Worksheets.Add(After:=Worksheets(Worksheets.Count))
    GetOrAddSheet.Name = nm                 ' libre de la nommer - on sait qu'elle est inutilisee
End Function

C'est le motif qui rend une macro d'ajout de feuille idempotente — sûre à exécuter deux fois — au lieu d'une macro qui marche la première fois puis déclenche 1004 à jamais. Le jugement : n'appelez jamais Add et .Name à l'aveugle dans une routine susceptible de tourner plus d'une fois ; recherchez d'abord le nom, et réutilisez ou créez.

Comment ExcelMaster vous aide

Ajouter une feuille ressemble à une seule ligne et cache trois décisions — capturer la valeur de retour, choisir une position et produire un nom légal et unique — et se tromper sur l'une d'elles échoue en silence (mauvais onglet renommé) ou bruyamment (erreur 1004 à la deuxième exécution).

ExcelMaster vous laisse dire ce que vous voulez — « ajoute une feuille mensuelle à la fin, nommée d'après le mois courant, et réutilise-la si elle est déjà là » — et il écrit la capture Set ws = Worksheets.Add(After:=...), ajoute au bon endroit, assainit le nom selon les règles des 31 caractères et des caractères illégaux, et vérifie d'abord la collection pour qu'une seconde exécution réutilise la feuille au lieu de planter. Vous gardez le classeur et le code.

Questions fréquentes

Comment ajouter une feuille et la nommer en VBA ?

Capturez la valeur de retour et définissez .Name dessus : Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count)) puis ws.Name = "Data". Il n'y a pas d'argument Name sur Add lui-même. Le nom doit compter 31 caractères ou moins, être unique dans le classeur, non vide, et exempt de : \ / ? * [ ], sinon .Name déclenche l'erreur d'exécution 1004.

Pourquoi ma nouvelle feuille apparaît-elle au mauvais endroit ?

Parce qu'un Worksheets.Add sans argument insère la feuille juste avant la feuille active, pas à la fin. Contrôlez-le avec Before:= ou After:=. Pour l'ajouter à la fin, utilisez Worksheets.Add(After:=Worksheets(Worksheets.Count)) ; pour la mettre en premier, utilisez Worksheets.Add(Before:=Worksheets(1)).

Pourquoi ai-je l'erreur 1004 en ajoutant ou en nommant une feuille ?

Presque toujours une violation des règles de nommage, et le plus souvent un doublon. Les noms de feuille doivent être uniques : relancer une macro qui a déjà créé "Data" entre en collision à la deuxième exécution. Les noms doivent aussi compter 31 caractères ou moins, être non vides, et exempts de : \ / ? * [ ]. Vérifiez le nom dans la collection avant d'ajouter, et assainissez d'abord la chaîne.

Comment ajouter une feuille seulement si elle n'existe pas déjà ?

Il n'y a pas de méthode Exists : parcourez donc la collection Worksheets et comparez les noms avec StrComp(ws.Name, nm, vbTextCompare) = 0. Si une correspondance est trouvée, réutilisez cette feuille ; sinon, appelez Add et nommez-la. En enveloppant cela dans une fonction GetOrAddSheet, la macro devient sûre à exécuter de façon répétée.

Comment ajouter une feuille tout à la fin du classeur ?

Ancrez-vous sur la dernière feuille de calcul : Worksheets.Add(After:=Worksheets(Worksheets.Count)). Worksheets(Worksheets.Count) est la dernière feuille de calcul : insérer après elle ajoute donc à la fin. N'utilisez Sheets.Count au lieu de Worksheets.Count que si vous voulez délibérément compter aussi les feuilles graphiques.

Testé dans

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

Guides associés : VBA Copy Sheet · VBA Delete Sheet · VBA Worksheets · VBA Worksheet · VBA ThisWorkbook