Kurzfassung —
Worksheets.Addgibt das Blatt zurück, das es gerade erstellt hat. Fangen Sie diesen Rückgabewert ab —Set ws = Worksheets.Add(...)— und Sie müssen nie raten, welches Blatt das neue ist. Die zwei Dinge, über die jeder stolpert, sind Position und Name: Ein blankesWorksheets.Addlegt das Blatt links neben das aktive Blatt (nicht ans Ende), und Sie können den Namen nicht imAdd-Aufruf übergeben — Sie setzen.Namedanach, wo ein doppelter, leerer oder zu langer Name den Laufzeitfehler 1004 wirft.
Sub AddMonthSheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add(After:=Worksheets(Worksheets.Count))
ws.Name = "Sep 2026" ' <= 31 Zeichen, eindeutig, kein : \ / ? * [ ]
End Sub
Worksheets.Add ist die Code-Fassung von Start ▸ Einfügen ▸ Blatt einfügen und des kleinen +
neben den Registern. Es ist eine der ersten Handlungen eines Bericht-Makros, und es scheitert jedes Mal
an denselben zwei Stellen — das Blatt taucht irgendwo auf, wo Sie es nicht erwartet haben, oder die
Umbenennungszeile fliegt Ihnen um die Ohren. Beide Probleme verschwinden in dem Moment, in dem Sie Add
als Fabrik behandeln, die Ihnen das fertige Blatt reicht, statt als Befehl, der Sie es selbst suchen
lässt.
Was Sie lernen
- Das Denkmodell —
Addgibt das neue Blatt zurück, fangen Sie es also ab und hören Sie auf,ActiveSheetzu nutzen - Die eine Regel, die die meisten Fehler verhindert — den Rückgabewert einer
Worksheet-Variablen zuweisen - Warum ein blankes
Adddas Blatt links platziert, und wieBeforeundAfterdas beheben - Warum Sie das Blatt nicht innerhalb von
Addbenennen können, und die Regeln, die.Name1004 werfen lassen - Wie Sie ein Blatt nur hinzufügen, wenn es noch nicht existiert
Das Denkmodell: Add reicht Ihnen das Blatt
Worksheets.Add ist kein Befehl nach dem Prinzip abschicken-und-vergessen. Es ist eine Funktion, die
ein Blatt erstellt und eine Referenz darauf zurückgibt. Der mit Abstand häufigste Fehler ist, diese
Referenz wegzuwerfen:
Worksheets.Add ' das neue Blatt wird erstellt... und dann verloren
Worksheets(Worksheets.Count).Name = "Data" ' Raten, wohin es ging
Die zweite Zeile ist geraten. Sie nimmt an, das neue Blatt sei das letzte, was es standardmäßig nicht ist, und benennt so das falsche Register um. Alles, was danach kommt — Überschriften schreiben, formatieren, Formeln ergänzen —, zielt dann auf ein per Zufall gewähltes Blatt. Fangen Sie stattdessen den Rückgabewert ab, und das Raten ist für immer vorbei:
Dim ws As Worksheet
Set ws = Worksheets.Add
ws.Name = "Data" ' das ist eindeutig das Blatt, das Sie gerade erstellt haben
Sobald ws das echte Objekt hält, spielt die Position für die Korrektheit keine Rolle mehr — Sie
können das Blatt hinlegen, wohin Sie wollen, und Ihr Code spricht weiterhin das richtige an.
Die wichtigste Regel: den Rückgabewert zuweisen
Jede verlässliche Routine zum Blatt-Hinzufügen beginnt gleich: Set ws = Worksheets.Add(...). Das ist
die Regel, die eine ganze Kategorie von Fehlern beseitigt, denn die beiden brüchigen Alternativen
versagen beide unter ganz gewöhnlichen Bedingungen:
ActiveSheetnachAddzeigt meistens auf das neue Blatt — aber nicht, wenn ein Ereignis, einCalculateoder eine andere Zeile den Fokus zuvor verschoben hat. Es ist eine Konvention, keine Garantie.Sheets(Sheets.Count)nimmt an, das neue Blatt sei das letzte, was nur stimmt, wenn Sie es dort hinzugefügt haben.
Der Rückgabewert ist die einzige Referenz, die immer sofort korrekt ist, ganz gleich, wo das Blatt gelandet ist oder was als Nächstes läuft. Behandeln Sie „ein Blatt hinzufügen" und „das Blatt festhalten" als einen einzigen, unteilbaren Schritt.
Positionierung: Before, After und warum der Standard links landet
Worksheets.Add nimmt die Argumente Before:= und After:= — ein Blatt, vor oder hinter dem
eingefügt wird. Übergeben Sie höchstens eines. Mit keinem von beiden fügt Excel das neue Blatt
direkt vor dem aktiven Blatt ein, was beim ersten Mal fast jeden überrascht: Man erwartet „das Ende",
und stattdessen erscheint das Register mitten in der Arbeitsmappe.
Um ans Ende anzuhängen — die Position, die die meisten Makros tatsächlich wollen —, verankern Sie mit
After am letzten Blatt:
Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count)) ' immer zuletzt
Set ws = Worksheets.Add(Before:=Worksheets(1)) ' immer zuerst
Worksheets(Worksheets.Count) ist die idiomatische Wendung für „das letzte Arbeitsblatt". Beachten Sie,
dass es Arbeitsblätter zählt, nicht alle Blätter — enthält die Arbeitsmappe auch Diagrammblätter,
unterscheiden sich Sheets.Count und Worksheets.Count. Im Zweifel positionieren Sie ausdrücklich;
verlassen Sie sich nie auf den Standard „links vom aktiven" in Code, den andere lesen werden.
Beim Benennen stürzt Add ab
Add hat kein Name-Argument. Sie erstellen das Blatt und setzen dann .Name auf dem Objekt, das Sie
abgefangen haben. In diesem zweiten Schritt wohnt der Laufzeitfehler 1004, denn Excel setzt strenge
Regeln für Blattnamen durch — und es sind dieselben Regeln, ob Sie ein brandneues Blatt benennen oder
ein altes umbenennen:
- Höchstens 31 Zeichen
- Muss eindeutig sein innerhalb der Arbeitsmappe (ohne Groß-/Kleinschreibung) — ein Duplikat ist der Absturz Nummer eins
- Darf nicht leer sein
- Darf nicht enthalten
: \ / ? * [ ]
Verletzen Sie eine davon, wirft .Name = ... den Fehler 1004. Der häufigste Auslöser ist das erneute
Ausführen eines Makros, das "Data" bereits einmal erstellt hat — der zweite Lauf kollidiert. Weil die
Regeln für Erstellen und Umbenennen identisch sind, lohnt es sich, den Namen an einer Stelle abzusichern:
Function SafeName(nm As String) As String
nm = Left$(nm, 31)
Dim bad As Variant, ch As Variant
For Each ch In Array(":", "\", "/", "?", "*", "[", "]")
nm = Replace(nm, ch, "-")
Next ch
SafeName = nm
End Function
Das erledigt Länge und unzulässige Zeichen; die Eindeutigkeit erledigen Sie, indem Sie zuerst prüfen — das ist der nächste Abschnitt.
Nur hinzufügen, wenn es noch nicht existiert
Es gibt kein eingebautes Exists für Blätter, also müssen Sie die Kollision beim erneuten Lauf selbst
verhindern. Prüfen Sie die Sammlung vor dem Hinzufügen nach dem Namen und verwenden Sie das Blatt wieder,
wenn es schon da ist:
Function GetOrAddSheet(nm As String) As Worksheet
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If StrComp(ws.Name, nm, vbTextCompare) = 0 Then
Set GetOrAddSheet = ws ' das bestehende wiederverwenden
Exit Function
End If
Next ws
Set GetOrAddSheet = ThisWorkbook.Worksheets.Add(After:=Worksheets(Worksheets.Count))
GetOrAddSheet.Name = nm ' frei benennbar - wir wissen, es ist unbenutzt
End Function
Das ist das Muster, das ein Blatt-Hinzufügen-Makro idempotent macht — gefahrlos zweimal ausführbar —
statt eines, das beim ersten Mal funktioniert und danach für immer 1004 wirft. Die Faustregel: Rufen Sie
Add und .Name nie blind in einer Routine auf, die mehr als einmal laufen könnte; schlagen Sie den
Namen zuerst nach und verwenden Sie wieder oder erstellen neu.
Wie ExcelMaster hilft
Ein Blatt hinzuzufügen sieht nach einer Zeile aus und verbirgt drei Entscheidungen — den Rückgabewert abfangen, eine Position wählen und einen zulässigen, eindeutigen Namen erzeugen —, und jede davon falsch zu treffen scheitert entweder still (falsches Register umbenannt) oder laut (Fehler 1004 beim zweiten Lauf).
ExcelMaster lässt Sie sagen, was
Sie wollen — „füge am Ende ein Monatsblatt hinzu, benannt nach dem aktuellen Monat, und verwende es
wieder, falls es schon da ist" — und schreibt das Set ws = Worksheets.Add(After:=...)-Abfangen, hängt
an der richtigen Stelle an, bereinigt den Namen gegen die Regeln zu 31 Zeichen und unzulässigen Zeichen
und prüft zuerst die Sammlung, sodass ein zweiter Lauf das Blatt wiederverwendet, statt abzustürzen. Sie
behalten die Arbeitsmappe und den Code.
Häufig gestellte Fragen
Wie füge ich in VBA ein Blatt hinzu und benenne es?
Fangen Sie den Rückgabewert ab und setzen .Name darauf: Set ws = Worksheets.Add(After:=Worksheets(Worksheets.Count)),
dann ws.Name = "Data". Add selbst hat kein Name-Argument. Der Name muss höchstens 31 Zeichen lang,
in der Arbeitsmappe eindeutig, nicht leer und frei von : \ / ? * [ ] sein, sonst wirft .Name den
Laufzeitfehler 1004.
Warum erscheint mein neues Blatt an der falschen Position?
Weil ein blankes Worksheets.Add das Blatt direkt vor dem aktiven Blatt einfügt, nicht am Ende.
Steuern Sie es mit Before:= oder After:=. Um ans Ende anzuhängen, nutzen Sie
Worksheets.Add(After:=Worksheets(Worksheets.Count)); um es an den Anfang zu setzen,
Worksheets.Add(Before:=Worksheets(1)).
Warum bekomme ich beim Hinzufügen oder Benennen eines Blatts Fehler 1004?
Fast immer ein Verstoß gegen eine Namensregel, und meist ein Duplikat. Blattnamen müssen eindeutig sein,
das erneute Ausführen eines Makros, das "Data" schon erstellt hat, kollidiert also beim zweiten Lauf.
Namen müssen außerdem höchstens 31 Zeichen lang, nicht leer und frei von : \ / ? * [ ] sein. Prüfen Sie
die Sammlung vor dem Hinzufügen nach dem Namen und bereinigen Sie die Zeichenkette zuerst.
Wie füge ich ein Blatt nur hinzu, wenn es noch nicht existiert?
Es gibt keine Exists-Methode, durchlaufen Sie also die Worksheets-Sammlung und vergleichen die Namen
mit StrComp(ws.Name, nm, vbTextCompare) = 0. Wird eine Übereinstimmung gefunden, verwenden Sie dieses
Blatt wieder; andernfalls rufen Sie Add auf und benennen es. Verpacken Sie das in eine
GetOrAddSheet-Funktion, wird das Makro gefahrlos wiederholt ausführbar.
Wie füge ich ein Blatt ganz ans Ende der Arbeitsmappe hinzu?
Verankern Sie am letzten Arbeitsblatt: Worksheets.Add(After:=Worksheets(Worksheets.Count)).
Worksheets(Worksheets.Count) ist das letzte Arbeitsblatt, das Einfügen danach hängt also ans Ende an.
Nutzen Sie Sheets.Count statt Worksheets.Count nur, wenn Sie bewusst auch Diagrammblätter mitzählen
wollen.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 14.09.2026.
Verwandte Anleitungen: VBA Blatt kopieren · VBA Blatt löschen · VBA Worksheets · VBA Worksheet · VBA ThisWorkbook
