it-swarm.com.de

Testen oder prüfen Sie, ob ein Blatt vorhanden ist

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

Grundsätzlich schleife ich alle Blätter in der Origin-Arbeitsmappe durch und setze dann destsheet in der Zielarbeitsmappe auf das Blatt mit dem gleichen Namen wie das aktuell durchlaufene in der Origin-Arbeitsmappe.

Wie kann ich testen, ob das Blatt existiert? So etwas wie:

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

Einige Leute mögen diesen Ansatz wegen einer "unangemessenen" Verwendung der Fehlerbehandlung nicht, aber ich denke, es wird in VBA als akzeptabel betrachtet.

 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

Wenn Sie nur an Arbeitsblättern interessiert sind, können Sie einen einfachen Auswertungsaufruf verwenden:

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

Sie benötigen keine Fehlerbehandlung, um dies zu erreichen. Sie müssen lediglich alle Arbeitsblätter durchlaufen und prüfen, ob der angegebene Name vorhanden ist:

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

Da das Überprüfen auf Mitglieder einer Sammlung ein generelles Problem ist, folgt hier eine abstrahierte Version von Tims Antwort:

 Funktion enthält (objCollection As Object, strName als String) As Boolean 
 Dim o als Objekt 
 On Error Resume Next 
 set o = objCollection (strName) 
 Enthält = (Err.Number = 0) 
 Err.Clear 
 Funktion beenden 

Diese Funktion kann mit jeder Objektgruppe verwendet werden (Shapes, Range, Names, Workbooks usw.).

Verwenden Sie If Contains(Sheets, "SheetName") ..., um zu prüfen, ob ein Blatt vorhanden ist.

20
Peter Albert

Korrigiert: Ohne Fehlerbehandlung:

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

Falls jemand VBA vermeiden und testen möchte, ob ein Arbeitsblatt nur in einer Zellenformel vorhanden ist, können Sie die Funktionen ISREF und INDIRECT verwenden:

=ISREF(INDIRECT("SheetName!A1"))

Dies gibt TRUE zurück, wenn die Arbeitsmappe ein Blatt mit den Namen SheetName und FALSE enthält, andernfalls.

12
VirtualMichael

Meine Lösung sieht ähnlich aus wie Tims, funktioniert aber auch bei Tabellenblättern, die keine Arbeitsblätter sind

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

Ich habe dieses geschrieben:

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

Wenn Sie ein Fan von WorksheetFunction. sind oder aus einem nicht-englischen Land mit einem nicht-englischen Excel arbeiten, ist dies eine gute Lösung, die funktioniert:

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

Oder in einer Funktion wie dieser:

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

Viele Jahre später, aber ich musste das nur tun und mochte keine der veröffentlichten Lösungen ... Also habe ich mir eine ausgedacht, alles dank der Magie von (SpongeBob Rainbow Handgeste) "Evaluate ()"!

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

Gibt TRUE zurück, wenn Sheet NICHT vorhanden ist. FALSE, wenn das Blatt DOES vorhanden ist . Sie können "1: 1" durch einen beliebigen Bereich ersetzen, aber ich rate davon ab, eine einzelne Zelle zu verwenden Wahr.

2
X37V

Stellen Sie den Test in eine Funktion und Sie können ihn wiederverwenden und haben eine bessere Lesbarkeit des Codes.

Verwenden Sie NICHT "On Error Resume Next", da dies zu Konflikten mit anderen Teilen Ihres Codes führen kann.

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

Warum verwenden Sie nicht einfach eine kleine Schleife, um festzustellen, ob das benannte Arbeitsblatt existiert? Sagen Sie, ob Sie in der aktuell geöffneten Arbeitsmappe nach einem Arbeitsblatt namens "Sheet1" gesucht haben.

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

Ich habe noch etwas getan: ein Blatt nur löschen, wenn es existiert - nicht um einen Fehler zu bekommen, wenn es nicht funktioniert:

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

Ändern Sie "Daten" in den Namen, für den Sie einen Test durchführen ...

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

Kompakte wsExists-Funktion (ohne Vertrauen in die Fehlerbehandlung!)

Hier ist eine kurze und einfache Funktion, die nicht auf die Fehlerbehandlung angewiesen ist, um festzustellen, ob ein Arbeitsblatt vorhanden ist (und ist ordnungsgemäß für die Verwendung in any Situation deklariert!

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

Verwendungsbeispiel:

Im folgenden Beispiel wird ein neues Arbeitsblatt mit dem Namen myNewSheet hinzugefügt, wenn es noch nicht vorhanden ist: 

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

Mehr Informationen:

1
ashleedawg

Ohne Zweifel, dass die obige Funktion funktionieren kann, endete ich mit folgendem Code, der ziemlich gut funktioniert:

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

Hinweis: Sheets_Name ist der Ort, an dem ich den Benutzer zur Eingabe des Namens auffordere, so dass dies für Sie möglicherweise nicht derselbe ist.

1
MAx Segura

Ich weiß, es ist ein alter Beitrag, aber hier ist eine andere einfache Lösung, die schnell ist.

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

Ich habe mir einen einfachen Weg dazu ausgedacht, aber ich habe kein neues U-Boot dafür erstellt. Stattdessen habe ich in dem U-Boot, an dem ich gearbeitet habe, einfach einen Check durchgeführt. Angenommen, der Blattname, nach dem wir suchen, ist "Sheet_Exist" und wir möchten ihn nur aktivieren, wenn er gefunden wird:

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

Ich habe auch ein Popup hinzugefügt, wenn das Blatt nicht existiert.

0
imjordy23