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

VBA Set in Excel — warum Objektvariablen Set brauchen (und die Fehler 91 und 424)

|

VBA Set in Excel — warum Objektvariablen Set brauchen (und die Fehler 91 und 424)

Kurzfassung — In VBA weisen Sie ein Objekt mit Set zu, nicht mit einem schlichten =. Eine Objektvariable ist eine Referenz — ein Etikett, das auf ein lebendes Objekt zeigt —, also richtet Set ws = Worksheets("Data") das Etikett auf das Blatt aus. Vergessen Sie das Set, wirft VBA Fehler 91, Object variable or With block variable not set. Verwenden Sie Set auf etwas, das kein Objekt ist, bekommen Sie Fehler 424, Object required. Werte (Integer, String, Double) werden mit = kopiert; auf Objekte zeigen Sie mit Set.

Sub ObjectsNeedSet()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Data")   ' Set = das Etikett auf das Blatt ausrichten
    ws.Range("A1").Value = 100                  ' jetzt verweist ws auf etwas - das klappt

    Dim total As Double
    total = ws.Range("A1").Value                ' Werte nutzen =, kein Set
End Sub

Set ist der Schlussstein im Lebenszyklus eines Objekts: Sie erzeugen ein Objekt mit New, Sie richten mit Set eine Variable darauf aus, und Sie geben es mit Nothing frei. Machen Sie Set falsch, treffen Sie die zwei Fehler, denen jeder VBA-Entwickler zuerst begegnet — 91 und 424 —, weshalb es sich lohnt zu verstehen, warum Objekte es brauchen.

Was Sie lernen

  • Das Denkmodell — eine Objektvariable ist eine Referenz (ein Etikett), keine Schachtel, die eine Kopie enthält
  • Was Set braucht (Range, Worksheet, Workbook, Dictionary) und was nicht (Integer, String)
  • Der Fehler Nummer eins — Fehler 91, Object variable or With block variable not set, durch ein fehlendes Set
  • Fehler 424, Object required, und wie er sich von 91 unterscheidet
  • Warum Set b = a zwei Namen für dasselbe lebende Objekt schafft, keine Kopie

Das Denkmodell: eine Referenz, keine Schachtel

Eine Wertvariable ist eine Schachtel. Dim n As Long: n = 5 legt die Zahl 5 in n. Kopieren Sie sie mit m = n, bekommt m seine eigene 5; ändern Sie m, bleibt n unberührt. Einfach.

Eine Objektvariable ist keine Schachtel — sie ist ein Etikett. Dim ws As Worksheet erzeugt ein leeres Etikett, das gerade auf gar kein Blatt zeigt. Set ws = Worksheets("Data") kopiert das Arbeitsblatt nicht in ws; es richtet das Etikett auf das vorhandene Blatt aus. Genau dafür gibt es Set: Ein Objekt zuzuweisen ist ein Akt des Zeigens, und VBA lässt Sie das ausdrücklich sagen.

Dim ws As Worksheet
ws = Worksheets("Data")        ' FALSCH - kein Set - Laufzeitfehler 91
Set ws = Worksheets("Data")    ' RICHTIG - das Etikett zeigt jetzt auf das Blatt

Merken Sie sich einen Satz, und alles andere ergibt sich: Werte kopieren Sie mit =; auf Objekte zeigen Sie mit Set. Die zwei Laufzeitfehler unten sind beide nur VBAs Art, Ihnen zu sagen, dass es ein Etikett nicht sauber ausrichten konnte.

Der Fehler Nummer eins: Fehler 91

91 ist der Fehler, der die Leute zur Suche treibt, unter seinem vollen Namen: Object variable or With block variable not set. Er bedeutet, dass Sie eine Objektvariable verwendet haben, die gerade auf nichts zeigt. Zwei Situationen lösen ihn aus, und beide laufen auf ein fehlendes Set hinaus.

Erstens: Sie haben das Objekt deklariert, aber nie mit Set zugewiesen, es ist also noch Nothing, und dann haben Sie es verwendet:

Dim ws As Worksheet
ws.Range("A1").Value = 1       ' Fehler 91 - ws wurde nie mit Set zugewiesen, zeigt auf nichts

Zweitens — der heimtückische Fall —: Sie wollten das Blatt zuweisen, haben aber das Set vergessen:

Dim ws As Worksheet
ws = ThisWorkbook.Worksheets("Data")   ' Fehler 91 - ein blankes = kann kein Objekt-Etikett ausrichten

Die Lösung ist in beiden Fällen dasselbe Wort: Set ws = ThisWorkbook.Worksheets("Data"). Wann immer Sie Object variable or With block variable not set sehen, lautet die erste Frage stets: Habe ich dieses Objekt mit Set zugewiesen, und gab es das, worauf ich es mit Set ausgerichtet habe, überhaupt? (Ein Find oder eine Suche, die Nothing zurückgibt, ist die andere klassische Quelle — die Variable ist gesetzt, nämlich auf Nothing, und Sie haben sie trotzdem verwendet.)

Fehler 424: Object required

424, Object required, ist das Spiegelbild von 91. Wo 91 heißt „Sie haben ein leeres Objekt-Fach verwendet", heißt 424 „Sie haben Set oder Objekt-Syntax auf etwas angewandt, das gar kein Objekt ist":

Dim n As Long
Set n = 5                      ' Fehler 424 - 5 ist ein Wert, Set will ein Objekt
Set n = Range("A1").Value      ' Fehler 424 - .Value ist eine Zahl, kein Objekt

Set auf der linken Seite verlangt ein Objekt auf der rechten. Geben Sie ihm eine Zahl, eine Zeichenkette oder eine Eigenschaft, die einen Wert zurückgibt, sagt VBA Object required. Sie sehen 424 auch, wenn Sie Objekt-Syntax auf eine schlichte Variable anwenden — x.Cells(1, 1), wobei x ein String ist, oder ein vertippter Variablenname, den VBA still als leeres Variant behandelt. Die Faustregel: 91 heißt „setz es zuerst"; 424 heißt „das ist kein Objekt, lass das Set weg (oder korrigiere die rechte Seite)".

Set schafft einen Alias, keine Kopie

Weil Set zeigt statt kopiert, können zwei Objektvariablen am Ende auf dasselbe lebende Objekt zeigen — und wer durch die eine schreibt, ändert, was die andere sieht:

Dim a As Range, b As Range
Set a = Range("A1:B2")
Set b = a                      ' b zeigt auf DENSELBEN Range wie a - keine Kopie
b.ClearContents                ' das leert auch a, denn a und b sind ein Range

Vergleichen Sie das mit Werten, wo eine Kopie wirklich eine Kopie ist:

Dim x As Long, y As Long
x = 5: y = x                   ' y bekommt seine eigene 5
y = 9                          ' x ist immer noch 5 - unabhaengige Schachteln

Dieses Aliasing ist kein Fehler; es ist der Sinn von Referenzen, und deshalb ist das Herumreichen von Objekten billig (Sie reichen das Etikett weiter, nie das ganze Blatt). Aber es bedeutet eben, dass „ich habe den Range in eine andere Variable kopiert und sie bearbeitet" still das Original bearbeitet. Um die Daten zu duplizieren, kopieren Sie die Zellen (a.Copy), nicht die Referenz.

Set gegen Let

VBA hat tatsächlich ein passendes Schlüsselwort für Werte: Let. Let n = 5 ist dasselbe wie n = 5 — das Let ist optional und niemand schreibt es mehr, also liest sich eine Wertzuweisung als blankes =. Für Objekte gibt es keine solche Abkürzung: Set ist Pflicht und darf nie wegfallen. Genau diese Asymmetrie macht den Fehler des fehlenden Set so leicht — jede andere Zuweisung in Ihrem Makro ist ein blankes =, und Objekte sind die eine Stelle, an der das nicht genügt.

Wie ExcelMaster hilft

Die ganze Set-Geschichte ist eine Entscheidung, die bei jeder Zuweisung fällt — ist das ein Wert, den ich kopiere, oder ein Objekt, auf das ich zeige? —, und macht man sie falsch, scheitert es laut mit 91 oder 424, oder leise mit einem Alias, den Sie nicht erwartet haben.

ExcelMaster lässt Sie die Aufgabe beschreiben — „nimm das Blatt Data, finde die letzte Zeile, schreib die Summe" — und schreibt die Objektreferenzen mit Set, wo sie hingehören, deklariert jede Variable mit dem richtigen Typ und sichert eine Suche, die Nothing zurückgeben könnte, ab, bevor sie das Ergebnis anfasst, sodass Fehler 91 Sie nie erreicht. Sie behalten die Arbeitsmappe und den Code.

Häufig gestellte Fragen

Was macht Set in VBA?

Set weist einer Objektvariablen eine Referenz zu — es richtet die Variable auf ein lebendes Objekt aus, etwa einen Range, ein Worksheet, ein Workbook oder ein Dictionary. Anders als ein blankes =, das einen Wert kopiert, kopiert Set das Objekt nicht; es lässt die Variable auf das vorhandene verweisen. Objekte brauchen Set; Werte (Integer, String, Double) nicht.

Warum erhalte ich den Fehler Object variable or With block variable not set?

Das ist Laufzeitfehler 91, und er bedeutet, dass Sie eine Objektvariable verwendet haben, die auf nichts zeigt. Meist haben Sie sie mit Dim deklariert, aber nie mit Set zugewiesen, oder Sie haben ein blankes = statt Set geschrieben (ein blankes = kann keine Objektvariable ausrichten), oder das, was Sie zugewiesen haben — etwa ein Find-Ergebnis — gab Nothing zurück. Fügen Sie das Set hinzu und prüfen Sie, dass das zugewiesene Objekt tatsächlich existiert.

Was ist der Unterschied zwischen Fehler 91 und Fehler 424?

Fehler 91, Object variable or With block variable not set, bedeutet, dass Sie eine Objektvariable verwendet haben, die gerade Nothing ist — die Lösung ist, sie zuerst mit Set zuzuweisen. Fehler 424, Object required, bedeutet, dass Sie Set (oder Objekt-Syntax) auf etwas angewandt haben, das kein Objekt ist — etwa Set n = 5 —, die Lösung ist also, das Set zu entfernen oder ein echtes Objekt auf die rechte Seite zu setzen.

Brauche ich Set für einen String oder ein Integer?

Nein. String, Integer, Long, Double, Boolean, Date und andere Werttypen werden mit einem blanken = zugewiesen, weil sie kopiert und nicht referenziert werden. Set ist nur für Objekttypen da. Set auf einem Wert löst Fehler 424 aus, Object required.

Kopiert Set das Objekt?

Nein — Set richtet die Variable auf das vorhandene Objekt aus. Set b = a gibt Ihnen zwei Variablen, die auf dasselbe lebende Objekt verweisen, eine Änderung durch b ist also durch a sichtbar. Um die zugrunde liegenden Daten zu duplizieren (bei einem Range etwa), kopieren Sie die Zellen mit a.Copy, nicht die Referenz.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 19.09.2026.

Verwandte Anleitungen: VBA New · VBA Nothing · VBA Dim · VBA CreateObject · VBA With