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

VBA Worksheets in Excel — ein Blatt so ansprechen, dass ein umbenanntes Register es nicht bricht

|

VBA Worksheets in Excel — ein Blatt so ansprechen, dass ein umbenanntes Register es nicht bricht

TL;DRWorksheets ist 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:

  1. Per NameWorksheets("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.
  2. Per IndexWorksheets(1) — die Position, von links nach rechts. Praktisch für „das erste Blatt", nutzlos, sobald jemand die Register umherzieht.
  3. Per CodeNameSheet1 — 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