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 durchlaufe ich alle Blätter in der Ursprungsarbeitsmappe und setze sie dann destsheet
in der Zielarbeitsmappe auf das Blatt mit demselben Namen wie das aktuell iterierte in der Ursprungsarbeitsmappe.
Wie kann ich testen, ob dieses Blatt vorhanden ist? Etwas wie:
If wkbkdestination.Worksheets(ThisWorkSheet.Name) Then
Antworten:
Einige Leute mögen diesen Ansatz nicht, weil die Fehlerbehandlung "unangemessen" verwendet wird, aber ich denke, dass er in VBA als akzeptabel angesehen wird ... Ein alternativer Ansatz besteht darin, alle Blätter zu durchlaufen, bis Sie eine Übereinstimmung finden.
quelle
ActiveWorkbook
statt verwendenThisWorkbook
. Letzteres bezieht sich auf die Arbeitsmappe, die den Makrocode enthält, der sich möglicherweise von der Arbeitsmappe unterscheidet, die getestet werden soll. Ich denke,ActiveWorkbook
wäre in den meisten Fällen nützlich (erfundene Situationen sind jedoch immer verfügbar).sht Is Nothing
wird ,True
wenn mit diesem Namen kein Blatt gibt es, aber wir wollen zurückkehren ,True
wenn es ist ein Blatt mit diesem Namen, damit die nicht. Es ist ein wenig einfacher (aber nicht gültig), wenn Sie ein wenig neu arrangierenSheetExists = sht Is Not Nothing
If wb Is Nothing Then Set wb = ThisWorkbook
zuIf wb Is Nothing Then Set wb = ActiveWorkbook
Wenn Sie sich speziell nur für Arbeitsblätter interessieren, können Sie einen einfachen Evaluate-Aufruf verwenden:
quelle
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:
quelle
Da die Suche nach Mitgliedern einer Sammlung ein allgemeines Problem darstellt, finden Sie hier eine abstrahierte Version von Tims Antwort:
Diese Funktion kann mit jeder Sammlung wie Objekt verwendet werden (
Shapes
,Range
,Names
,Workbooks
, etc.).Verwenden Sie, um das Vorhandensein eines Blattes zu überprüfen
If Contains(Sheets, "SheetName") ...
quelle
Set
Schlüsselwort einen Fehler auslöst. Ich fand, dass anstatt zu verwendenSet
, nach demTypeName
Mitglied der Sammlung Werke für alle Fälle zuTypeName objCollection(strName)
Sub Test() On Error GoTo errhandler Debug.Print Contains(Workbooks, "SomeBookThatIsNotOpen") errhandler: If Err.Number <> 0 Then Stop End Sub
Korrigiert: Ohne Fehlerbehandlung:
quelle
Wenn jemand VBA vermeiden und testen möchte, ob ein Arbeitsblatt nur in einer Zellformel vorhanden ist, ist dies mit den Funktionen
ISREF
und möglichINDIRECT
:=ISREF(INDIRECT("SheetName!A1"))
Dies wird zurückkehren ,
TRUE
wenn die Arbeitsmappe ein Blatt namens enthältSheetName
und ausFALSE
anderen Gründen .quelle
Ich habe diesen geschrieben:
quelle
sheetExist = ActiveWorkbook.Sheets(sSheet).Index
Meine Lösung ähnelt Tims, funktioniert aber auch bei Nicht-Arbeitsblatt-Blättern - Diagrammen
.
quelle
Wenn Sie den Test in eine Funktion einfügen, können Sie 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.
quelle
Viele Jahre zu spät, 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 Regenbogen Hände Geste) "Evaluate ()"!
Gibt TRUE zurück, wenn Sheet NICHT vorhanden ist. FALSE wenn Blatt existiert. Sie können "1: 1" durch einen beliebigen Bereich ersetzen. Ich rate jedoch davon ab, eine einzelne Zelle zu verwenden. Wenn sie einen Fehler enthält (z. B. # N / A), wird True zurückgegeben.
quelle
Kompakte
wsExists
Funktion ( ohne auf Fehlerbehandlung angewiesen zu sein!)Hier ist eine kurze und einfache Funktion, die sich nicht auf die Fehlerbehandlung stützt, um festzustellen, ob ein Arbeitsblatt vorhanden ist ( und in jeder Situation ordnungsgemäß als funktionsfähig deklariert ist !).
Anwendungsbeispiel:
Im folgenden Beispiel wird ein neues Arbeitsblatt mit dem Namen hinzugefügt
myNewSheet
, sofern es noch nicht vorhanden ist:Mehr Informationen:
For Each
…Next
Erklärung (VBA)Exit
Statement (VBA)quelle
Warum nicht einfach eine kleine Schleife verwenden, um festzustellen, ob das genannte Arbeitsblatt vorhanden ist? Angenommen, Sie haben in der aktuell geöffneten Arbeitsmappe nach einem Arbeitsblatt mit dem Namen "Sheet1" gesucht.
quelle
Wenn Sie ein Fan von
WorksheetFunction.
oder nicht aus einem nicht englischen Land mit einem nicht englischen Excel arbeiten, ist dies eine gute Lösung, die funktioniert:Oder in einer Funktion wie dieser:
quelle
quelle
quelle
Ändern Sie "Daten" in den Blattnamen, auf den Sie testen ...
quelle
Ohne Zweifel, dass die obige Funktion funktionieren kann, habe ich gerade den folgenden Code erhalten, der ziemlich gut funktioniert:
Hinweis:
Sheets_Name
Hier fordere ich den Benutzer auf, den Namen einzugeben, damit dies für Sie möglicherweise nicht identisch ist.quelle
Ich habe eine andere Sache gemacht: Löschen Sie ein Blatt nur, wenn es existiert - um keinen Fehler zu erhalten, wenn es nicht existiert:
quelle
Ich habe mir einen einfachen Weg ausgedacht, aber ich habe kein neues Sub dafür erstellt. Stattdessen habe ich in dem U-Boot, an dem ich gearbeitet habe, nur eine Überprüfung durchgeführt. Angenommen, der gesuchte Blattname ist "Sheet_Exist" und wir möchten ihn nur aktivieren, wenn er gefunden wird:
Ich habe auch ein Popup hinzugefügt, wenn das Blatt nicht vorhanden ist.
quelle
Ich weiß, dass es ein alter Beitrag ist, aber hier ist eine andere einfache Lösung, die schnell ist.
quelle
Kurz und sauber:
quelle
Ich hatte tatsächlich eine einfache Möglichkeit, zu überprüfen, ob das Blatt vorhanden ist, und dann eine Anweisung auszuführen:
In meinem Fall wollte ich das Blatt löschen und habe dann dasselbe Blatt mit demselben Namen neu erstellt, aber der Code wurde unterbrochen, wenn das Programm das Blatt nicht löschen konnte, da es bereits gelöscht wurde
quelle