Kurzfassung (TL;DR) — Ein Tabellenblatt hat drei Griffe, und nur einer ist sicher.
Sheets("Jan")nutzt den Registernamen — der Benutzer kann ihn umbenennen und dein Makro stirbt mit „Index außerhalb des gültigen Bereichs".Sheets(1)nutzt die Position — zieh eine Registerkarte und dein Makro schreibt still ins falsche Blatt.Sheet1(der CodeName, im VBE gesetzt) ist der eine, den der Benutzer aus Excel heraus nicht ändern kann, also bricht er nie. Greif dir einmal eine Referenz —Set ws = ThisWorkbook.Worksheets("Data")— und hör mit.Select/.Activateauf.
Ein Tabellenblatt sitzt eine Ebene unter der Arbeitsmappe: Die Mappe enthält Blätter, ein Blatt enthält Bereiche. Der wiederkehrende Schmerz ist nicht, ein Blatt zu benutzen — sondern es zu benennen. Mach die Referenz falsch und dein Makro stürzt entweder laut ab oder schreibt, schlimmer noch, ohne einen einzigen Fehler in die falsche Registerkarte.
Was du lernen wirst
- Die drei Wege, ein Blatt anzusprechen, und welche zwei dich verraten
- Warum der CodeName der kugelsichere Griff ist (und wo du ihn setzt)
- Der Unterschied zwischen
SheetsundWorksheets(keine Synonyme) - Warum
.Selectund.ActivateMakrorekorder-Gewohnheiten sind, kein echter Code
Das mentale Modell: drei Griffe, zwei davon bewegen sich
Ein Blatt ist ein Objekt, das du auf drei Arten greifen kannst. Zwei dieser Griffe hängen an Dingen, die der Benutzer steuert — der Registername und die Registerreihenfolge — also bewegen sie sich unter dir weg. Der dritte, der CodeName, hängt an etwas, das nur du aus dem VBE steuerst.
Sub ThreeWaysToGrabASheet()
' 1) Per REGISTERNAME — Benutzer kann ihn umbenennen -> bricht
Debug.Print Worksheets("Jan").Name
' 2) Per INDEX (Position) — Benutzer kann umsortieren -> still falsches Blatt
Debug.Print Worksheets(1).Name
' 3) Per CODENAME — im VBE gesetzt, für Benutzer unsichtbar -> kugelsicher
Debug.Print Sheet1.Name ' "Sheet1" ist der CodeName, nicht der Registertext
End Sub
Warum das wichtig ist: Griff #1 und #2 hängen vom Benutzerverhalten ab. Jemand benennt „Jan" in „Januar" um oder zieht es hinter „Feb", und dein Makro wirft entweder Laufzeitfehler 9 („Index außerhalb des gültigen Bereichs") oder — weit gefährlicher — läuft weiter und bearbeitet die falsche Registerkarte. Griff #3 ist immun, weil der CodeName im Code lebt, nicht auf der Registerkarte.
Die Regel: setz einen CodeName oder fang die Referenz einmal auf
Der Fehlermodus ist, tief im Makro einen beweglichen Griff zu nutzen. Die Lösung ist, das Blatt einmal oben festzunageln und danach nur noch mit dieser Variablen zu reden.
Sub SafeSheetReference()
' Referenz einmal auffangen — voll qualifiziert bis zur Arbeitsmappe
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Data")
' Ab hier läuft alles über ws. Kein „aktiv", keine erneute Suche.
ws.Range("A1").Value = "Report"
ws.Range("A2:A100").ClearContents
Debug.Print ws.UsedRange.Rows.Count
End Sub
Um den Namen selbst unzerbrechlich zu machen, gib dem Blatt einen CodeName: Wähl im
VBE das Blatt unter Microsoft Excel Objekte, öffne das Eigenschaftenfenster (F4)
und setze (Name). Jetzt kannst du Set ws = SalesData schreiben und das
Umbenennen der Registerkarte in Excel ändert nichts. Die Einschätzung: Wenn ein
Makro überleben muss, während andere die Datei nutzen, sprich Blätter per CodeName
an — Registernamen sind Benutzerinhalt, kein Code.
Sheets vs. Worksheets — nicht dieselbe Sammlung
Daran stolpert fast jeder. Worksheets sind nur die Gitterblätter. Sheets
ist alles mit einer Registerkarte — inklusive Diagrammblättern. Iterier über
die falsche Sammlung und du triffst auf ein Diagrammblatt, das kein .Range hat,
und stürzt ab.
Sub SheetsVsWorksheets()
' Worksheets: NUR Gitterblätter — sicher für .Range / .Cells
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Range("A1").Value = "Geprüft"
Next ws
' Sheets: Gitter- PLUS Diagrammblätter — .Range auf Diagrammblatt = Absturz
Debug.Print ThisWorkbook.Worksheets.Count ' nur Gitter
Debug.Print ThisWorkbook.Sheets.Count ' Gitter + Diagramme
End Sub
Die Faustregel: Wenn deine Schleife Zellen anfasst, iterier über Worksheets, nie
über Sheets. Greif zu Sheets nur, wenn du Diagrammblätter wirklich brauchst.
Hör mit .Select und .Activate auf
Der Makrorekorder schreibt Sheets("Data").Select, dann Range("A1").Select,
weil er nur aufzeichnen kann, was du geklickt hast. Echter Code überspringt das
Klicken ganz — er redet direkt mit dem Blattobjekt. Auswählen ist langsam, lässt
den Bildschirm flackern und legt (weil es das ActiveSheet ändert) genau die
Falsches-Blatt-Fehler von oben an.
' Rekorder-Stil — auswählen, dann auf der Auswahl arbeiten (fragil)
Sheets("Data").Select
Range("A1").Select
Selection.Value = 100
' Echter Code — eine Zeile, keine Auswahl, keine ActiveSheet-Abhängigkeit
ThisWorkbook.Worksheets("Data").Range("A1").Value = 100
Du musst ein Blatt fast nie auswählen, um es zu lesen oder zu schreiben. Warum „aktiv" überhaupt eine Falle ist, steht in VBA ActiveSheet.
Wie ExcelMaster hilft
Das meiste Mehrblatt-VBA existiert, um planmäßig Daten zwischen Registerkarten zu schieben. ExcelMaster macht das aus einer einfachen Beschreibung — „kopiere die bereinigten Zeilen aus Data in den Summary-Tab und aktualisiere die Summen" — ohne falsch zu benennende Blattreferenzen. Du überspringst die ganze „Index-außerhalb-des-Bereichs"-Fehlerklasse.
VBA verdient sich seinen Platz weiter bei dauerhafter, in der Mappe eingebetteter Automatisierung. Aber fürs alltägliche „verschieb das von dieser zu jener Registerkarte" ist das Beschreiben schneller und bricht nicht, wenn jemand ein Blatt umbenennt.
Häufig gestellte Fragen
Warum bekomme ich „Index außerhalb des gültigen Bereichs" beim Ansprechen eines Blatts?
Der übergebene Registername existiert nicht — meist weil jemand das Blatt umbenannt hat oder ein Leerzeichen bzw. Tippfehler vorliegt. Sprich stattdessen per CodeName an (im VBE gesetzt), den der Benutzer nicht ändern kann, oder prüfe vorab, ob das Blatt existiert.
Was ist ein Worksheet-CodeName und wo setze ich ihn?
Der CodeName ist der interne Name, den VBA nutzt (Sheet1, Sheet2, …), sichtbar
im VBE-Projekt-Explorer. Setz ihn über das Eigenschaftenfenster (F4) → (Name).
Anders als den Registernamen kann der Benutzer ihn aus Excel nicht ändern, also ist
er der zuverlässigste Griff.
Was ist der Unterschied zwischen Sheets und Worksheets in VBA?
Worksheets enthält nur normale Gitterblätter. Sheets enthält alle Blatttypen,
inklusive Diagrammblätter. Wenn dein Code .Range oder .Cells nutzt, iterier
über Worksheets — ein Diagrammblatt hat keine Zellen und stürzt ab.
Muss ich ein Blatt auswählen oder aktivieren, um es zu bearbeiten?
Nein. ThisWorkbook.Worksheets("Data").Range("A1").Value = 1 funktioniert ohne
Auswahl. .Select/.Activate sind Makrorekorder-Artefakte, die das Makro
verlangsamen und Falsches-Blatt-Fehler erzeugen.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 13.06.2026.
Verwandte Anleitungen: VBA Workbook · VBA ActiveSheet · VBA Range · VBA For Loop · VBA Dictionary
