Dans cet article, vous trouverez une fonction VBA très utile – vérification si une Feuille particulière existe dans le Classeur Excel. Cette fonction peut être utilisée telle quelle, il vous suffit de la copier dans un Module de votre Projet VBA.
VBA – vérifier si une Feuille existe
Pour éviter des erreurs lors d'exécution d'un code VBA, il est préférable de s'assurer que tous les Objets (Classeurs, Feuilles,…) qui doivent être manipulés existent bel et bien. Rien de plus pénible qu'une macro bloquée parce que l'utilisateur a supprimé une des Feuilles requises. Il est préférable de s'assurer soi-même si tous les éléments nécessaires à la macro sont présents et si ce n'est pas le cas, cela nous permettra de terminer la macro "proprement" avec (éventuellement) un message d'erreur indiquant ce qui empêche l'exécution correcte de la macro. Ceci fait tout simplement partie des bonnes pratiques de la programmation…
La fonction VBA qui suit teste si la Feuille (dont le nom est utilisé comme argument de la fonction), est présente dans le Classeur. Elle retourne VRAI
ou FAUX
(ou TRUE
/ FALSE
) en tant que Boolean
.
Et voici donc le code de la fonction VBA prêt à l'utilisation:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Public Function FeuilleExiste(FeuilleAVerifier As String) As Boolean 'fonction qui vérifie si la "FeuilleAVerifier" existe dans le Classeur actif 'par Excel-Malin.com ( https://excel-malin.com ) On Error GoTo SiErreur Dim Feuille FeuilleExiste = False For Each Feuille In Sheets If UCase(Feuille.Name) = UCase(FeuilleAVerifier) Then FeuilleExiste = True Exit Function End If Next Feuille Exit Function SiErreur: FeuilleExiste = CVErr(xlErrNA) End Function |
Exemple d'utilisation de la fonction
L'exemple suivant teste si la Feuille "Test_1" est présente dans le Classeur et si oui, la renomme en "Test_2". Si la Feuille n'existe pas, un message est affiché à l'utilisateur.
Attention: pour faire fonctionner cet exemple, vous avez besoins des deux codes VBA (le code de la fonction plus haut & le code de l'exemple qui suit).
1 2 3 4 5 6 7 8 9 10 |
Sub Test() 'exemple d'utilisation de la fonction "FeuilleExiste" If FeuilleExiste("Test_1") = True Then Sheets("Test_1").Name = "Test_2" Else MsgBox "La Feuille 'Test_1' n'existe pas!" End If End Sub |
Attention aux solutions "trop" faciles
Vous allez peut-être trouver cette fonction "longue" par rapport à ce qu'elle fait. Et c'est vrai que sur internet, vous pouvez trouver des solution plus "courtes" mais attention aux solutions trop faciles!
Nombreuses fonctions que vous pouvez trouver sur le net utilisent la méthode "directe" – c'est-à-dire activer (Activate
) directement la Feuille que l'on veut tester et ensuite vérifier si la fonction fonctionne ou se solde par une erreur. Si la Feuille "MaFeuille"
n'existe pas, le code Sheets("MaFeuille").Activate
va déclencher une erreur. Et certains utilisent ce déclenchement d'erreur comme preuve que la Feuille en question n'existe pas…
Mais est-ce la meilleure manière de créer une programme? Dans des macros / applications VBA plus complexes, cela ne peut que créer des problèmes. Donc, cette solution "miracle" est à utiliser en toute connaissance de cause…
Le code VBA qui suit est la fonction "courte" proposée par Cduigou dans les commentaires. Elle n'active pas les feuilles mais utilise la méthode de la "preuve par l'erreur". Vous pouvez donc choisir laquelle vous voulez utiliser.
1 2 3 4 5 6 7 |
Public Function FeuilleExiste(FeuilleAVerifier As String) As Boolean 'fonction qui vérifie si la "FeuilleAVerifier" existe dans le Classeur actif On Error Resume Next Sheets(FeuilleAVerifier).Name = Sheets(FeuilleAVerifier).Name FeuilleExiste = (Err.Number = 0) End Function |
Remarque finale
N'oubliez pas qu'un Classeur Excel peut contenir des Feuilles que vous ne voyez pas directement. Les Feuilles peuvent avoir 3 status différents: visible, masqué & caché.
Pour plus d'informations dans le tutoriel Visibilité des Feuilles dans Excel
Comme vous pouvez constater dans cet exemple – les Feuilles 1, 2, 3 & 6 sont visibles; La Feuille 4 est masquée, tandis que la Feuille 5 est cachée…
Pourrait également vous intéresser
Et pour terminer, voici quelques autres articles qui pourraient vous être utiles…
- VBA: vérifier si un Classeur est ouvert
- Trier les Feuilles par ordre alphabétique
- VBA: déterminer la version d’Excel
- Comment utiliser RECHERCHEV en VBA
- Débloquer VBA dans les fichiers venant d'Internet
- Cours VBA en ligne: "VBA: Droit au but"
14 commentaires sur “VBA & Excel: Vérifier si une Feuille existe”
Effectivement plus propre. Mais il faut rajouter des UCase dans la comparaison des noms des feuilles. En effet, pour Excel, deux feuilles ne peuvent pas avoir le nom "Feuil1" et "feuil1".
Merci pour votre remarque Raphaël.
Elle est tout à fait pertinente.
Si on a une feuille 'test',
le code
Sheets("test").Range("A1").Value = 5
va fonctionnermais le code
Sheets("Test").Range("A1").Value = 5
va fonctionner également même si la feuille 'Test' "n'existe pas"…J'adapte le code pour tenir compte de votre remarque.
Cordialement, Martin
Plusieurs remarques sur votre article.
1) vous ne traitez que des WorkSheets : or il existe d'autres types de feuilles comme les feuilles graphiques par exemple. Il vaudrait mieux généraliser votre procédure avec Sheets plutot que WorkSheets.
2) Vous déclarez de façon péremptoire que se servir de la gestion d'erreur n'est pas "professionnel". Cela n'engage que vous. On peut répondre que si Microsoft en VB puis VBA a fourni l'instruction On Error, ce n'est pas pour les chiens !
3) Je suis d'accord avec vous sur l'utilisation de la méthode Activate qui a pour effet de modifier l'état du classeur en changeant éventuellement la feuille active. A exclure donc. Voici une autre technique :
Public Function FeuilleExiste(FeuilleAVerifier As String) As Boolean
'fonction qui vérifie si la "FeuilleAVerifier" existe dans le Classeur actif
On Error Resume Next
Sheets(FeuilleAVerifier).Name = Sheets(FeuilleAVerifier).Name
FeuilleExiste = (Err.Number = 0)
End Function
Bonjour Cduigou,
merci pour votre commentaire. Voici pour les différents points:
1) merci pour cette remarque, j'ai modifié la fonction dans ce sens
2) je ne dis pas que
On Error
est pour les chiens. Je trouve juste que le "error handling" sert à gérer les "vrais" erreurs. Déclencher les erreurs exprès ne me semble pas être la meilleure pratique. Même si cela peut fonctionner quand c'est utilisé correctement, cela peut aussi créer des problèmes dans le cas contraire. Et comme mon site est consulté par de nombreux débutants, je préfère ne pas les embrouiller mais de leur fournir du code facilement lisible et compréhensible. Mais cela n'engage que moi 😉3) j'ai ajouté votre fonction dans le contenu de la page. Ainsi, le lecteur aura plus de choix…
Cordialement, Martin
Bonjour
une fonction pour assigner un titre à une feuille après vérification s'elle existe dans le classeur
Function kFixerNomFeuille(fn As String) As String
Dim i As Long
Dim ss As String
kFixerNomFeuille = fn
ss = fn
For i = 1 To 999
If FeuilleExiste(ss) = False Then kFixerNomFeuille = ss: Exit For
ss = fn + Trim(CStr(i))
Next
End Function
Bonjour,
à noter que les feuilles disposent d'une propriété de visibilité xlVeryHidden qui les rend inaccessibles (avec génération d'erreur) même si elles existent effectivement dans le classeur.
On ne peut y accéder qu'après les avoir rendues visibles par programme et peuvent alors échapper alors à ce type de test.
Elles peuvent même poser problème si elles sont en première place et que l'on tente un Sheets(1).Select par exemple !
Je m'en sers parfois comme feuilles "modèles".
Bjr, la fonction ExisteFeuille semble ne pas accepter en parametre une variable contenant le nom de la feuille. y a til une solution pour contourner ce problème. merci pour votre réponse
Georges
Bonjour,
si le nom de la feuille est dans une variable, assurez-vous que la variable est déclarée et qu'elle est de type "String".
Ce code-ci (sans la déclaration) va se planter:
Par contre le code suivant (avec la variable déclarée) va fonctionner normalement:
bonjour, merci pour l'article, je rebondis sur le commentaire de Georges, comment peut-on faire si le nom de la feuille est contenu dans une variable ?
Bonjour,
si le nom de la feuille est dans une variable, assurez-vous que la variable est déclarée et qu'elle est de type "String".
Ce code-ci (sans la déclaration) va se planter:
Par contre le code suivant (avec la variable déclarée) va fonctionner normalement:
C'est exactement ça, c'est parfait, merci pour votre réponse, je ne trouvais rien ailleurs !
Il y a aussi la solution qui ne passe pas par une erreur :
boucler sur toutes les feuilles qui existe et contrôler si le nom existe
Bonjour,
oui, c'est justement le principe du code que je propose…
Merci pour toutes vos informations utiles
Je tiens à signaler que la deuxième fonction fonctionne mieux que la première car si on modifie le nom est qu'on ne valide pas alors la première plante et la deuxième fait bien son travail.