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 If

Les 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 If
Le 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 Sub

Vous 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 If

Bonjour à 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 Function

Un 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 Function

Et 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 Sub

Edit:

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 Sub

Bonjour à 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 Function

Que 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 Function

Appelé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 0

RE

@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 Function

Bonjour,

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 If

Elle fonctionne a priori.

Rechercher des sujets similaires à "verifier existence feuille classeur"