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
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
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
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
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.
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
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.
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
.
Ich habe dieses geschrieben:
Function sheetExist(sSheet As String) As Boolean
On Error Resume Next
sheetExist = (ActiveWorkbook.Sheets(sSheet).Index > 0)
End Function
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
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.
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
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
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
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
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
Ä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
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
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"
For Each
… Next
Anweisung (VBA)Exit
Anweisung (VBA) 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.
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
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.