Vérifier l'existence d'une feuille de classeur
Bonjour,
Dans un outil crée en VBA plutôt avancé maintenant, une étape introduite dans le système de gestion d'erreurs ne se réalise pas. Elle consiste à vérifier si une feuille de classeur existe dans un fichier de données d'entrée à injecter dans l'outil par ailleurs.
Voici un bout de code VBA :
N = Workbooks(Inputfilename).Worksheets.count
For I = 1 To N
WS_NAME = Workbooks(Inputfilename).Worksheets(I).Name
If WS_NAME = InputSheetName Then Flag = 1
Next I
If Flag = 1 Then
MsgBox "Sheet exists"
Else
MsgBox "Sheet does not exist"
End IfLes variables ont été déclarées bien en amont et ne contiennent aucune erreur.
"'flag" est un drapeau donnant une indication sur la détection d'une erreur, utile dans une autre partie de l'outil.
Ce que j'obtient :
Cas 1 : "Feuille de classeur inexistante" après une déclaration d'un nom de feuille de classeur inexistant dans le fichier de données d'entrée, contenu dans InputSheetname (NORMAL !)
Cas 2 : "Feuille de classeur inexistante" après une déclaration d'un nom de feuille de classeur existant dans le fichier de données d'entrée, contenu dans InputSheetname (Je ne comprends pas...). En vérité, le drapeau vire à 1 et la boucle cesse sans avoir parcouru l'ensemble des feuilles déjà existantes autrement dit s'il détecte une incohérence dès la première feuille alors
Ce que je voudrais obtenir :
"Feuille de classeur inexistante" après une déclaration d'un nom de feuille de classeur inexistant dans le fichier de données d'entrée, contenu dans InputSheetname seulement.
Si vous avez une suggestion....
Bonjour
A tester
Dim sheetExists As Boolean
sheetExists = False
Workbooks.Open (pathIF)
nbre = Workbooks(Inputfilename).Worksheets.count
For i = 1 To nbre
WS_NAME = Workbooks(Inputfilename).Worksheets(i).Name
' Vérifiez si le nom de la feuille actuelle correspond à InputSheetName
If WS_NAME = InputSheetName Then
sheetExists = True
Exit For ' Une feuille correspondante a été trouvée, on peut sortir de la boucle
End If
Next i
' Après la boucle, vérifiez si la feuille existe
If Not sheetExists Then
MsgBox "Feuille de classeur inexistante."
flag = True
Exit Sub
End IfLe problème que vous rencontrez vient de l’utilisation de l’opérateur Like dans votre condition. Actuellement, votre code vérifie si le nom de la feuille (WS_NAME) ne correspond pas à InputSheetName, ce qui peut être problématique si vous ne vérifiez que l’inexistence.
Pour corriger cela et s’assurer que vous n’affichez le message d’erreur que lorsque la feuille n’existe pas, vous devez changer votre logique pour vérifier si InputSheetName existe parmi les noms des feuilles de calcul.Messieurs,
Je n'ai pas encore lu vos messages car j'ai modifié l'énoncé de départ à l'instant. Donc le bout de code de départ introduit plus tôt n'est plus valide. Je viens d'intégrer le nouveau qui est correct.
Désolé
Bonjour,
A mon avis votre bout de code est trop succin pour bien analyser le problème. Notamment votre flag partagé c'est selon moi une fausse bonne idée (risque de mélanges).
C'est pourquoi je vous propose une alternative "Réutilisable" et robuste : passer par une petite fonction.
Public Function DoesSheetExistsInWb(sheetName As String, wb As Workbook, Optional method As VbCompareMethod = vbTextCompare) As String
Dim ws As Worksheet
For Each ws in wb.Worksheets
If StrComp(ws.Name, sheetName, method) = 0 Then
DoesSheetExistsInWb = "Sheet exists"
' très important : il faut arreter la boucle et quitter immédiatement la fonction si trouvé
Exit Function
End If
Next ws
' boucle terminée => la feuille n'existe pas
DoesSheetExistsInWb = "Sheet does not exist"
End Function
Public Sub Example()
' valeurs d'exemple
Dim WS_NAME As String: WS_NAME = "test"
Dim Inputfilename As String: Inputfilename = ThisWorkbook.Name
MsgBox DoesSheetExistsInWb(WS_NAME, Workbooks(Inputfilename))
End SubVous pouvez affiner la comparaison des noms (majuscule, etc) avec le 3e argument optionnel. Cf. StrComp function (Visual Basic for Applications) | Microsoft Learn
Dim SH As Worksheet, Nom As String, InputFileName As String
InputFileName = "..."
Nom = "..."
On Error Resume Next
Set SH = Workbooks(InputFileName).Worksheets(Nom) 'essayer d'assigner votre feuille à Sh
On Error GoTo 0
If SH Is Nothing Then
MsgBox "Sheet does not exist", vbCritical, Nom
Else
MsgBox "Sheet exists", vbInformation, Nom
End IfBonjour à tous,
@Aphrodite, Vous devez apprendre à faire des fonctions qui ne vont pas à l'encontre du SRP. Cela vous facilitera le code et la compréhension de celui-ci.
De petits exemples :
Ici une fonction qui renvoie un boolean :
'@Description "Teste si une feuille existe. Renvoie un boolean"
Public Function IsSheetExists(ByVal SheetName As String, Optional ByVal Workbook As Excel.Workbook) As Boolean
Dim localWorkbook As Excel.Workbook
Set localWorkbook = Workbook
If localWorkbook Is Nothing Then Set localWorkbook = ThisWorkbook
Dim localWorksheet As Excel.Worksheet
For Each localWorksheet In localWorkbook.Worksheets
Dim Exists As Boolean
If StrComp(localWorksheet.Name, SheetName, vbTextCompare) = 0 Then Exists = True
Next
IsSheetExists = Exists
End FunctionUn autre qui renvoie un objet Worksheet la sélection est faite par son nom de code, renvoie Nothing si pas trouvée.
' // GetSheetByCodeName By Philippe Tulliez www.magicoffice.be le : 07/04/2022
'@Description "Renvoie un objet Sheet ou Worksheet si trouvé ou Nothing dans le cas contraire."
Public Function GetSheetByCodeName(ByVal CodeName As String, _
Optional ByVal Workbook As Workbook) As Object
Dim localWorkbook As Workbook
Set localWorkbook = Workbook
If localWorkbook Is Nothing Then Set localWorkbook = ThisWorkbook
With localWorkbook
Dim Index As Long
Do
Index = Index + 1
If StrComp(.Sheets(Index).CodeName, CodeName, vbTextCompare) = 0 Then
Set GetSheetByCodeName = .Sheets(Index)
End If
Loop While Index < .Sheets.count And GetSheetByCodeName Is Nothing
End With
End FunctionEt l'utilisation devient très simple :
Public Sub test101()
Dim searchedSheet As String
searchedSheet = "Feuil1"
Select Case IsSheetExists(searchedSheet)
Case True
Dim returnedValue As String
returnedValue = "existe"
Case False
returnedValue = "n'existe pas"
End Select
MsgBox "La feuille " & searchedSheet & Space(1) & returnedValue & " dans le classeur !", vbOKOnly, "Gestion des feuilles"
End SubEdit:
J'ai oublié l'exemple pour la deuxième fonction :
Public Sub test102()
Dim searchedSheetName As String
Dim searchedSheet As Object
Set searchedSheet = GetSheetByCodeName("Feuil2")
If searchedSheet Is Nothing Then
Set searchedSheet = ThisWorkbook.Worksheets.Add(before:=ThisWorkbook.Worksheets(1))
With searchedSheet
If Not ActiveSheet Is searchedSheet Then .Activate
.Name = "le nouveau nom"
End With
End If
End SubBonjour à tous,
Une fonction toute basique sur les traces de BsAlv
Function SheetExist(WbkName As String, ShtName As String) As Boolean
Dim Sht As Worksheet
On Error Resume Next
Set Sht = Workbooks(WbkName).Worksheets(ShtName) 'essayer d'assigner votre feuille à Sh
On Error GoTo 0
' Retourner la valeur
SheetExist = Not Sht Is Nothing
End FunctionQue l'on appelle par
Flag = SheetExist("NomDuClasseur", "NomDeLaFeuille")Bonne journée
Bonjour
Une vieillerie qui marche toujours
Function ExistWorkSheet(Classeur As String, Feuille As String) As Boolean
Dim CF As Worksheet
Set CF = Workbooks(Classeur).Worksheets(Feuille)
ExistWorkSheet = Evaluate("ISREF('" & CF.Name & "'!A1)")
End FunctionAppelée par
Flag = ExistWorkSheet("NomClasseur","NomFeuille")EDIT :
Erreur de ma part. Remplacer par
Function ExistWorkSheet(Classeur As String, Feuille As String) As Boolean
'Classeur doit être ouvert
ExistWorkSheet = Evaluate("ISREF('[" & Classeur & "]" & Feuille & "'!A1)")
End Function@chris si je ne m'abuse tu lèves une erreur "ref" justement sur l'instruction
Set CF = Workbooks(Classeur).Worksheets(Feuille)Si la feuille en question n'existe pas. D'où le on error de BsAlv et Joco.
bonjour,
on error resume next
Workbooks(Classeur).Worksheets(Feuille).name=Workbooks(Classeur).Worksheets(Feuille).name
msgbox iif(cbool(err),"Ok","Ko")
on error goto 0RE
@chris si je ne m'abuse tu lèves une erreur "ref" justement sur l'instruction
Set CF = Workbooks(Classeur).Worksheets(Feuille)Si la feuille en question n'existe pas. D'où le on error de BsAlv et Joco.
J'ai voulu simplifier la chaîne et me suis planté
Ceci suffit si le classeur est ouvert
Function ExistWorkSheet(Classeur As String, Feuille As String) As Boolean
ExistWorkSheet = Evaluate("ISREF('[" & Classeur & "]" & Feuille & "'!A1)")
End FunctionBonjour,
J'ai essayé une méthode : c'est l'une de celles d'entre vous. J'en essaierai une autre.
On Error Resume Next
workbooks.open(pathIF)
Set SH = Workbooks(InputFileName).Worksheets(Nom)
On Error GoTo 0
If SH Is Nothing Then
MsgBox "Sheet does not exist", vbCritical, Nom
Else
MsgBox "Sheet exists", vbInformation, Nom
End IfElle fonctionne a priori.