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

VBA New dans Excel — créer des objets, New contre CreateObject, et le piège du Dim As New

|

VBA New dans Excel — créer des objets, New contre CreateObject, et le piège du Dim As New

TL;DRNew fait naître un objet : Set d = New Dictionary construit un Dictionary neuf et vide et y pointe d. 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 évitez Dim 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érez Dim d As Dictionary puis Set 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 — New est le constructeur, l'instant où un objet naît
  • New contre CreateObject — 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ès Nothing
  • Pourquoi un New égale une instance, et ce que fait New dans une boucle
  • Ce sur quoi vous pouvez et ne pouvez pas faire New (vos modules de classe et Dictionary, oui ; une Worksheet, 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
  1. Il est créé paresseusement, avec un test caché à chaque accès. Derrière chaque utilisation de d, VBA insère un test invisible « si d vaut Nothing, crée-le ». Minime, mais il s'exécute à chaque référence, sans exception.
  2. Vous ne pouvez pas tester Is Nothing de façon fiable. Dès que vous écrivez If d Is Nothing, le simple fait de toucher d déclenche cette auto-création, si bien que le test vaut en pratique toujours False. Vous perdez la possibilité de demander « a-t-il jamais été affecté ? ».
  3. Il se ressuscite après que vous l'avez libéré. Set d = Nothing semble libérer l'objet, mais dès la fois suivante où vous touchez d, 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