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

VBA New in Excel — Objekte erzeugen, New gegen CreateObject und die Dim-As-New-Falle

|

VBA New in Excel — Objekte erzeugen, New gegen CreateObject und die Dim-As-New-Falle

KurzfassungNew bringt ein Objekt zur Existenz: Set d = New Dictionary baut ein frisches, leeres Dictionary und richtet d darauf aus. New ist frühes Binden (early binding) — es braucht einen Bibliotheksverweis, gibt Ihnen aber IntelliSense, Prüfungen zur Kompilierzeit und Tempo. CreateObject ist spätes Binden (late binding) — kein Verweis, zur Laufzeit aufgelöst, über Rechner hinweg portabel. Und vermeiden Sie Dim d As New Dictionary: Es erzeugt das Objekt träge und lässt es still wieder auferstehen, nachdem Sie es freigegeben haben. Bevorzugen Sie Dim d As Dictionary und dann Set d = New Dictionary.

Sub CreateAnInstance()
    ' Fruehes Binden - Tools > References > Microsoft Scripting Runtime
    Dim d As Dictionary
    Set d = New Dictionary                        ' New baut ein brandneues, leeres Dictionary
    d.Add "a", 1

    ' Spaetes Binden - kein Verweis, zur Laufzeit aufgeloest, portabel
    Dim late As Object
    Set late = CreateObject("Scripting.Dictionary")
End Sub

New ist der „Geburts"-Schritt im Lebenszyklus eines Objekts: New erzeugt das Objekt, Set richtet eine Variable darauf aus, Nothing gibt es frei. Wo Set entscheidet, auf welches Objekt ein Etikett zeigt, entscheidet New, ob überhaupt ein brandneues entsteht.

Was Sie lernen

  • Das Denkmodell — New ist der Konstruktor, der Moment, in dem ein Objekt geboren wird
  • New gegen CreateObject — frühes Binden gegen spätes Binden, und wann welches gewinnt
  • Die Dim As New-Falle — träge Erzeugung und ein Objekt, das nach Nothing wieder aufersteht
  • Warum ein New eine Instanz bedeutet, und was New in einer Schleife bewirkt
  • Was Sie mit New erzeugen können und was nicht (Ihre Klassenmodule und Dictionary ja; ein Worksheet nein)

Das Denkmodell: New ist der Moment der Geburt

Eine Klasse oder eine Bibliothek gibt Ihnen einen Bauplan; New stanzt daraus eine physische Instanz. Set d = New Dictionary sind zwei Schritte in einer Zeile: New Dictionary baut ein neues, leeres Dictionary im Speicher, und Set d = richtet die Variable d darauf aus. Lesen Sie es von rechts nach links — zuerst wird das Objekt erzeugt, dann das Etikett angeheftet.

Das ist der Unterschied zwischen New und Set allein. Set ws = Worksheets("Data") richtet ein Etikett auf ein Blatt aus, das bereits existiert; nichts Neues wird erzeugt. Set d = New Dictionary erzeugt das Objekt, bevor es darauf zeigt. Wollen Sie ein frisches, leeres Objekt, brauchen Sie New (oder CreateObject); wollen Sie auf eines verweisen, das schon existiert, brauchen Sie nur Set.

New gegen CreateObject: frühes gegen spätes Binden

Es gibt zwei Wege, ein externes Objekt zu erzeugen, und die Wahl ist in Wahrheit die zwischen frühem und spätem Binden:

' Fruehes Binden - New - braucht den gesetzten Verweis, gibt IntelliSense + Kompilierpruefungen
Dim d As Dictionary
Set d = New Dictionary

' Spaetes Binden - CreateObject - kein Verweis, zur Laufzeit aufgeloest, portabel
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")

New (frühes Binden) verlangt, dass Sie die Bibliothek unter Tools ▸ References hinzufügen (für ein Dictionary die Microsoft Scripting Runtime). Dafür bekommen Sie IntelliSense beim Tippen, der Compiler fängt eine falsch geschriebene Methode ab, bevor Sie laufen, und die Aufrufe sind eine Spur schneller. Der Preis: Liefern Sie die Arbeitsmappe an einen Rechner aus, auf dem dieser Verweis fehlt oder eine andere Version hat, kann sie mit Can't find project or library brechen.

CreateObject (spätes Binden) braucht gar keinen Verweis — Sie deklarieren die Variable As Object und benennen die Klasse als Zeichenkette, und VBA löst sie zur Laufzeit auf. Das macht die Arbeitsmappe portabel über Versionen und Rechner hinweg, zum Preis von fehlendem IntelliSense und etwas langsameren Aufrufen. Die Faustregel: New für Code, der auf Rechnern bleibt, die Sie kontrollieren und für die Sie Werkzeugunterstützung wollen; CreateObject für Code, den Sie breit verteilen.

Die Dim-As-New-Falle

Dim d As New Dictionary sieht aus wie eine saubere Abkürzung — deklarieren und erzeugen in einer Zeile. Es ist die eine Form, die man meiden sollte, aus drei Gründen, die alle auf dasselbe Verhalten zurückgehen: VBA erzeugt das Objekt nicht beim Dim; es erzeugt es träge, bei der ersten Verwendung, und prüft bei jeder Verwendung erneut.

Dim d As New Dictionary        ' sieht bequem aus - aber das Objekt ist noch nicht erzeugt
' ... spaeter ...
d.Add "a", 1                   ' JETZT erzeugt VBA es still, bei der ersten Beruehrung
  1. Es wird träge erzeugt, mit einer versteckten Prüfung bei jedem Zugriff. Hinter jeder Verwendung von d fügt VBA einen unsichtbaren Test „wenn d Nothing ist, erzeuge es" ein. Klein, aber er läuft bei jeder einzelnen Referenz.
  2. Sie können Is Nothing nicht zuverlässig testen. In dem Moment, in dem Sie If d Is Nothing schreiben, löst das Anfassen von d genau jene automatische Erzeugung aus, der Test ist also praktisch immer False. Sie verlieren die Möglichkeit zu fragen „wurde das je gesetzt?".
  3. Es ersteht wieder auf, nachdem Sie es freigegeben haben. Set d = Nothing scheint das Objekt freizugeben, aber gleich beim nächsten Anfassen von d macht VBA ein neues leeres. Sie können es nie wirklich loslassen.

Die Lösung ist, Deklaration und Erzeugung zu trennen, was sich auch klarer liest:

Dim d As Dictionary            ' den Typ deklarieren - d startet als Nothing
Set d = New Dictionary         ' es genau dann erzeugen, wenn Sie es meinen

Ein New ist eine Instanz

New erzeugt bei jedem Durchlauf ein Objekt. Das zählt am meisten in Schleifen. Brauchen Sie pro Durchlauf ein frisches Objekt — etwa eine neue Klasseninstanz pro Zeile —, setzen Sie das New in die Schleife:

Dim i As Long, item As clsLineItem
For i = 1 To 100
    Set item = New clsLineItem     ' ein brandneues Objekt bei jedem Durchlauf
    item.Load rows(i)
    log.Add item
Next i

Jeder Durchlauf baut ein neues clsLineItem, und das vorige lebt in log weiter. Wenn Sie stattdessen einmal vor der Schleife New aufrufen und dasselbe Objekt wiederverwenden, zeigt am Ende jeder Eintrag in log auf dieselbe Instanz, die die Daten der letzten Zeile hält — ein klassischer Fehler nach dem Muster „alle meine Datensätze sind identisch".

Was Sie mit New erzeugen können und was nicht

Mit New erzeugen können Sie Ihre eigenen Klassenmodule sowie erzeugbare Bibliotheksklassen wie Dictionary (mit dem Verweis) und die intrinsische Collection (New Collection braucht gar keinen Verweis — sie ist in VBA eingebaut). Was Sie nicht mit New erzeugen können, sind Excels eigene Modellobjekte: Es gibt kein New Worksheet oder New Workbook. Die werden über das Objektmodell erzeugt — Worksheets.Add, Workbooks.Add —, denn über ihre Lebensdauer bestimmt Excel, nicht Sie. Set ws = New Worksheet zu versuchen ist ein Kompilierfehler, kein Laufzeitfehler.

Wie ExcelMaster hilft

Ein Objekt zu erzeugen hat mehr Weggabelungen, als es aussieht: New oder CreateObject, frühes oder spätes Binden, ein Verweis, den man setzt oder nicht, und die Dim As New-Abkürzung, die still das Freigeben und Is Nothing kaputtmacht.

ExcelMaster wählt aus dem, was Sie beschreiben, das Richtige — spätes Binden mit CreateObject, wenn Sie sagen, das Makro muss auf fremden Rechnern laufen, frühes Binden mit New und dem vermerkten Verweis, wenn Sie Tempo und Werkzeuge wollen — und trennt stets Dim d As Dictionary von Set d = New Dictionary, sodass träge Erzeugung und Selbstauferstehung Sie nie erwischen. Sie behalten die Arbeitsmappe und den Code.

Häufig gestellte Fragen

Was macht New in VBA?

New erzeugt eine brandneue Instanz eines Objekts aus dem Bauplan seiner Klasse oder Bibliothek. Set d = New Dictionary baut ein frisches, leeres Dictionary im Speicher und richtet d darauf aus. Verwenden Sie New, wenn Sie ein neues Objekt wollen; verwenden Sie schlichtes Set (ohne New), wenn Sie auf ein Objekt verweisen wollen, das bereits existiert.

Sollte ich New oder CreateObject verwenden?

Verwenden Sie New (frühes Binden), wenn der Code auf Rechnern bleibt, die Sie kontrollieren, und Sie IntelliSense, Kompilierprüfungen und Tempo wollen — es braucht die gesetzte Bibliothek unter Tools ▸ References. Verwenden Sie CreateObject (spätes Binden) für Code, den Sie verteilen, denn es braucht keinen Verweis und ist über Versionen hinweg portabel, zum Preis von IntelliSense.

Was ist an Dim As New falsch?

Dim d As New Dictionary erzeugt das Objekt träge bei der ersten Verwendung, fügt vor jedem Zugriff eine versteckte Nothing-Prüfung ein, macht If d Is Nothing praktisch immer False und erweckt beim nächsten Anfassen nach Set d = Nothing ein neues Objekt. Bevorzugen Sie Dim d As Dictionary gefolgt von Set d = New Dictionary, damit Erzeugung und Freigabe ausdrücklich sind.

Kann ich New mit einem Worksheet oder Range verwenden?

Nein. Über die Lebensdauer von Worksheet, Workbook, Range und ähnlichen Modellobjekten bestimmt Excel, es gibt also kein New Worksheet. Erzeugen Sie sie stattdessen über das Objektmodell — Worksheets.Add, Workbooks.Add — und nutzen Sie New nur für Ihre eigenen Klassenmodule und erzeugbare Bibliotheksklassen wie Dictionary und Collection.

Brauche ich Set zusammen mit New?

Ja, bei Objektvariablen: Set d = New Dictionary. New baut das Objekt und Set richtet die Variable darauf aus. Die einzige Form, die Set weglässt, ist Dim d As New Dictionary, von der wir aus den oben genannten Gründen abraten.

Getestet in

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

Verwandte Anleitungen: VBA Set · VBA Nothing · VBA CreateObject · VBA Dim · VBA Collection