Kurzfassung —
Nothingist der Zustand der leeren Referenz: eine Objektvariable, die auf kein Objekt zeigt. Testen Sie ihn mitIf x Is Nothing— dem OperatorIs, nie einem blanken=, denn Objekte lassen sich nicht mit=vergleichen.Set x = Nothinggibt die Referenz frei. Jede Objektvariable beginnt alsNothing, und eine zu verwenden, solange sie nochNothingist, ist die Quelle von Fehler 91, Object variable or With block variable not set.
Sub NothingBasics()
Dim ws As Worksheet ' startet als Nothing - zeigt auf kein Blatt
Set ws = FindSheet("Data") ' eine Funktion, die Nothing zurueckgeben kann
If ws Is Nothing Then ' Is, nicht = (ein blankes = kompiliert hier nicht)
MsgBox "Sheet not found"
Exit Sub
End If
ws.Range("A1").Value = 1
Set ws = Nothing ' die Referenz freigeben
End Sub
Nothing ist der „Freigabe"-Schritt im Lebenszyklus eines Objekts: Sie erzeugen ein Objekt mit
New, richten mit Set eine Variable darauf aus und lassen die
Referenz mit Nothing fallen. Es ist zugleich der Anfangszustand jeder Objektvariablen — genau darum
fliegt Ihnen ein nicht mit Set zugewiesenes Objekt um die Ohren.
Was Sie lernen
- Das Denkmodell —
Nothingist ein leerer Zeiger, ein Etikett, das an keinem Objekt hängt - Warum Sie mit
If x Is Nothingtesten müssen und nie mitIf x = Nothing - Die häufigste echte Verwendung — das Absichern eines
Findoder einer Suche, dieNothingzurückgab - Wann
Set x = Nothingwirklich zählt und wann es ein harmloses Ritual ist - Wie sich
NothingvonEmpty,Nullund""unterscheidet (sie sind nicht austauschbar)
Das Denkmodell: ein leerer Zeiger
Wenn eine Objektvariable ein Etikett ist, das auf ein Ding zeigt, dann ist Nothing dieses Etikett, das
auf kein Ding zeigt. Es ist nicht null, keine leere Zeichenkette, nicht „leer" — das beschreibt Werte.
Nothing ist der spezielle Zustand einer Referenz, an deren anderem Ende kein Objekt hängt.
Jede Objektvariable beginnt dort. In dem Moment, in dem Sie Dim ws As Worksheet schreiben, ist ws
gleich Nothing; es bleibt Nothing, bis ein Set es auf ein echtes Blatt ausrichtet. Diese eine
Tatsache erklärt Fehler 91: Verwenden Sie eine Objektvariable, bevor Sie sie mit Set zuweisen,
dereferenzieren Sie Nothing — Object variable or With block variable not set (siehe
Set). Nothing ist sowohl der Ort, an dem eine Referenz geboren wird, als auch der,
an den sie geht, wenn Sie sie freigeben.
Mit Is Nothing testen, nie mit = Nothing
Das ist die Falle, in die jeder einmal tappt. Sie können eine Referenz nicht mit = auf Leere testen:
If ws = Nothing Then ' FALSCH - kompiliert nicht / Typfehler
If ws Is Nothing Then ' RICHTIG - Is vergleicht Identitaet, nicht Wert
= fragt „sind diese zwei Werte gleich?", und ein solcher Vergleich braucht einen Standardwert —
deshalb funktioniert Range("A1") = 5, aber ws = Nothing nicht. Is stellt eine andere Frage: „zeigen
diese zwei Etiketten auf dasselbe Objekt (oder auf keines)?" Auf Nothing zu testen, oder zu prüfen, ob
zwei Variablen auf dasselbe Objekt verweisen, ist eine Identitätsfrage und nutzt daher Is. Um das
Gegenteil zu testen, klammern Sie es: If Not ws Is Nothing Then.
Die häufigste echte Verwendung: ein Find absichern, das Nothing zurückgab
Der mit Abstand häufigste Ort, an dem Nothing in echten Makros auftaucht, ist das Ergebnis einer Suche.
Range.Find gibt Nothing zurück, wenn es keine Übereinstimmung findet — und auf diesem Ergebnis nach
.Row zu greifen ist ein glatter Fehler 91:
Dim hit As Range
Set hit = ws.Columns("A").Find(What:="Total", LookAt:=xlWhole)
If hit Is Nothing Then ' der Schutz, der Fehler 91 verhindert
MsgBox "No 'Total' row found"
Exit Sub
End If
MsgBox "Found in row " & hit.Row ' sicher - wir wissen, hit zeigt auf eine echte Zelle
Jede API, die „vielleicht keines findet" — Find, eine in einen Helfer verpackte Dictionary-Suche, eine
Funktion, die ein Objekt zurückgibt —, kann Ihnen Nothing reichen. Die Gewohnheit, die Sie rettet:
Wann immer eine Zuweisung Nothing ergeben könnte, testen Sie Is Nothing, bevor Sie das Ergebnis
verwenden.
Wann Set x = Nothing wirklich zählt
Hier die ehrliche Antwort, die die meisten Tutorials auslassen: Bei einer gewöhnlichen lokalen
Objektvariablen ist Set x = Nothing am Ende einer Sub meist überflüssig. VBA gibt lokale
Objektreferenzen automatisch frei, wenn die Variable am Ende der Prozedur ihren Gültigkeitsbereich
verlässt. Sie vorher auf Nothing zu setzen ist harmlos, aber Ritual, nicht Notwendigkeit.
Es zählt wirklich in drei Fällen:
- Zirkuläre Referenzen. Hält Objekt A eine Referenz auf B und B eine zurück auf A, halten sie einander
am Leben und werden nie zurückgewonnen, selbst nachdem die
Subendet. Ein ausdrücklichesSet A.Partner = Nothingbricht den Kreis, sodass beide freigegeben werden können. - Objektvariablen auf Modulebene, globale oder
Static. Diese überleben die Prozedur, die sie gefüllt hat, halten also ihr Objekt — und alle Excel-Ressourcen, die es sperrt — fest, bis Sie sie freigeben oder die Arbeitsmappe schließt. Geben Sie sie bewusst frei, wenn Sie fertig sind. - Externe Anwendungsobjekte. Eine
Outlook.ApplicationoderWord.Application, die Sie erzeugt haben, läuft im Hintergrund weiter, bis jede Referenz daraufNothingist. Geben Sie sie zügig frei, damit das andere Programm schließen kann.
Die Regel: Geben Sie dort bewusst frei, wo eine Referenz langlebig oder geteilt ist; pflanzen Sie
Set x = Nothing nicht als Ritual auf jede lokale Variable.
Nothing ist nicht Empty, Null oder die leere Zeichenkette
Vier verschiedene „Leerheiten" bringen die Leute durcheinander, weil das Englische sie in einen Topf wirft. VBA hält sie strikt auseinander:
Nothing— eine Objektreferenz, die auf kein Objekt zeigt (If obj Is Nothing).Empty— ein nicht initialisiertesVariant, dem nie etwas zugewiesen wurde (If IsEmpty(v)).Null— einVariant, das bewusst „keine gültigen Daten" hält, meist aus einem Datenbankfeld (If IsNull(v)).""— einStringder Länge null. Eine echte Zeichenkette, nur eben leer (If s = "").
Sie sind nicht austauschbar, und jede hat ihren eigenen Test. Is Nothing auf einem Variant oder
IsNull auf einem Objekt tut nicht, was Sie erwarten. Nothing ist die für Objekte — reservieren Sie es
für Referenzen.
Wie ExcelMaster hilft
Nothing steht an beiden Enden des Lebens eines Objekts, und jeder falsche Griff dabei scheitert auf eine
Weise, die leicht zu übersehen ist: ein = Nothing, das nicht kompiliert, ein Find-Ergebnis, ohne
Schutz verwendet, das 91 wirft, eine externe Anwendung, die weiterläuft, weil eine Referenz nie freigegeben
wurde.
ExcelMaster schreibt den Schutz für
Sie — If Not hit Is Nothing Then nach jeder Suche —, nutzt Is für jeden Identitätstest und gibt die
langlebigen und externen Referenzen frei, die es wirklich brauchen, ohne Set x = Nothing über jede lokale
Variable zu streuen. Sie beschreiben das Ergebnis; es kümmert sich um den Lebenszyklus. Sie behalten die
Arbeitsmappe und den Code.
Häufig gestellte Fragen
Was bedeutet Nothing in VBA?
Nothing ist der Zustand der leeren Referenz einer Objektvariablen — die Variable zeigt auf kein Objekt.
Jede Objektvariable startet als Nothing, bis ein Set ihr eines gibt, und Set x = Nothing versetzt sie
zurück in diesen Zustand. Es gilt nur für Objekte, nicht für Werte.
Warum kann ich If x = Nothing nicht verwenden?
Weil = Werte vergleicht und eine Objektreferenz keinen Wert zum Vergleichen hat — If x = Nothing
kompiliert also nicht oder löst einen Typfehler aus. Nutzen Sie stattdessen den Identitätsoperator:
If x Is Nothing. Um das Gegenteil zu testen, schreiben Sie If Not x Is Nothing.
Muss ich Objekte am Ende eines Makros auf Nothing setzen?
Meist nicht. VBA gibt lokale Objektvariablen automatisch frei, wenn die Prozedur endet, Set x = Nothing
auf einer gewöhnlichen lokalen Variablen ist also ein harmloses Ritual. Es zählt aber bei zirkulären
Referenzen, bei Objektvariablen auf Modulebene oder globalen, die die Prozedur überleben, und bei externen
Anwendungsobjekten wie Outlook.Application, die zügig freigegeben werden sollten.
Wie prüfe ich, ob ein Find oder eine Suche nichts zurückgab?
Testen Sie das Ergebnis mit Is Nothing, bevor Sie es verwenden: Set hit = ws.Columns("A").Find("Total")
und dann If hit Is Nothing Then ... Exit Sub. Range.Find gibt Nothing zurück, wenn es keine
Übereinstimmung gibt, und .Row auf einem Nothing-Ergebnis anzufassen löst Fehler 91 aus, Object
variable or With block variable not set.
Was ist der Unterschied zwischen Nothing, Empty, Null und der leeren Zeichenkette?
Nothing ist eine Objektreferenz, die auf kein Objekt zeigt; Empty ist ein nicht initialisiertes
Variant; Null ist ein Variant, das „keine gültigen Daten" hält, oft aus einer Datenbank; "" ist
ein String der Länge null. Es sind eigenständige Zustände mit eigenständigen Tests (Is Nothing,
IsEmpty, IsNull, = "") und nicht austauschbar.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 19.09.2026.
Verwandte Anleitungen: VBA Set · VBA New · VBA Dim · VBA CreateObject · VBA With
