Kurzfassung — Es gibt kein
Sheets.Exists. Schreiben Sie eine Funktion, legen Sie sie in jedes Projekt und hören Sie auf zu improvisieren: Versuchen Sie, das Blatt perSetzuzuweisen, während die Fehlerbehandlung für genau eine Zeile abgeschaltet ist, und prüfen Sie dann, ob die VariableNothingist. Stimmen drei Details, lügt sie nie: Fragen Sie eine bestimmte Arbeitsmappe, nicht die, die gerade zufällig aktiv ist; durchsuchen SieSheets, nichtWorksheets, denn ein Diagrammblatt kann den Namen schon tragen; und übergeben Sie den Namen alsString, denn einVariantmit einer Zahl wird als Position gelesen. Denken Sie daran, dass auch ausgeblendete Blätter existieren — „existiert" heißt nicht „sichtbar".
Function SheetExists(ByVal sheetName As String, Optional wb As Workbook) As Boolean
Dim sh As Object
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
Set sh = wb.Sheets(sheetName)
On Error GoTo 0
SheetExists = Not sh Is Nothing
End Function
Dies ist der dritte Teil einer dreiteiligen Reihe über die Identität eines Blatts. Der Registername ist eine Beschriftung, die dem Benutzer gehört. Umbenennen ändert diese Beschriftung, Ausblenden nimmt das Register vom Bildschirm, ohne das Blatt unerreichbar zu machen, und die Existenzprüfung, um die es hier geht, ist der Test, den Sie laufen lassen, bevor Sie einer Beschriftung vertrauen. Jeder Code, der ein Blatt über einen Namen findet, den ein Benutzer geändert haben könnte, sollte zuerst diese Frage stellen.
Was Sie lernen
- Das Denkmodell: Existenz ist eine Frage nach einem Namen in einer Arbeitsmappe
- Die Funktion und warum jede ihrer Zeilen da ist
- Drei Arten, wie die gängigen Versionen die falsche Antwort geben
- Schleife, On Error oder Evaluate: welcher Ansatz wann passt
- Die Muster, die darauf aufbauen: holen-oder-erstellen, löschen-falls-vorhanden, eindeutige Namen
- Ein Blatt in einer geschlossenen Arbeitsmappe prüfen
Das Denkmodell: ein Name, eine Arbeitsmappe, ein Namensraum
„Existiert das Blatt?" ist immer die Kurzform einer engeren Frage: Enthält diese Arbeitsmappe ein Blatt
beliebiger Art, dessen Name ohne Beachtung der Groß-/Kleinschreibung mit diesem Text übereinstimmt? Jeder
Teil dieses Satzes ist eine Stelle, an der eine Prüfung danebengehen kann. Diese Arbeitsmappe — nicht
versehentlich die aktive. Ein Blatt beliebiger Art — Arbeitsblätter und Diagrammblätter teilen sich einen
Vorrat an Namen. Ohne Beachtung der Groß-/Kleinschreibung — SALES und Sales sind für Excel derselbe
Name.
Und ein Blatt, das existiert, ist nicht unbedingt auf dem Bildschirm. Ausgeblendete und sehr ausgeblendete Blätter sind weiterhin in der Sammlung, die Prüfung findet sie also — und das ist genau richtig, wenn Sie gleich ein Blatt mit diesem Namen hinzufügen wollen, denn Excel würde das Duplikat ablehnen, obwohl der Benutzer es nicht sehen kann.
Die Funktion, Zeile für Zeile
Die Version oben tut vier Dinge, und jedes davon zählt:
Dim sh As Object—Object, nichtWorksheet, damit sich auch ein Diagrammblatt ohne Typenkonflikt zuweisen lässt.If wb Is Nothing Then Set wb = ThisWorkbook— ein Standard, den Sie bewusst gewählt haben, statt des implizitenActiveWorkbook, das ein unqualifiziertesSheetsverwenden würde.On Error Resume Next...On Error GoTo 0— Fehler werden für genau eine Zeile ignoriert. Die Suche löst Fehler 9 aus, wenn der Name fehlt, und das ist genau die Antwort, die wir wollen; jeder andere Fehler an anderer Stelle bleibt sichtbar. Die On-Error-Anleitung erklärt, warum der Schalter immer wieder zurückgestellt werden muss.SheetExists = Not sh Is Nothing— ist die Suche gescheitert, wurdeshnie gesetzt und ist weiterhinNothing.
Setzen Sie sie überall ein, wo ein Name von außerhalb Ihres Codes kommt — aus einer Zelle, von einem Benutzer, aus einem Dateinamen:
If SheetExists("Summary") Then
ThisWorkbook.Sheets("Summary").Range("A1").Value = Date
Else
MsgBox "Das Blatt Summary fehlt."
End If
Debug.Print SheetExists("Rates", Workbooks("Prices.xlsx")) ' eine andere geoeffnete Arbeitsmappe fragen
Drei Arten, wie die gängigen Versionen die falsche Antwort geben
1. Die falsche Arbeitsmappe fragen. Viele Codeschnipsel rufen Sheets(name) ohne vorangestellte
Arbeitsmappe auf. Das durchsucht die Arbeitsmappe, die gerade aktiv ist, wenn die Zeile läuft — und das ist
nicht mehr die gemeinte, sobald Ihr Makro eine zweite Datei geöffnet hat. Die Prüfung meldet „fehlt", die
nächste Zeile fügt einer falschen Arbeitsmappe ein Blatt hinzu, und nichts wirft einen Fehler. Übergeben
Sie die Arbeitsmappe immer ausdrücklich oder setzen Sie sie ausdrücklich als Standard, wie es die Funktion
tut.
2. Worksheets statt Sheets durchsuchen. Worksheets enthält nur Arbeitsblätter; Sheets enthält auch
Diagrammblätter. Namen sind über beide hinweg eindeutig. Heißt also ein Diagrammblatt Summary, meldet
eine Prüfung gegen Worksheets, der Name sei frei, und ws.Name = "Summary" scheitert dann mit Fehler 1004.
Für die Frage „kann ich diesen Namen verwenden?" ist Sheets die einzig richtige Sammlung.
3. Versehentlich eine Zahl übergeben. Sheets(3) bedeutet das dritte Blatt; Sheets("3") bedeutet das
Blatt namens 3. Kommt der Name in einem Variant an — etwa aus einer Zelle — und die Zelle enthält die
Zahl 3, sucht die Abfrage nach Position und findet das Blatt, das gerade an dritter Stelle steht. Die
Prüfung meldet „existiert" für ein Blatt, das mit dem Namen nichts zu tun hat. Den Parameter als
ByVal sheetName As String zu deklarieren, erzwingt die Umwandlung in Text vor der Suche — deshalb kommt es
auf die Signatur an.
Schleife, On Error oder Evaluate
Sie werden drei Ansätze sehen. So schneiden sie im Vergleich ab:
| Ansatz | Wie | Urteil |
|---|---|---|
On Error + Set |
die Suche versuchen, auf Nothing prüfen |
Standard — eine Suche, exakt Excels Semantik |
Schleife + StrComp |
jeden Namen ohne Beachtung der Groß-/Kleinschreibung vergleichen | klar; nehmen Sie sie, wenn Sie ein Muster abgleichen, keinen Namen |
Evaluate("ISREF(...)") |
einen Formelbezug bauen und testen | meiden — bricht an Apostrophen und Diagrammblättern |
Die Schleife ist das richtige Werkzeug, wenn „existiert" eigentlich „irgendein Blatt, dessen Name mit 2026 beginnt" bedeutet:
Function FirstSheetLike(wb As Workbook, ByVal pattern As String) As Object
Dim sh As Object
For Each sh In wb.Sheets
If LCase$(sh.Name) Like LCase$(pattern) Then
Set FirstSheetLike = sh
Exit Function
End If
Next sh
End Function
' Set sh = FirstSheetLike(ThisWorkbook, "2026-*") ' Nothing, wenn keines passt
Der Evaluate-Trick — Evaluate("ISREF('" & name & "'!A1)") — wirkt clever und scheitert auf leise Art:
Ein Name mit Apostroph bricht die Formel, sofern Sie ihn nicht verdoppeln, ein Diagrammblatt hat kein A1
und liefert False, und die Formel wird gegen die aktive Arbeitsmappe ausgewertet. Er spart zwei Zeilen und
kostet Sie drei Fehler.
Die Muster, die darauf aufbauen
Fast jeder Einsatz der Prüfung ist eines von drei Mustern, und jedes hat seine eigene Anleitung:
' Holen oder erstellen: das Blatt wiederverwenden, wenn es da ist, sonst hinzufuegen
If SheetExists("Log") Then
Set ws = ThisWorkbook.Worksheets("Log")
Else
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = "Log"
End If
' Loeschen, falls vorhanden: kein Fehler 9, wenn es schon weg ist
If SheetExists("Temp") Then
Application.DisplayAlerts = False
ThisWorkbook.Sheets("Temp").Delete
Application.DisplayAlerts = True
End If
Die Anleitung zum Hinzufügen von Blättern behandelt das erste Muster vollständig,
die Anleitung zum Löschen von Blättern das zweite, einschließlich der Regel vom
letzten sichtbaren Blatt. Das dritte ist das Erzeugen eines freien Namens — Report (2), Report (3) —, das
die Anleitung zum Umbenennen von Blättern auf SheetExists aufbaut.
Die Abwägung: Namen prüfen, sich nicht auf sie verlassen
Die Prüfung gibt es, weil Namen zerbrechlich sind. Sie macht Code sicher, der einen Namen verwenden muss — Blätter, die der Benutzer anlegt, Namen, die in eine Zelle getippt werden, Dateien von außen. Sie ist kein Grund, Ihre eigenen Blätter weiterhin per Namen zu suchen. Für Blätter, die Ihrem Werkzeug gehören, verwenden Sie den CodeName, und es gibt nichts zu prüfen. Meine Regel: Kommt ein Name von einem Menschen, prüfen Sie ihn; kommt das Blatt von Ihnen, suchen Sie es überhaupt nicht per Namen. Und für eine geschlossene Arbeitsmappe gibt es keine Abkürzung, der man trauen sollte: Öffnen Sie sie schreibgeschützt, prüfen Sie mit derselben Funktion und schließen Sie sie wieder.
Wie ExcelMaster hilft
Existenzfehler sehen selten wie Existenzfehler aus. Sie sehen aus wie ein Blatt, das der falschen Arbeitsmappe hinzugefügt wurde, eine Umbenennung, die scheitert, weil ein Diagrammblatt den Namen schon trug, oder ein Makro, das die Zahlen eines Monats in Blatt Nummer 3 schreibt, weil eine Zelle eine Zahl statt Text enthielt.
ExcelMaster lässt Sie die Aufgabe beschreiben — „verwende für jede Region in Spalte A ihr Blatt wieder, falls es existiert, oder lege es an" — und schreibt die Prüfung gegen die richtige Arbeitsmappe und die richtige Sammlung, mit dem Namen als Text übergeben, sodass die Holen-oder-erstellen-Logik tut, was sie verspricht.
Häufig gestellte Fragen
Wie prüfe ich in VBA, ob ein Blatt existiert?
Es gibt keine eingebaute Methode, nehmen Sie also eine kleine Funktion: Schalten Sie die Fehlerbehandlung
ab, versuchen Sie Set sh = wb.Sheets(name), schalten Sie sie wieder ein und geben Sie Not sh Is Nothing
zurück. Sie findet Arbeitsblätter und Diagrammblätter, sichtbar oder ausgeblendet, und ignoriert die
Groß-/Kleinschreibung so, wie Excel es tut.
Wie prüfe ich, ob ein Blatt in einer anderen Arbeitsmappe existiert?
Übergeben Sie diese Arbeitsmappe an die Funktion, zum Beispiel SheetExists("Rates", Workbooks("Prices.xlsx")).
Die Arbeitsmappe muss geöffnet sein. Ist sie geschlossen, öffnen Sie sie schreibgeschützt, führen Sie die
Prüfung aus und schließen Sie sie wieder.
Unterscheidet die Prüfung des Blattnamens Groß- und Kleinschreibung?
Nein. Excel behandelt Sales, SALES und sales als denselben Namen, die Suche über Sheets(name)
unterscheidet also nicht zwischen Groß- und Kleinschreibung. Wenn Sie selbst in einer Schleife Namen
vergleichen, verwenden Sie StrComp(a, b, vbTextCompare) oder vergleichen LCase$-Werte, um dasselbe
Ergebnis zu erhalten.
Warum meldet meine Prüfung, ein Blatt existiere nicht, obwohl ich es nicht hinzufügen kann?
Meist, weil die Prüfung Worksheets durchsucht hat und der Name von einem Diagrammblatt belegt ist, das nur
in Sheets auftaucht. Namen müssen über beide hinweg eindeutig sein, prüfen Sie also gegen Sheets. Auch
ein ausgeblendetes Blatt kann den Namen tragen; die Prüfung findet es, aber Sie sehen es nicht in den
Blattregistern.
Zählt ein ausgeblendetes Blatt als vorhanden?
Ja. Ausgeblendete und sehr ausgeblendete Blätter sind weiterhin in der Sheets-Sammlung, die Prüfung liefert
für sie also True. Wenn Sie wissen müssen, ob der Benutzer es sehen kann, testen Sie nach der Prüfung
sh.Visible = xlSheetVisible.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 30.09.2026.
Verwandte Anleitungen: VBA Rename Sheet · VBA Hide Sheet · VBA Add Sheet · VBA Delete Sheet · VBA Worksheets · VBA On Error · VBA Like · VBA Open Workbook
