🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Check If Sheet Exists in Excel — eine Funktion und die drei Arten, wie sie danebenliegt

|

VBA Check If Sheet Exists in Excel — eine Funktion und die drei Arten, wie sie danebenliegt

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 per Set zuzuweisen, während die Fehlerbehandlung für genau eine Zeile abgeschaltet ist, und prüfen Sie dann, ob die Variable Nothing ist. Stimmen drei Details, lügt sie nie: Fragen Sie eine bestimmte Arbeitsmappe, nicht die, die gerade zufällig aktiv ist; durchsuchen Sie Sheets, nicht Worksheets, denn ein Diagrammblatt kann den Namen schon tragen; und übergeben Sie den Namen als String, denn ein Variant mit 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:

  1. Dim sh As Object — Object, nicht Worksheet, damit sich auch ein Diagrammblatt ohne Typenkonflikt zuweisen lässt.
  2. If wb Is Nothing Then Set wb = ThisWorkbook — ein Standard, den Sie bewusst gewählt haben, statt des impliziten ActiveWorkbook, das ein unqualifiziertes Sheets verwenden würde.
  3. 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.
  4. SheetExists = Not sh Is Nothing — ist die Suche gescheitert, wurde sh nie gesetzt und ist weiterhin Nothing.

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