TL;DR —
Newfait naître un objet :Set d = New Dictionaryconstruit unDictionaryneuf et vide et y pointed.New, c'est la liaison anticipée (early binding) — elle exige une référence de bibliothèque mais vous donne IntelliSense, des vérifications à la compilation et de la rapidité.CreateObject, c'est la liaison tardive (late binding) — aucune référence, résolue à l'exécution, portable d'une machine à l'autre. Et évitezDim d As New Dictionary: il crée l'objet paresseusement et le ressuscite en silence après que vous l'avez libéré. PréférezDim d As DictionarypuisSet d = New Dictionary.
Sub CreateAnInstance()
' Liaison anticipee - Outils > References > Microsoft Scripting Runtime
Dim d As Dictionary
Set d = New Dictionary ' New construit un Dictionary neuf et vide
d.Add "a", 1
' Liaison tardive - aucune reference, resolue a l'execution, portable
Dim late As Object
Set late = CreateObject("Scripting.Dictionary")
End Sub
New est l'étape de la « naissance » dans le cycle de vie d'un objet : New crée l'objet,
Set y pointe une variable, Nothing le libère. Là où Set
décide quel objet une étiquette désigne, New décide si un objet tout neuf voit le jour, tout court.
Ce que vous allez apprendre
- Le modèle mental —
Newest le constructeur, l'instant où un objet naît NewcontreCreateObject— liaison anticipée contre liaison tardive, et quand chacune l'emporte- Le piège du
Dim As New— création paresseuse et un objet qui se ressuscite aprèsNothing - Pourquoi un
Newégale une instance, et ce que faitNewdans une boucle - Ce sur quoi vous pouvez et ne pouvez pas faire
New(vos modules de classe etDictionary, oui ; uneWorksheet, non)
Le modèle mental : New, c'est l'instant de la naissance
Une classe ou une bibliothèque vous donne un plan ; New en fabrique une instance physique.
Set d = New Dictionary, ce sont deux étapes écrites sur une seule ligne : New Dictionary construit un
dictionnaire neuf et vide en mémoire, et Set d = y pointe la variable d. Lisez de droite à gauche —
l'objet est créé d'abord, puis l'étiquette est attachée.
C'est là toute la différence entre New et Set seul. Set ws = Worksheets("Data")
pointe une étiquette vers une feuille qui existe déjà ; rien de neuf n'est créé. Set d = New Dictionary
crée l'objet avant d'y pointer. Si vous voulez un objet neuf et vide, il vous faut New (ou
CreateObject) ; si vous voulez désigner un objet qui existe déjà, Set suffit.
New contre CreateObject : liaison anticipée contre liaison tardive
Il y a deux façons de créer un objet externe, et le choix est en réalité celui entre liaison anticipée et liaison tardive :
' Liaison anticipee - New - exige la reference cochee, donne IntelliSense + controles a la compilation
Dim d As Dictionary
Set d = New Dictionary
' Liaison tardive - CreateObject - aucune reference, resolue a l'execution, portable
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
New (liaison anticipée) exige que vous ajoutiez la bibliothèque sous Outils ▸ Références (pour un
Dictionary, Microsoft Scripting Runtime). En retour, vous avez IntelliSense à la frappe, le compilateur
attrape une méthode mal orthographiée avant l'exécution, et les appels sont un brin plus rapides. Le coût : si
vous livrez le classeur sur une machine où cette référence manque ou porte une version différente, il peut
casser avec « Can't find project or library ».
CreateObject (liaison tardive) n'exige aucune référence — vous déclarez la
variable As Object et nommez la classe sous forme de chaîne, et VBA la résout à l'exécution. Cela rend le
classeur portable d'une version et d'une machine à l'autre, au prix de l'absence d'IntelliSense et d'appels un
peu plus lents. La règle empirique : New pour le code qui reste sur des machines que vous contrôlez et pour
lesquelles vous voulez de l'outillage ; CreateObject pour le code que vous distribuez largement.
Le piège du Dim As New
Dim d As New Dictionary a l'air d'un raccourci bien propre — déclarer et créer en une ligne. C'est la seule
forme à éviter, pour trois raisons qui remontent toutes au même comportement : VBA ne crée pas l'objet au
Dim ; il le crée paresseusement, à la première utilisation, et revérifie à chaque utilisation.
Dim d As New Dictionary ' a l'air pratique - mais l'objet n'est pas encore cree
' ... plus tard ...
d.Add "a", 1 ' MAINTENANT VBA le cree en silence, au premier contact
- Il est créé paresseusement, avec un test caché à chaque accès. Derrière chaque utilisation de
d, VBA insère un test invisible « sidvaut Nothing, crée-le ». Minime, mais il s'exécute à chaque référence, sans exception. - Vous ne pouvez pas tester
Is Nothingde façon fiable. Dès que vous écrivezIf d Is Nothing, le simple fait de toucherddéclenche cette auto-création, si bien que le test vaut en pratique toujoursFalse. Vous perdez la possibilité de demander « a-t-il jamais été affecté ? ». - Il se ressuscite après que vous l'avez libéré.
Set d = Nothingsemble libérer l'objet, mais dès la fois suivante où vous touchezd, VBA en fabrique un nouveau, vide. Vous ne pouvez jamais vraiment le lâcher.
Le correctif est de séparer la déclaration de la création, ce qui est aussi plus clair à lire :
Dim d As Dictionary ' declare le type - d demarre a Nothing
Set d = New Dictionary ' le cree exactement quand vous le voulez
Un New, une instance
New crée un objet à chaque exécution. Cela compte surtout dans les boucles. Si vous avez besoin d'un objet
neuf à chaque itération — une nouvelle instance de classe par ligne, par exemple — placez le New à
l'intérieur de la boucle :
Dim i As Long, item As clsLineItem
For i = 1 To 100
Set item = New clsLineItem ' un objet tout neuf a chaque passage
item.Load rows(i)
log.Add item
Next i
Chaque passage construit un nouveau clsLineItem et le précédent continue de vivre dans log. Si, au
contraire, vous faites New une seule fois avant la boucle et réutilisez le même objet, chaque entrée de
log finit par pointer vers la même instance, qui contient les données de la dernière ligne — le classique
bug « tous mes enregistrements sont identiques ».
Ce que vous pouvez créer avec New, et ce que vous ne pouvez pas
Vous pouvez faire New sur vos propres modules de classe, et sur les classes de bibliothèque instanciables
comme Dictionary (avec la référence) et le Collection intrinsèque (New Collection n'exige aucune
référence — il est intégré à VBA). Ce sur quoi vous ne pouvez pas faire New, ce sont les objets du modèle
propre à Excel : il n'existe pas de New Worksheet ni de New Workbook. Ceux-là se créent via le modèle objet
— Worksheets.Add, Workbooks.Add — parce que c'est Excel qui possède leur durée de vie, pas vous. Tenter
Set ws = New Worksheet est une erreur de compilation, pas d'exécution.
Comment ExcelMaster vous aide
Créer un objet comporte plus de bifurcations qu'il n'y paraît : New ou CreateObject, liaison anticipée ou
tardive, une référence à cocher ou non, et le raccourci Dim As New qui casse en silence la libération et
Is Nothing.
ExcelMaster choisit le bon à partir de ce que
vous décrivez — la liaison tardive avec CreateObject quand vous dites que la macro doit tourner sur les
machines d'autres personnes, la liaison anticipée avec New et la référence signalée quand vous voulez de la
rapidité et de l'outillage — et il sépare toujours Dim d As Dictionary de Set d = New Dictionary, si bien
que la création paresseuse et l'auto-résurrection ne vous mordent jamais. Vous gardez le classeur et le code.
Questions fréquentes
Que fait New en VBA ?
New crée une toute nouvelle instance d'un objet à partir du plan de sa classe ou de sa bibliothèque.
Set d = New Dictionary construit un Dictionary neuf et vide en mémoire et y pointe d. Utilisez New
quand vous voulez un nouvel objet ; utilisez un simple Set (sans New) quand vous voulez
désigner un objet qui existe déjà.
Devrais-je utiliser New ou CreateObject ?
Utilisez New (liaison anticipée) quand le code reste sur des machines que vous contrôlez et que vous voulez
IntelliSense, les contrôles à la compilation et la rapidité — il faut cocher la bibliothèque sous Outils ▸
Références. Utilisez CreateObject (liaison tardive) pour le code que vous
distribuez, car il n'exige aucune référence et reste portable d'une version à l'autre, au prix d'IntelliSense.
Qu'y a-t-il de mal avec Dim As New ?
Dim d As New Dictionary crée l'objet paresseusement à la première utilisation, insère un test caché de
Nothing avant chaque accès, rend If d Is Nothing toujours False en pratique, et ressuscite un nouvel objet
dès que vous le touchez après Set d = Nothing. Préférez Dim d As Dictionary suivi de Set d = New Dictionary, pour que création et libération soient explicites.
Puis-je utiliser New avec une Worksheet ou un Range ?
Non. Excel possède la durée de vie de Worksheet, Workbook, Range et des objets de modèle similaires, il
n'existe donc pas de New Worksheet. Créez-les plutôt via le modèle objet — Worksheets.Add, Workbooks.Add
— et réservez New à vos propres modules de classe et aux classes de bibliothèque instanciables comme
Dictionary et Collection.
Ai-je besoin de Set avec New ?
Oui, pour les variables objet : Set d = New Dictionary. New construit l'objet et Set y pointe la
variable. La seule forme qui omet Set est Dim d As New Dictionary, que nous déconseillons pour les raisons
ci-dessus.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 19/09/2026.
Guides associés : VBA Set · VBA Nothing · VBA CreateObject · VBA Dim · VBA Collection
