156 votes

Tester ou vérifier si la feuille existe

Dim wkbkdestination As Workbook
Dim destsheet As Worksheet

For Each ThisWorkSheet In wkbkorigin.Worksheets 
    'this throws subscript out of range if there is not a sheet in the destination 
    'workbook that has the same name as the current sheet in the origin workbook.
    Set destsheet = wkbkdestination.Worksheets(ThisWorkSheet.Name) 
Next

En gros, je passe en revue toutes les feuilles du classeur d'origine, puis j'active la fonction destsheet dans le classeur de destination vers la feuille portant le même nom que la feuille actuellement itérée dans le classeur d'origine.

Comment puis-je tester si cette feuille existe ? Quelque chose comme :

If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then

2 votes

4voto

X37V Points 49

Avec plusieurs années de retard, mais j'avais besoin de faire ça et je n'aimais aucune des solutions postées... J'en ai donc inventé une, grâce à la magie de (geste des mains arc-en-ciel de Bob l'éponge) "Evaluate()" !

Evaluate("IsError(" & vSheetName & "!1:1)")

Renvoie VRAI si la feuille n'existe pas ; FAUX si la feuille existe. Vous pouvez substituer n'importe quelle plage à "1:1", mais je vous déconseille d'utiliser une seule cellule, car si elle contient une erreur (par exemple, #N/A), elle retournera True.

0 votes

Je vois 2 bugs dans le code : (1) si la feuille existe, il y a Error 13 à cause de 1:1 (2) si le nom de la feuille contient un espace et existe, le code renvoie Faux. Pour éviter le problème #N/A, j'utilise la fonction CELL. Cela fonctionne pour moi : Evaluate("IsError(Cell(""col"",'" + vSheetName + "'!A1))") et ici pour sortir un sous si la feuille n'existe pas : If Evaluate("IsError(Cell(""col"",'" + vSheetName + "'!A1))") Then Exit Sub

3voto

Martin Carlsson Points 36

Mettez le test dans une fonction et vous pourrez le réutiliser et vous aurez une meilleure lisibilité du code.

N'utilisez PAS l'option "On Error Resume Next" car elle pourrait entrer en conflit avec d'autres parties de votre code.

Sub DoesTheSheetExists()
    If SheetExist("SheetName") Then
        Debug.Print "The Sheet Exists"
    Else
        Debug.Print "The Sheet Does NOT Exists"
    End If
End Sub

Function SheetExist(strSheetName As String) As Boolean
    Dim i As Integer

    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = strSheetName Then
            SheetExist = True
            Exit Function
        End If
    Next i
End Function

3voto

ScottMcC Points 1298

Pourquoi ne pas simplement utiliser une petite boucle pour déterminer si la feuille de calcul nommée existe ? Imaginons que vous recherchiez une feuille de calcul nommée "Sheet1" dans le classeur actuellement ouvert.

Dim wb as Workbook
Dim ws as Worksheet

Set wb = ActiveWorkbook

For Each ws in wb.Worksheets

    if ws.Name = "Sheet1" then
        'Do something here
    End if

Next

2voto

Philipp88 Points 99
Public Function WorkSheetExists(ByVal strName As String) As Boolean
   On Error Resume Next
   WorkSheetExists = Not Worksheets(strName) Is Nothing
End Function

sub test_sheet()

 If Not WorkSheetExists("SheetName") Then
 MsgBox "Not available"
Else MsgBox "Available"
End If

End Sub

2voto

Shrikant Points 454
    For Each Sheet In Worksheets
    If UCase(Sheet.Name) = "TEMP" Then
    'Your Code when the match is True
        Application.DisplayAlerts = False
        Sheet.Delete
        Application.DisplayAlerts = True
    '-----------------------------------
    End If
Next Sheet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X