TL;DR —
Worksheets.Addrenvoie 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 : unWorksheets.Addsans argument dépose la feuille à gauche de la feuille active (pas à la fin), et vous ne pouvez pas passer le nom dans l'appelAdd— vous définissez.Nameensuite, 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 —
Addrenvoie la nouvelle feuille : capturez-la et cessez d'utiliserActiveSheet - La règle qui évite la plupart des bugs — affectez la valeur de retour à une variable
Worksheet - Pourquoi un
Addsans argument place la feuille à gauche, et commentBeforeetAftercorrigent cela - Pourquoi vous ne pouvez pas nommer la feuille dans
Add, et les règles qui font que.Namedé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 :
ActiveSheetaprèsAddpointe en général sur la nouvelle feuille — mais pas si un événement, unCalculateou 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
