TL;DR —
Dim name As Typereserviert eine benannte Box und legt ihre Form fest, bevor Sie sie verwenden:Dim total As Long. Deklarieren ist in VBA optional — und genau das ist das Problem. Ohne Deklaration wird ein einziger vertippter Variablenname stillschweigend zu einer brandneuen, leerenVariant, Ihre Summe bleibt0, und kein Fehler schlägt je an. Setzen SieOption Explicitganz an den Anfang jedes Moduls. Es zwingt Sie, jede Variable zu deklarieren, sodass aus einem Tippfehler ein Compilerfehler wird („Variable nicht definiert“) statt einer falschen Antwort. Es ist die wirkungsvollste Zeile der ganzen Sprache.
Option Explicit ' <- setzen Sie dies an den Anfang JEDES Moduls
Sub Demo()
Dim total As Long ' eine Ganzzahl-Box mit dem Namen total reservieren
Dim name As String ' eine Text-Box mit dem Namen name reservieren
total = 10 + 5
name = "Invoice"
Debug.Print name, total ' -> Invoice 15
End Sub
Jedes Makro beginnt damit, den Dingen einen Namen zu geben, mit denen es
arbeitet — einem Zeilenzähler, einem Arbeitsblatt, einer laufenden Summe. Dim
ist das Werkzeug dafür. Es sieht nach Bürokratie aus, aber es wegzulassen (oder
nachlässig zu handhaben) steckt hinter einer ganzen Kategorie von Bugs, die
überhaupt keinen Fehler erzeugen — der schlimmsten Sorte, denn das Makro läuft
bis zum Ende durch und reicht Ihnen selbstbewusst eine falsche Zahl.
Was Sie lernen
- Was
Dimtatsächlich tut — eine benannte Box reservieren und ihre Form festlegen - Warum
Option Explicitstille Tippfehler-Bugs in laute Compilerfehler verwandelt - Die Falle
Dim a, b As Long, dieazu einerVariantmacht, nicht zu einemLong - Wann ein einfaches
=nicht genügt und SieSetbrauchen (Objekte) - Warum der Ort der Deklaration entscheidet, wer die Variable sieht und wie lange sie lebt
Das mentale Modell: Dim reserviert eine beschriftete Box, bevor Sie sie füllen
Stellen Sie sich eine Variable als beschriftete Box im Speicher vor.
Dim total As Long erledigt zwei Dinge auf einmal: Es reserviert eine Box und
gibt ihr die Beschriftung total, und es legt die Form der Box auf Long fest
(eine Ganzzahl). Von da an legt total = 15 einen Wert in diese Box, und der
Name total liest ihn wieder aus.
Die Beschriftung ist wichtiger, als Anfänger erwarten — wegen dem, was VBA tut,
wenn es einen Namen sieht, den es nicht kennt. Standardmäßig — ohne
Option Explicit — ist VBAs Reaktion auf einen unbekannten Namen nicht „Fehler“.
Sie lautet „ah, eine neue Variable“, und VBA legt Ihnen klammheimlich eine an,
leer. Diese eine Design-Entscheidung ist die Quelle des verwirrendsten Bugs in
VBA — und der nächste Abschnitt ist die Lösung.
Die Regel, die Sie vor dem schlimmsten VBA-Bug bewahrt: Option Explicit
Hier ist der Bug, in drei Zeilen:
Sub AddThemUp()
total = 0
total = totl + 10 ' Tippfehler: „totl“, nicht „total“
Debug.Print total ' -> 10, für immer — der Tippfehler schuf eine NEUE leere Box
End Sub
Sie meinten total, getippt haben Sie totl. Ohne Option Explicit beanstandet
VBA das nicht. Es erfindet eine frische, leere Variant namens totl (Wert 0 /
Empty), addiert 10 zu nichts, und Ihr echtes total sammelt nie etwas an. Kein
roter Text, kein Meldungsfenster — nur ein falsches Ergebnis, das Ihnen vielleicht
erst auffällt, wenn es in einem Bericht steht.
Option Explicit beendet diese ganze Klasse von Bugs. Als erste Zeile eines
Moduls platziert, macht es die Deklaration zur Pflicht: Jede Variable muss vor
der Verwendung in einem Dim (oder Private / Public) auftauchen. Jetzt kann
der Tippfehler keine Phantom-Box mehr anlegen — es ist ein nicht deklarierter
Name, also stoppt VBA zur Compilezeit:
Option Explicit
Sub AddThemUp()
Dim total As Long
total = 0
total = totl + 10 ' Compilerfehler: Variable nicht definiert (markiert „totl“)
End Sub
Der Fehler zeigt direkt auf den Tippfehler, bevor das Makro überhaupt läuft.
Schalten Sie ihn überall standardmäßig ein: Extras → Optionen → Editor →
„Variablendeklaration erforderlich“ fügt jedem neuen Modul automatisch
Option Explicit hinzu (bei bestehenden Modulen ergänzen Sie es weiterhin von
Hand). Betrachten Sie „Variable nicht definiert“ als Geschenk — gerade hat es
Ihnen gratis einen Bug erspart.
Die Regel, die jedes Dim an einen Typ bindet: die Falle Dim a, b As Long
Das ist der Deklarationsfehler, den fast jeder einmal macht. Sie wollen drei
Long-Zähler, also schreiben Sie:
Dim i, j, k As Long
Verständlicherweise erwarten Sie, dass i, j und k alle Long sind. Sind
sie nicht. Nur k ist Long. i und j — die keine eigene As-Klausel
haben — sind Variant. In VBA gilt der Typ nur für die Variable, an der er direkt
hängt; es gibt keine Regel „verteile den Typ über die ganze Liste“.
' FALSCH — i und j sind Variant, nur k ist Long
Dim i, j, k As Long
' RICHTIG — jede Variable bekommt ihren eigenen Typ
Dim i As Long, j As Long, k As Long
' Am klarsten — eine pro Zeile
Dim i As Long
Dim j As Long
Dim k As Long
Der Fehlermodus ist subtil: Der Code läuft trotzdem, denn eine Variant hält
eine Zahl problemlos. Sie verlieren die Typsicherheit und die Geschwindigkeit, die
Sie zu haben glaubten, und der Bug zeigt sich erst später, wenn eine dieser
„Long“-Variablen klammheimlich Text oder einen riesigen Wert annimmt, den sie
nicht dürfte. Geben Sie jeder Variable ihr eigenes As Type.
Die Regel für Objekte: ein einfaches = genügt nicht, Sie brauchen Set
Variablen, die einen Wert halten — eine Zahl, etwas Text, ein Datum — werden
mit = zugewiesen. Variablen, die ein Objekt halten — ein Worksheet, ein
Range, ein Workbook — müssen mit Set zugewiesen werden. Set zu
vergessen ist der andere klassische Anfängerfehler.
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Data") ' Set ist bei Objekten Pflicht
Debug.Print ws.Range("A1").Value
Dim rng As Range
Set rng = ws.Range("A1:A10") ' wieder Set
Lassen Sie Set weg, weist VBA das Objekt nicht zu — stattdessen versucht es, den
Standardwert des Objekts zu lesen, und Sie bekommen „Objektvariable oder
With-Blockvariable nicht festgelegt“ (Fehler 91) oder „Objekt erforderlich“
(Fehler 424). Die Regel ist mechanisch und einprägenswert: Werttypen nutzen
=, Objekttypen nutzen Set. Verweist ein Typname auf ein Ding in Excels
Objektmodell (Worksheet, Range, Chart, Workbook), braucht er Set.
Wo Sie Dim schreiben, entscheidet über Sichtbarkeit und Lebensdauer
Der Ort, an dem Sie Dim schreiben, ist nicht kosmetisch — er entscheidet, wer
die Variable sehen kann und wie lange sie überlebt:
- Innerhalb einer
SuboderFunction→ die Variable ist lokal. Sie entsteht, wenn die Prozedur startet, und ist weg, wenn sie endet. Nichts von außen kann sie sehen. - Am Anfang eines Moduls, oberhalb der ersten Prozedur → sie ist für jede
Prozedur in diesem Modul sichtbar. Nutzen Sie dort
Private, um sie auf das Modul zu beschränken. Publicam Anfang eines Moduls → sie ist global, sichtbar für das gesamte Projekt. Mächtig, aber leicht zu missbrauchen; ein Wert, den alles von überall ändern kann, ist schwer zu durchschauen.
Als Faustregel deklarieren Sie Variablen so lokal wie irgend möglich — direkt in
der Prozedur, die sie verwendet. Greifen Sie nur dann zu Modulebene oder Public,
wenn ein Wert wirklich geteilt werden muss. Sichtbarkeit ist eigentlich ein Thema
für sich; wenn Sie Werte zwischen Prozeduren übergeben, sehen Sie in
VBA Sub und VBA ByRef vs. ByVal,
wie Argumente fließen.
Wie ExcelMaster hilft
Dim, Option Explicit und disziplinierte Sichtbarkeit trennen ein Makro, das
ein Jahr voller Änderungen übersteht, von einem, das verrottet. Sie sind zugleich
Reibung — die sorgfältigen Deklarationen, die Sie schreiben, bevor Sie zu dem
Teil kommen, der Sie eigentlich interessiert.
ExcelMaster lässt
Sie direkt zum Ergebnis springen. Beschreiben Sie die Aufgabe in einfachem
Deutsch — „Summiere im Blatt Orders Spalte D, wo der Status Paid ist, gruppiert
nach Monat“ — und es schreibt und führt die Logik für Sie aus, deklariert die
richtigen Variablen und Typen auf die robuste Weise, statt Sie an
Option Explicit denken zu lassen. Wenn Sie doch ein handgeschriebenes Makro
nach Zeitplan brauchen, deklarieren Sie die Dinge weiterhin selbst mit Dim. Für
die alltägliche „Erledige das einfach mit den heutigen Daten“-Aufgabe schlägt das
Beschreiben des Ergebnisses das fehlerfreie Deklarieren von Hand.
Häufig gestellte Fragen
Muss ich Variablen in VBA deklarieren?
Technisch nein — VBA lässt Sie eine nie deklarierte Variable verwenden und
behandelt sie als Variant. In der Praxis sollten Sie alles deklarieren, denn
nicht deklarierte Variablen lassen einen einzigen Tippfehler stillschweigend eine
neue leere Box anlegen und liefern eine falsche Antwort ohne jeden Fehler. Setzen
Sie Option Explicit an den Anfang jedes Moduls, um die Deklaration zur Pflicht
zu machen.
Was bedeutet Dim in VBA?
Dim ist die Kurzform von „dimension“ — der Begriff stammt daher, dass man im
frühen BASIC die Dimensionen eines Arrays reservierte. Heute heißt es schlicht
„eine Variable deklarieren“: einen benannten Platz im Speicher reservieren und mit
As Type festlegen, welche Art Wert er hält, z. B. Dim count As Long.
Macht Dim a, b As Long sowohl a als auch b zu Long?
Nein. Nur b ist Long; a ist eine Variant, weil die As-Klausel nur für
die Variable gilt, an der sie direkt hängt. Damit beide Long werden, schreiben
Sie Dim a As Long, b As Long — geben Sie jeder Variable ihr eigenes As Type.
Was ist Option Explicit und wohin gehört es?
Option Explicit zwingt dazu, jede Variable vor der Verwendung zu deklarieren.
Setzen Sie es als erste Zeile jedes Moduls, oberhalb aller Prozeduren. Es
verwandelt stille Bugs durch „nicht deklarierte Tippfehler“ in einen klaren
Compilerfehler „Variable nicht definiert“. Aktivieren Sie Extras → Optionen →
Editor → Variablendeklaration erforderlich, um es neuen Modulen automatisch
hinzuzufügen.
Wann verwende ich Set statt = bei einer Dim-Zuweisung?
Verwenden Sie Set, wenn die Variable ein Objekt aus Excels Objektmodell hält —
ein Worksheet, Range, Workbook, Chart und so weiter:
Set ws = ActiveSheet. Nutzen Sie ein einfaches = für Werte — Zahlen, Text,
Datumsangaben, Booleans. Set bei einem Objekt zu vergessen ergibt
„Objektvariable oder With-Blockvariable nicht festgelegt“ (Fehler 91).
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 31.07.2026.
Verwandte Anleitungen: VBA Datentypen · VBA Const · VBA Sub · VBA ByRef vs. ByVal · VBA Range
