Kurzfassung —
Newbringt ein Objekt zur Existenz:Set d = New Dictionarybaut ein frisches, leeresDictionaryund richtetddarauf aus.Newist frühes Binden (early binding) — es braucht einen Bibliotheksverweis, gibt Ihnen aber IntelliSense, Prüfungen zur Kompilierzeit und Tempo.CreateObjectist spätes Binden (late binding) — kein Verweis, zur Laufzeit aufgelöst, über Rechner hinweg portabel. Und vermeiden SieDim d As New Dictionary: Es erzeugt das Objekt träge und lässt es still wieder auferstehen, nachdem Sie es freigegeben haben. Bevorzugen SieDim d As Dictionaryund dannSet 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 —
Newist der Konstruktor, der Moment, in dem ein Objekt geboren wird NewgegenCreateObject— frühes Binden gegen spätes Binden, und wann welches gewinnt- Die
Dim As New-Falle — träge Erzeugung und ein Objekt, das nachNothingwieder aufersteht - Warum ein
Neweine Instanz bedeutet, und wasNewin einer Schleife bewirkt - Was Sie mit
Newerzeugen können und was nicht (Ihre Klassenmodule undDictionaryja; einWorksheetnein)
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
- Es wird träge erzeugt, mit einer versteckten Prüfung bei jedem Zugriff. Hinter jeder Verwendung von
dfügt VBA einen unsichtbaren Test „wenndNothing ist, erzeuge es" ein. Klein, aber er läuft bei jeder einzelnen Referenz. - Sie können
Is Nothingnicht zuverlässig testen. In dem Moment, in dem SieIf d Is Nothingschreiben, löst das Anfassen vondgenau jene automatische Erzeugung aus, der Test ist also praktisch immerFalse. Sie verlieren die Möglichkeit zu fragen „wurde das je gesetzt?". - Es ersteht wieder auf, nachdem Sie es freigegeben haben.
Set d = Nothingscheint das Objekt freizugeben, aber gleich beim nächsten Anfassen vondmacht 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
