TL;DR —
Worksheetsist eine Sammlung, und Sie sprechen ein Blatt darin auf drei Arten an: per Name (Worksheets("Jan")), per Index (Worksheets(1)) oder per CodeName (Sheet1). Der Name bricht in dem Augenblick, in dem ein Benutzer das Register umbenennt; der Index bricht in dem Augenblick, in dem jemand die Register in eine neue Reihenfolge zieht; der CodeName bricht an keinem von beiden, weil nur Sie ihn ändern können. Qualifizieren Sie die Sammlung mit einer Arbeitsmappe,Setzen Sie das Blatt einmal in eine Variable und bevorzugen Sie für Register, die Sie kontrollieren, den CodeName.
Sub ThreeWaysToNameASheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Jan") ' per Name - bricht, wenn das Register umbenannt wird
Set ws = ThisWorkbook.Worksheets(1) ' per Index - bricht, wenn Register umsortiert werden
Set ws = Sheet1 ' per CodeName - ueberlebt beides
ws.Range("A1").Value = "Report"
End Sub
Was Sie lernen
- Das mentale Modell — Worksheets ist eine Sammlung, die Sie auf drei verschiedene Arten ansprechen können
- Die drei Referenz-Werkzeuge, und wo die Worksheets-Sammlung darunter sitzt
- Worksheets gegenüber Sheets, und der Diagrammblatt-Unterschied, der wirklich zählt
- Die drei Wege, ein Blatt zu benennen, und was genau jeden bricht
- Die stumme Falle — warum ein funktionierendes Makro an dem Tag stirbt, an dem ein Benutzer ein Register umbenennt
- Die Meinung — einmal setzen, qualifiziert, und den CodeName bevorzugen
Das mentale Modell: eine Sammlung, auf drei Arten angesprochen
Worksheets ist kein einzelnes Objekt — es ist die Sammlung aller Arbeitsblätter in einer
Arbeitsmappe. Um irgendetwas mit einem Blatt zu tun, holen Sie es per Bezeichner aus der Sammlung. VBA gibt
Ihnen drei Bezeichner, und sie sind nicht gleich robust:
- Per Name —
Worksheets("Jan")— der Text auf dem Register. Lesbar und am häufigsten. Auch am fragilsten, denn der Registername ist das Eine, das Ihre Benutzer frei ändern. - Per Index —
Worksheets(1)— die Position, von links nach rechts. Praktisch für „das erste Blatt", nutzlos, sobald jemand die Register umherzieht. - Per CodeName —
Sheet1— ein interner Name, den nur ein Entwickler im Eigenschaftenfenster ändern kann. Für Benutzer unsichtbar, also überlebt er alles, was sie mit den Registern tun.
Zu wählen, welchen Bezeichner Sie nutzen, ist die Wahl, wie fragil Ihr Makro sein wird. Das ist die ganze Lektion.
Die Worksheets-Sammlung unter den drei Referenz-Werkzeugen
Das Blatt zu benennen ist nur die halbe Referenz — Sie müssen auch sagen, in welcher Arbeitsmappe es lebt. Hier kommen die anderen beiden Werkzeuge dieses Clusters ins Spiel.
| Werkzeug | Worauf es zeigt | Womit Sie es kombinieren |
|---|---|---|
| ThisWorkbook | Die Arbeitsmappe, die diesen Code enthält — fest | .Worksheets("Jan"), um ein bestimmtes Register in der eigenen Datei zu erreichen |
| ActiveWorkbook / ActiveSheet | Was gerade jetzt oben liegt — wankelmütig | Selten — nur für generische Werkzeuge |
Worksheets(...) |
Ein benanntes Blatt in einer Arbeitsmappe | Immer eine Arbeitsmappe davor — ThisWorkbook.Worksheets(...) |
Die Regel, die den Cluster zusammenhält, gilt auch hier: Ein nicht qualifiziertes Worksheets("Jan")
greift in die aktive Arbeitsmappe. Setzen Sie eine Arbeitsmappe davor — ThisWorkbook.Worksheets("Jan")
—, damit das Blatt in der Datei gesucht wird, die Sie meinen, nicht in der, die der Benutzer zuletzt
angeklickt hat.
Worksheets gegenüber Sheets: der Unterschied, der beißt
Worksheets und Sheets sehen austauschbar aus und verhalten sich meist so, aber sie sind nicht dieselbe
Sammlung. Sheets enthält jedes Register — Arbeitsblätter und Diagrammblätter. Worksheets enthält
nur die Gitterblätter, in die Sie tippen.
Debug.Print ThisWorkbook.Worksheets.Count ' nur Gitterblaetter
Debug.Print ThisWorkbook.Sheets.Count ' Gitterblaetter + Diagrammblaetter
Die meisten Arbeitsmappen haben keine Diagrammblätter, also stimmen die beiden Zählungen überein und niemand
merkt es. Fügen Sie ein Diagrammblatt hinzu, und die Zahlen laufen auseinander — und eine Schleife über
Sheets, die annimmt, jedes Element sei ein Arbeitsblatt, trifft auf das Diagrammblatt und löst bei einer
nur-für-Arbeitsblätter-Eigenschaft einen Fehler aus. Nutzen Sie Worksheets, wenn Sie Gitterblätter meinen,
was fast immer der Fall ist. Greifen Sie nur dann zu Sheets, wenn Sie bewusst auch Diagrammblätter in der
Schleife haben wollen.
Die drei Wege, ein Blatt zu benennen, und was jeden bricht
Stellen Sie sie den zwei Dingen gegenüber, die Benutzer und Entwickler tatsächlich tun — Register umbenennen und sie umsortieren:
' Per Name: lesbar, aber der Registername ist vom Benutzer aenderbar
Set ws = ThisWorkbook.Worksheets("Jan")
' Benutzer benennt das Register in "January" um -> Subscript out of range
' Per Index: positionsbasiert, gut bis die Register sich bewegen
Set ws = ThisWorkbook.Worksheets(1)
' Benutzer zieht "Summary" nach vorn -> zeigt jetzt auf das falsche Blatt
' Per CodeName: entwicklereigener interner Name, fuer Benutzer unsichtbar
Set ws = Sheet1
' Register umbenennen, Register umsortieren -> weiterhin dasselbe Blatt
Der Name ist am freundlichsten zu lesen und für einen Benutzer am leichtesten zu brechen. Der Index überlebt Umbenennungen, aber nicht das Umsortieren. Der CodeName — einmal im Eigenschaftenfenster des VBA-Editors unter (Name) gesetzt — ist der einzige, der beides überlebt, denn es gibt keinen Button in der Excel-Oberfläche, der ihn ändert. Für jedes Blatt, das als Teil Ihres Werkzeugs ausgeliefert wird, ist der CodeName die robuste Referenz.
Die stumme Falle: ein Makro, das an einer Umbenennung stirbt
Das ist der Fehler, der das Support-Ticket erzeugt. Ihr Makro liest Worksheets("Data") und funktioniert
monatelang. Ein Benutzer räumt auf und benennt das Register von Data in 2026 Data um. Nichts in Ihrem
Code hat sich geändert, doch jeder Lauf stoppt jetzt mit Subscript out of range in der Zeile, die das
Blatt benennt — und die Meldung zeigt auf die Suche, nicht auf die Umbenennung, die sie tatsächlich
verursacht hat.
' FRAGIL - eine Umbenennung vom Bruch entfernt
ThisWorkbook.Worksheets("Data").Range("A1").Value = total
' ROBUST - CodeName laesst sich aus der Excel-Oberflaeche nicht aendern
Sheet1.Range("A1").Value = total
Wenn Sie sich auf den Registernamen stützen müssen (für Blätter, die der Benutzer erstellt), sichern Sie ihn ab: Prüfen Sie, ob das Blatt existiert, bevor Sie es anfassen, oder durchlaufen Sie die Sammlung und gleichen Sie ab. Aber für die Blätter, die Ihnen gehören, überspringen Sie die Fragilität ganz und nutzen Sie den CodeName. Das ist der Unterschied zwischen einem Makro, das ein Aufräumen überlebt, und einem, das es nicht tut.
Die Meinung: einmal setzen, qualifiziert, den CodeName bevorzugen
Sprechen Sie ein Blatt einmal, am Anfang des Makros, in eine Worksheet-Variable an — qualifiziert durch
eine Arbeitsmappe — und arbeiten Sie danach überall über diese Variable. Es liest sich besser, es ist
schneller als das erneute Nachschlagen des Blatts in jeder Zeile, und es setzt die eine fragile Referenz an
genau eine Stelle, statt sie durch den Code zu streuen.
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Jan") ' eine Suche, qualifiziert
ws.Range("A1").Value = 100
ws.Range("A2").Value = 200 ' keine erneute Suche, keine Mehrdeutigkeit
Für Blätter, die Sie steuern, machen Sie diese Referenz zum CodeName (Set ws = Sheet1), sodass ein
Benutzer, der das Register umbenennt, Ihren Code nie erreicht. Heben Sie die Namenszeichenkette für Blätter
auf, die dem Benutzer gehören, und sichern Sie diese ab. Das Ziel ist dasselbe, das sich durch diesen ganzen
Cluster zieht: Sagen Sie genau, welches Objekt Sie meinen, einmal, und lassen Sie das Makro nie raten.
Wenn Sie das Blatt lieber beschreiben als ihm hinterherjagen
Die halbe Schlacht mit Blättern ist Buchhaltung — welches Register, welcher Name, existiert es noch, in welcher Arbeitsmappe ist es. ExcelMaster lässt Sie die Buchhaltung überspringen: Beschreiben Sie das Ergebnis — „für jedes Monatsregister in dieser Datei summiere Spalte D auf das Zusammenfassungsblatt" — und es schreibt und führt Code aus, der jede Referenz qualifiziert und fehlende oder umbenannte Blätter behandelt, und sichert vorher Ihre Arbeitsmappe. Sie benennen das gewünschte Ergebnis; es löst die Blätter sicher auf, sodass eine Umbenennung oder ein Umsortieren nicht das ganze Makro zu Fall bringt.
Häufig gestellte Fragen
Was ist der Unterschied zwischen Worksheets und Sheets in VBA?
Worksheets ist die Sammlung ausschließlich der Gitter-Arbeitsblätter. Sheets ist die Sammlung aller
Register, einschließlich Diagrammblätter. Sie liefern dasselbe, wenn eine Arbeitsmappe keine Diagrammblätter
hat, aber eine Schleife über Sheets, die annimmt, jedes Element sei ein Arbeitsblatt, wirft bei einem
Diagrammblatt einen Fehler. Nutzen Sie Worksheets, außer Sie wollen ausdrücklich Diagrammblätter
einbeziehen.
Wie spreche ich in VBA ein Arbeitsblatt per Namen an?
Nutzen Sie ThisWorkbook.Worksheets("SheetName"), mit der Arbeitsmappe davor, damit die Suche in der Datei
geschieht, die Sie meinen. Der Name muss exakt mit dem Registertext übereinstimmen, und existiert das Blatt
nicht, bekommen Sie Subscript out of range. Für Blätter, die Sie steuern, ist der CodeName die robustere
Referenz, weil Benutzer ihn nicht ändern können.
Was ist ein Worksheet-CodeName in VBA?
Der CodeName ist der interne Name eines Blatts — wie Sheet1 —, den Sie im Eigenschaftenfenster des
VBA-Editors unter (Name) setzen. Anders als den Registernamen kann ein Benutzer ihn aus der
Excel-Oberfläche nicht ändern, sodass eine Referenz wie Sheet1.Range("A1") weiterarbeitet, selbst nachdem
das Register umbenannt oder verschoben wurde.
Wie setze ich in VBA ein Arbeitsblatt auf eine Variable?
Deklarieren Sie es mit Dim ws As Worksheet, dann Set ws = ThisWorkbook.Worksheets("Jan") (oder
Set ws = Sheet1 für den CodeName). Es einmal zu setzen, qualifiziert durch eine Arbeitsmappe, bedeutet,
dass der Rest Ihres Makros über ws arbeitet, ohne das Blatt erneut nachzuschlagen oder von dem abzuhängen,
was aktiv ist.
Warum bekomme ich Subscript out of range bei Worksheets?
Weil der Name oder Index, nach dem Sie gefragt haben, nicht in der Sammlung ist — meist ein Register, das umbenannt oder gelöscht wurde, oder ein Name mit falscher Schreibweise oder zusätzlichen Leerzeichen. Prüfen Sie, ob das Blatt existiert, bevor Sie es anfassen, oder referenzieren Sie es per CodeName, sodass eine Umbenennung die Suche nicht brechen kann.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 07.09.2026.
Verwandte Anleitungen: VBA ThisWorkbook · VBA ActiveWorkbook · VBA Worksheet · VBA Range · VBA Cells
