web-dev-qa-db-fra.com

Tester ou vérifier si la fiche 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

Fondamentalement, je parcoure toutes les feuilles du classeur Origin, puis assigne destsheet dans le classeur de destination à la feuille portant le même nom que celui actuellement itéré dans le classeur Origin.

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

If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then 
83
yse

Certaines personnes n'apprécient pas cette approche en raison d'une utilisation "inappropriée" du traitement des erreurs, mais je pense que cela est considéré comme acceptable dans VBA ... Une approche alternative consiste à boucler toutes les feuilles jusqu'à ce que vous trouviez une correspondance.

 Function WorksheetExists(shtName As String, Optional wb As Workbook) As Boolean
    Dim sht As Worksheet

     If wb Is Nothing Then Set wb = ThisWorkbook
     On Error Resume Next
     Set sht = wb.Sheets(shtName)
     On Error GoTo 0
     WorksheetExists = Not sht Is Nothing
 End Function
138
Tim Williams

Si vous êtes spécifiquement intéressé par les feuilles de calcul uniquement, vous pouvez utiliser un simple appel d'évaluation:

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)")
End Function
81
Rory

Pour ce faire, vous n'avez pas besoin du traitement des erreurs. Tout ce que vous avez à faire est de parcourir toutes les feuilles de travail et de vérifier si le nom spécifié existe:

For i = 1 To Worksheets.Count
    If Worksheets(i).Name = "MySheet" Then
        exists = True
    End If
Next i

If Not exists Then
    Worksheets.Add.Name = "MySheet"
End If
36
fbonetti

Comme la recherche de membres d'une collection est un problème général, voici une version abstraite de la réponse de Tim:

La fonction 
 Contient (objCollection As Object, strName as String) As Boolean 
 Dim o comme objet 
 On Error Resume Next 
 définir o = objCollection (strName) 
 Contient = (Err.Number = 0) 
 Err.Clear 
 Fonction de fin 

Cette fonction peut être utilisée avec n’importe quelle collection comme objet (Shapes, Range, Names, Workbooks, etc.).

Pour vérifier l'existence d'une feuille, utilisez If Contains(Sheets, "SheetName") ...

20
Peter Albert

Corrigé: Sans traitement des erreurs:

Function CheckIfSheetExists(SheetName As String) As Boolean
      CheckIfSheetExists = False
      For Each WS In Worksheets
        If SheetName = WS.name Then
          CheckIfSheetExists = True
          Exit Function
        End If
      Next WS
End Function
14
Shai Alon

Ma solution ressemble beaucoup à celle de Tims mais fonctionne également dans le cas de feuilles non fonctionnelles - graphiques

Public Function SheetExists(strSheetName As String, Optional wbWorkbook As Workbook) As Boolean
    If wbWorkbook Is Nothing Then Set wbWorkbook = ActiveWorkbook 'or ThisWorkbook - whichever appropriate
    Dim obj As Object
    On Error GoTo HandleError
    Set obj = wbWorkbook.Sheets(strSheetName)
    SheetExists = True
    Exit Function
HandleError:
    SheetExists = False
End Function

.

5
uildriks

J'ai écrit celui-ci:

Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function
4
AOBR

Si vous êtes un fan de WorksheetFunction. ou si vous travaillez dans un pays non anglais avec un Excel non anglais, voici une bonne solution:

WorksheetFunction.IsErr(Evaluate("'" & wsName & "'!A1"))

Ou dans une fonction comme celle-ci:

Function WorksheetExists(sName As String) As Boolean
    WorksheetExists = Not WorksheetFunction.IsErr(Evaluate("'" & sName & "'!A1"))
End Function
2
Vityata

Plusieurs années de retard, mais j’avais juste besoin de faire cela et je n’aimais aucune des solutions publiées ... Alors j’en invente une, tout cela grâce à la magie de (geste des mains de SpongeBob Rainbow) "Évaluer ()"!

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

Renvoie VRAI si la feuille n'existe pas. FALSE si la feuille EXISTE . Vous pouvez remplacer la plage "1: 1" à votre guise, mais je vous déconseille d'utiliser une seule cellule, car si elle contient une erreur (par exemple, # N/A), elle retournera Vrai.

2
X37V

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

N'utilisez PAS le message "On Error Resume Next", car cela pourrait entrer en conflit avec une autre partie 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
2
Martin Carlsson

Pourquoi ne pas simplement utiliser une petite boucle pour déterminer si la feuille de calcul nommée existe? Indiquez si vous recherchez 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
2
ScottMcC
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
1
Philipp88
    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
1
Shrikant

J'ai fait autre chose: supprimer une feuille uniquement si elle existe - ne pas obtenir d'erreur si elle ne le fait pas:

Excel.DisplayAlerts = False 
Dim WS
For Each WS In Excel.Worksheets
    If WS.name = "Sheet2" Then
        Excel.sheets("Sheet2").Delete
        Exit For
    End If
Next
Excel.DisplayAlerts = True
1
Shai Alon

Remplacez "Données" par le nom de la feuille que vous testez ...

On Error Resume Next 

Set DataSheet = Sheets("Data")

If DataSheet Is Nothing Then

     Sheets.Add(after:=ActiveSheet).Name = "Data"
     ''or whatever alternate code you want to execute''
End If

On Error GoTo 0
1
gth826a

Fonction wsExists compacte (sans confiance dans le traitement des erreurs!)

Voici une fonction courte et simple qui ne repose pas sur la gestion des erreurs pour déterminer si une feuille de calcul existe (et _ est correctement déclaré pour fonctionner dans toute situation!)

Function wsExists(wsName As String) As Boolean
    Dim ws: For Each ws In Sheets
    wsExists = (wsName = ws.Name): If wsExists Then Exit Function
    Next ws
End Function

Exemple d'utilisation:

L'exemple suivant ajoute une nouvelle feuille de calcul nommée myNewSheet, si elle n'existe pas déjà: 

If Not wsExists("myNewSheet") Then Sheets.Add.Name = "myNewSheet"

Plus d'information:

1
ashleedawg

Sans aucun doute que la fonction ci-dessus peut fonctionner, je viens de finir avec le code suivant qui fonctionne plutôt bien:

Sub Sheet_exist ()
On Error Resume Next
If Sheets("" & Range("Sheet_Name") & "") Is Nothing Then
    MsgBox "doesnt exist"
Else
    MsgBox "exist"
End if
End sub

Remarque: Sheets_Name est l'endroit où je demande à l'utilisateur de saisir le nom, ce qui pourrait ne pas être identique pour vous.

1
MAx Segura

Je sais que c'est un ancien post, mais voici une autre solution simple et rapide.

Public Function worksheetExists(ByVal wb As Workbook, ByVal sheetNameStr As String) As Boolean

On Error Resume Next
worksheetExists = (wb.Worksheets(sheetNameStr).Name <> "")
Err.Clear: On Error GoTo 0

End Function
0
Guest

Je suis venu avec un moyen facile de le faire, mais je n'ai pas créé de nouveau sous-marin pour cela. Au lieu de cela, je viens juste de "faire un chèque" dans le sous-dossier sur lequel je travaillais. En supposant que le nom de la feuille que nous recherchons soit "Sheet_Exist", nous voulons simplement l'activer s'il est trouvé:

Dim SheetCounter As Integer

SheetCounter = 1

Do Until Sheets(SheetCounter).Name = "Sheet_Exist" Or SheetCounter = Sheets.Count + 1
 SheetCounter = SheetCounter +1
Loop
If SheetCounter < Sheets.Count + 1 Then
 Sheets("Sheet_Exist").Activate
Else
 MsgBox("Worksheet ""Sheet_Exist"" was NOT found")
End If

J'ai aussi ajouté un pop-up pour quand la feuille n'existe pas.

0
imjordy23