TL;DR — Il n'existe pas de
Sheets.Exists. Écrivez une seule fonction, mettez-la dans chaque projet, et arrêtez d'improviser : tentez unSetde la feuille avec la gestion d'erreurs désactivée le temps d'une ligne, puis vérifiez si la variable vautNothing. Réglez trois détails et elle ne ment jamais : interrogez un classeur précis, pas celui qui se trouve être actif ; cherchez dansSheets, pas dansWorksheets, car une feuille graphique peut déjà porter le nom ; et passez le nom enString, car unVariantcontenant un nombre est lu comme une position. N'oubliez pas que les feuilles masquées existent aussi — « existe » ne veut pas dire « visible ».
Function SheetExists(ByVal sheetName As String, Optional wb As Workbook) As Boolean
Dim sh As Object
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set sh = wb.Sheets(sheetName)
On Error GoTo 0
SheetExists = Not sh Is Nothing
End Function
Voici le troisième volet d'une série de trois sur l'identité d'une feuille. Le nom d'onglet est une étiquette qui appartient à l'utilisateur. Renommer change cette étiquette, masquer retire l'onglet de l'écran sans mettre la feuille hors de portée, et vérifier l'existence, traité ici, est le contrôle que vous exécutez avant de vous fier à une étiquette. Tout code qui retrouve une feuille par un nom qu'un utilisateur a pu changer devrait d'abord poser cette question.
Ce que vous allez apprendre
- Le modèle mental : l'existence est une question sur un nom, dans un classeur
- La fonction, et la raison d'être de chacune de ses lignes
- Trois façons dont les versions courantes donnent la mauvaise réponse
- Boucle, On Error ou Evaluate : quelle approche utiliser, et quand
- Les motifs qui en dépendent : récupérer ou créer, supprimer si elle existe, noms uniques
- Vérifier une feuille dans un classeur fermé
Le modèle mental : un nom, un classeur, un espace de noms
« La feuille existe-t-elle ? » est toujours un raccourci pour une question plus étroite : ce classeur
contient-il une feuille, de quelque type que ce soit, dont le nom correspond à ce texte, sans distinction de
casse ? Chaque partie de cette phrase est un endroit où une vérification peut se tromper. Ce classeur —
pas le classeur actif par accident. Une feuille de quelque type que ce soit — feuilles de calcul et
feuilles graphiques partagent un seul ensemble de noms. Sans distinction de casse — pour Excel, SALES et
Sales sont le même nom.
Et une feuille qui existe n'est pas forcément à l'écran. Les feuilles masquées et très masquées sont toujours dans la collection : la vérification les trouve donc — ce qui est exactement ce qu'il faut quand vous êtes sur le point d'ajouter une feuille portant ce nom, car Excel refuserait le doublon même si l'utilisateur ne le voit pas.
La fonction, ligne par ligne
La version ci-dessus fait quatre choses, et chacune compte :
Dim sh As Object—Object, pasWorksheet, pour qu'une feuille graphique puisse être affectée sans incompatibilité de type.If wb Is Nothing Then Set wb = ThisWorkbook— une valeur par défaut choisie délibérément, au lieu duActiveWorkbookimplicite qu'utiliserait unSheetsnon qualifié.On Error Resume Next...On Error GoTo 0— les erreurs sont ignorées pour une seule ligne, exactement. La recherche déclenche l'erreur 9 quand le nom est absent, et c'est précisément la réponse que nous voulons ; toute autre erreur ailleurs reste visible. Le guide On Error explique pourquoi l'interrupteur doit toujours être remis en place.SheetExists = Not sh Is Nothing— si la recherche a échoué,shn'a jamais été défini et vaut toujoursNothing.
Utilisez-la partout où un nom vient de l'extérieur de votre code — une cellule, un utilisateur, un nom de fichier :
If SheetExists("Summary") Then
ThisWorkbook.Sheets("Summary").Range("A1").Value = Date
Else
MsgBox "La feuille Summary est introuvable."
End If
Debug.Print SheetExists("Rates", Workbooks("Prices.xlsx")) ' interroger un autre classeur ouvert
Trois façons dont les versions courantes donnent la mauvaise réponse
1. Interroger le mauvais classeur. Beaucoup d'extraits appellent Sheets(name) sans classeur devant.
Cela cherche dans le classeur actif au moment où la ligne s'exécute — qui n'est plus celui que vous visiez
dès que votre macro a ouvert un second fichier. La vérification répond « absente », la ligne suivante ajoute
une feuille au mauvais classeur, et rien ne déclenche d'erreur. Passez toujours le classeur, ou définissez-le
explicitement par défaut, comme le fait la fonction.
2. Chercher dans Worksheets au lieu de Sheets. Worksheets ne contient que les feuilles de calcul ;
Sheets contient aussi les feuilles graphiques. Les noms sont uniques sur les deux. Si une feuille
graphique s'appelle Summary, une vérification sur Worksheets indique donc que le nom est libre, et
ws.Name = "Summary" échoue ensuite avec l'erreur 1004. Pour la question « puis-je utiliser ce nom ? », la
seule collection correcte est Sheets.
3. Passer un nombre par accident. Sheets(3) désigne la troisième feuille ; Sheets("3") désigne la
feuille nommée 3. Si le nom arrive dans un Variant — depuis une cellule, par exemple — et que la cellule
contient le nombre 3, la recherche se fait par position et trouve la feuille qui se trouve en troisième
place, quelle qu'elle soit. La vérification répond « existe » pour une feuille qui n'a rien à voir avec le
nom. Déclarer le paramètre ByVal sheetName As String force la conversion en texte avant la recherche, et
c'est pourquoi la signature compte.
Boucle, On Error ou Evaluate
Vous rencontrerez trois approches. Voici comment elles se comparent :
| Approche | Comment | Verdict |
|---|---|---|
On Error + Set |
tenter la recherche, vérifier Nothing |
par défaut — une seule recherche, sémantique exacte d'Excel |
Boucle + StrComp |
comparer chaque nom, sans distinction de casse | clair ; à utiliser quand vous cherchez un motif, pas un nom |
Evaluate("ISREF(...)") |
construire une référence de formule et la tester | à éviter — casse sur les apostrophes et les feuilles graphiques |
La boucle est le bon outil quand « existe » signifie en réalité « n'importe quelle feuille dont le nom commence par 2026 » :
Function FirstSheetLike(wb As Workbook, ByVal pattern As String) As Object
Dim sh As Object
For Each sh In wb.Sheets
If LCase$(sh.Name) Like LCase$(pattern) Then
Set FirstSheetLike = sh
Exit Function
End If
Next sh
End Function
' Set sh = FirstSheetLike(ThisWorkbook, "2026-*") ' Nothing si aucune ne correspond
L'astuce Evaluate — Evaluate("ISREF('" & name & "'!A1)") — a l'air astucieuse et échoue de façon
discrète : un nom contenant une apostrophe casse la formule à moins de la doubler, une feuille graphique n'a
pas de A1 et renvoie False, et la formule est évaluée par rapport au classeur actif. Elle économise deux
lignes et vous coûte trois bugs.
Les motifs construits dessus
Presque chaque usage de la vérification relève de l'un de trois motifs, et chacun a son propre guide :
' Recuperer ou creer : reutiliser la feuille si elle est la, sinon l'ajouter
If SheetExists("Log") Then
Set ws = ThisWorkbook.Worksheets("Log")
Else
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = "Log"
End If
' Supprimer si elle existe : pas d'erreur 9 quand elle a deja disparu
If SheetExists("Temp") Then
Application.DisplayAlerts = False
ThisWorkbook.Sheets("Temp").Delete
Application.DisplayAlerts = True
End If
Le guide Add Sheet couvre le premier en détail, le
guide Delete Sheet le deuxième, y compris la règle de la dernière feuille
visible. Le troisième consiste à générer un nom libre — Report (2), Report (3) — ce que le
guide Rename Sheet construit par-dessus SheetExists.
Le jugement : vérifier les noms, ne pas s'y fier
La vérification existe parce que les noms sont fragiles. Elle sécurise le code qui doit passer par un nom — feuilles créées par l'utilisateur, noms saisis dans une cellule, fichiers venus de l'extérieur. Ce n'est pas une raison pour continuer à retrouver vos propres feuilles par leur nom. Pour les feuilles qui appartiennent à votre outil, utilisez le CodeName et il n'y a plus rien à vérifier. Ma règle : si un nom vient d'une personne, vérifiez-le ; si la feuille vient de vous, ne la cherchez pas du tout par son nom. Et pour un classeur fermé, il n'existe aucun raccourci digne de confiance : ouvrez-le en lecture seule, vérifiez avec la même fonction, puis refermez-le.
Comment ExcelMaster vous aide
Les bugs d'existence ressemblent rarement à des bugs d'existence. Ils ressemblent à une feuille ajoutée au mauvais classeur, à un renommage qui échoue parce qu'une feuille graphique portait déjà le nom, ou à une macro qui écrit les chiffres d'un mois dans la feuille numéro 3 parce qu'une cellule contenait un nombre au lieu d'un texte.
ExcelMaster vous laisse décrire la tâche — « pour chaque région de la colonne A, réutilise sa feuille si elle existe, sinon crée-la » — et écrit la vérification sur le bon classeur et la bonne collection, avec le nom passé en texte, pour que la logique récupérer-ou-créer fasse bien ce qu'elle annonce.
Questions fréquentes
Comment vérifier si une feuille existe en VBA ?
Il n'existe pas de méthode intégrée : utilisez donc une petite fonction. Désactivez la gestion d'erreurs,
tentez Set sh = wb.Sheets(name), réactivez-la, et renvoyez Not sh Is Nothing. Elle trouve les feuilles
de calcul et les feuilles graphiques, visibles ou masquées, et ignore la casse comme le fait Excel.
Comment vérifier si une feuille existe dans un autre classeur ?
Passez ce classeur à la fonction, par exemple SheetExists("Rates", Workbooks("Prices.xlsx")). Le classeur
doit être ouvert. S'il est fermé, ouvrez-le en lecture seule, lancez la vérification, puis refermez-le.
La vérification du nom de feuille respecte-t-elle la casse ?
Non. Excel traite Sales, SALES et sales comme le même nom : la recherche via Sheets(name) ne
distingue donc pas la casse. Si vous parcourez et comparez les noms vous-même, utilisez
StrComp(a, b, vbTextCompare) ou comparez des valeurs LCase$ pour obtenir le même résultat.
Pourquoi ma vérification dit-elle qu'une feuille n'existe pas alors que je ne peux pas l'ajouter ?
En général parce que la vérification a cherché dans Worksheets et que le nom est utilisé par une feuille
graphique, qui n'apparaît que dans Sheets. Les noms doivent être uniques sur les deux : vérifiez donc sur
Sheets. Une feuille masquée peut aussi porter le nom ; la vérification la trouve, mais vous ne la voyez pas
dans la barre d'onglets.
Une feuille masquée compte-t-elle comme existante ?
Oui. Les feuilles masquées et très masquées sont toujours dans la collection Sheets : la vérification
renvoie donc True pour elles. Si vous devez savoir si l'utilisateur peut la voir, testez
sh.Visible = xlSheetVisible après la vérification.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 30/09/2026.
Guides associés : VBA Rename Sheet · VBA Hide Sheet · VBA Add Sheet · VBA Delete Sheet · VBA Worksheets · VBA On Error · VBA Like · VBA Open Workbook
