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

VBA Worksheet in Excel — ein Blatt per Name, CodeName oder Index ansprechen (und welchem du trauen solltest)

|

VBA Worksheet in Excel — ein Blatt per Name, CodeName oder Index ansprechen (und welchem du trauen solltest)

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/.Activate auf.

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 Sheets und Worksheets (keine Synonyme)
  • Warum .Select und .Activate Makrorekorder-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