par , 17/10/2019 à 09h00 (3755 Affichages)
Salut
Il arrive souvent que l'on doive manipuler une feuille dans Excel, et se pose la question de savoir si elle existe. Sur les forums, on voit alors des "solutions" telles que l'utilisation de On Error... censée gérer le fait que la feuille n'est pas trouvée, ou encore une boucle For Each... avec un sale Exit For dès qu'on a trouvé la feuille... Beerkkk
La gestion des exeptions (ce que fait On Error) n'a pas sa place ici. La "programmation par l'erreur" n'est à mon sens pas une bonne programmation. Quant à l'utilisation de Exit dans du code, j'ai déjà dit ce que j'en pensais dans ce billet.
Je vous propose deux codes, l'un pour trouver la feuille par son nom, l'autre par son codename. Ces fonctions reçoivent le nom (ou le codename) en premier argument obligatoire, et en second argument optionnel, le classeur (ouvert) dans lequel il faut chercher ladite feuille. Si ce classeur n'est pas précisé, le code cherchera la feuille dans le classeur actif.
Snippet pour rechercher une feuille par son nom (le nom de l'onglet)
1 2 3 4 5 6 7 8 9 10 11
| Function getSheetByName(Name As String, Optional wb As Workbook) As Object
Dim sh As Object
Dim Counter As Long
If wb Is Nothing Then Set wb = ActiveWorkbook
Counter = 1
Do While Counter <= wb.Sheets.Count And getSheetByName Is Nothing
If StrComp(wb.Sheets(Counter).Name, Name, vbTextCompare) = 0 Then Set getSheetByName = wb.Sheets(Counter)
Counter = Counter + 1
Loop
End Function |
Snippet pour rechercher une feuille par son CodeName (le nom VBA de la feuille).
1 2 3 4 5 6 7 8 9 10 11
| Function getSheetByCodeName(CodeName As String, Optional wb As Workbook) As Object
Dim sh As Object
Dim Counter As Long
If wb Is Nothing Then Set wb = ActiveWorkbook
Counter = 1
Do While Counter <= wb.Sheets.Count And getSheetByCodeName Is Nothing
If StrComp(wb.Sheets(Counter).CodeName, CodeName, vbTextCompare) = 0 Then Set getSheetByCodeName = wb.Sheets(Counter)
Counter = Counter + 1
Loop
End Function |
Ces codes permettent de manipuler directement la feuille ou de l'affecter à une variable. Pour déterminer qu'une feuille existe sans vouloir l'affecter à une variable, il suffira de déterminer que la fonction renvoie autre chose que Nothing. Fidèle à ma volonté de me simplifier la vie, j'ai donc créé les fonctions qui permettent uniquement de savoir si une feuille existe.
Fonction qui vérifie qu'une feuille existe avec le nom d'onglet souhaité
1 2 3
| Function SheetByNameExists(Name As String, Optional wb As Workbook) As Boolean
SheetByNameExists = Not getSheetByName(Name, wb) Is Nothing
End Function |
Fonction qui vérifie qu'une feuille existe avec le CodeName souhaité
1 2 3
| Function SheetByCodeNameExists(CodeName As String, Optional wb As Workbook) As Boolean
SheetByCodeNameExists = Not getSheetByCodeName(CodeName, wb) Is Nothing
End Function |
Il pourrait être plus intéressant, si l'on ne veut que savoir si la feuille existe, de créer une fonction qui le dit explicitement (j'aime bien travailler sur l'intention du code) et qui renvoie VRAI ou FAUX en fonction de l'(in)existence de la feuille, sans passer par la création de l'objet.
1 2 3 4 5 6 7 8 9
| Function SheetExists(Name As String, Optional wb As Workbook) As Boolean
Dim Counter As Long: Counter = 1
If wb Is Nothing Then Set wb = ActiveWorkbook
Do While Counter <= wb.Sheets.Count And Not SheetExists
SheetExists = StrComp(Name, wb.Sheets(Counter).Name, vbTextCompare) = 0
Counter = Counter + 1
Loop
End Function |
Bien entendu, ces fonctions trouveront leur place dans le module générique xlTools que j'embarque dans tous mes développements.
NB: Mes snippets sont toujours indépendants de Option Compare et Option Base. C'est pourquoi j'utilise la fonction StrCompare et pas la simple égalité, car par défaut (pas de Option Compare ou Option Compare Binary), VBA réalise la comparaison en différenciant les majuscules des minuscules.