TL;DR —
Newhace que un objeto exista:Set d = New Dictionaryconstruye unDictionarynuevo y vacío y apuntadhacia él.Newes vinculación temprana —necesita una referencia a la biblioteca pero te da IntelliSense, comprobaciones en tiempo de compilación y velocidad—.CreateObjectes vinculación tardía —sin referencia, resuelta en tiempo de ejecución, portable entre máquinas—. Y evitaDim d As New Dictionary: crea el objeto de forma perezosa y lo resucita en silencio después de que lo liberas. PrefiereDim d As Dictionaryy luegoSet d = New Dictionary.
Sub CreateAnInstance()
' Vinculacion temprana - Tools > References > Microsoft Scripting Runtime
Dim d As Dictionary
Set d = New Dictionary ' New construye un Dictionary nuevo y vacio
d.Add "a", 1
' Vinculacion tardia - sin referencia, resuelta en tiempo de ejecucion, portable
Dim late As Object
Set late = CreateObject("Scripting.Dictionary")
End Sub
New es el paso del «nacimiento» en el ciclo de vida de un objeto: New crea el objeto,
Set apunta una variable hacia él, Nothing lo libera. Donde
Set decide a qué objeto apunta una etiqueta, New decide si llega a existir uno totalmente nuevo.
Lo que aprenderás
- El modelo mental —
Newes el constructor, el momento en que nace un objeto Newfrente aCreateObject—vinculación temprana frente a vinculación tardía, y cuándo gana cada una- La trampa de
Dim As New—creación perezosa y un objeto que se resucita a sí mismo después deNothing - Por qué un
Newsignifica una instancia, y qué haceNewdentro de un bucle - De qué puedes y de qué no puedes hacer
New(tus módulos de clase yDictionary, sí; unWorksheet, no)
El modelo mental: New es el momento del nacimiento
Una clase o una biblioteca te da un plano; New estampa una instancia física a partir de él.
Set d = New Dictionary son dos pasos escritos en una línea: New Dictionary construye un diccionario nuevo
y vacío en memoria, y Set d = apunta la variable d hacia él. Léelo de derecha a izquierda —primero se
crea el objeto, luego se le engancha la etiqueta—.
Esa es la diferencia entre New y Set a solas. Set ws = Worksheets("Data") apunta
una etiqueta a una hoja que ya existe; no se crea nada nuevo. Set d = New Dictionary crea el objeto
antes de apuntar hacia él. Si quieres un objeto nuevo y vacío, necesitas New (o CreateObject); si quieres
referirte a uno que ya existe, solo necesitas Set.
New frente a CreateObject: vinculación temprana frente a tardía
Hay dos formas de crear un objeto externo, y la elección es en realidad la elección entre vinculación temprana y tardía:
' Early binding - New - needs the reference ticked, gives IntelliSense + compile checks
Dim d As Dictionary
Set d = New Dictionary
' Late binding - CreateObject - no reference, resolved at run time, portable
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
New (vinculación temprana) te obliga a añadir la biblioteca en Tools ▸ References (para un
Dictionary, Microsoft Scripting Runtime). A cambio obtienes IntelliSense mientras escribes, el compilador
detecta un método mal escrito antes de ejecutar, y las llamadas son un pelín más rápidas. El coste: si llevas
el libro a una máquina donde esa referencia falta o es de otra versión, puede romperse con «Can't find
project or library».
CreateObject (vinculación tardía) no necesita referencia alguna —declaras
la variable As Object y nombras la clase como una cadena, y VBA la resuelve en tiempo de ejecución—. Eso
hace el libro portable entre versiones y máquinas, al precio de no tener IntelliSense y llamadas algo más
lentas. La regla práctica: New para el código que se queda en máquinas que controlas y para las que quieres
herramientas; CreateObject para el código que distribuyes a lo ancho.
La trampa de Dim As New
Dim d As New Dictionary parece un atajo pulcro —declarar y crear en una línea—. Es la única forma que hay
que evitar, por tres razones que se reducen todas al mismo comportamiento: VBA no crea el objeto en el
Dim; lo crea de forma perezosa, en el primer uso, y vuelve a comprobarlo en cada uso.
Dim d As New Dictionary ' parece comodo - pero el objeto aun no esta creado
' ... mas tarde ...
d.Add "a", 1 ' AHORA VBA lo crea en silencio, en el primer contacto
- Se crea de forma perezosa, con una comprobación oculta en cada acceso. Detrás de cada uso de
d, VBA inserta una prueba invisible de «sides Nothing, créalo». Pequeña, pero se ejecuta en cada una de las referencias. - No puedes comprobar
Is Nothingde forma fiable. En el momento en que escribesIf d Is Nothing, el acto de tocarddispara esa creación automática, así que la prueba es en la práctica siempreFalse. Pierdes la capacidad de preguntar «¿se llegó a asignar esto?». - Se resucita a sí mismo después de que lo liberas.
Set d = Nothingparece liberar el objeto, pero la siguiente vez que tocasd, VBA crea uno nuevo y vacío. Nunca puedes soltarlo de verdad.
La solución es separar la declaración de la creación, lo cual además se lee más claro:
Dim d As Dictionary ' declara el tipo - d empieza como Nothing
Set d = New Dictionary ' crealo justo cuando lo quieres hacer
Un New es una instancia
New crea un objeto cada vez que se ejecuta. Eso importa sobre todo en los bucles. Si necesitas un objeto
nuevo por iteración —una instancia de clase nueva por fila, pongamos—, pon el New dentro del bucle:
Dim i As Long, item As clsLineItem
For i = 1 To 100
Set item = New clsLineItem ' un objeto totalmente nuevo en cada pasada
item.Load rows(i)
log.Add item
Next i
Cada pasada construye un clsLineItem nuevo y el anterior sigue vivo dentro de log. Si en cambio haces
New una sola vez antes del bucle y reutilizas el mismo objeto, cada entrada de log acaba apuntando a la
misma instancia que contiene los datos de la última fila —el clásico fallo de «todos mis registros son
idénticos»—.
De qué puedes y de qué no puedes hacer New
Puedes hacer New de tus propios módulos de clase, y de clases de biblioteca instanciables como Dictionary
(con la referencia) y el Collection intrínseco (New Collection no necesita referencia alguna —viene
integrado en VBA—). De lo que no puedes hacer New es de los objetos del modelo de Excel: no hay
New Worksheet ni New Workbook. Esos se crean a través del modelo de objetos —Worksheets.Add,
Workbooks.Add— porque Excel es el dueño de su ciclo de vida, no tú. Intentar Set ws = New Worksheet es un
error de compilación, no de ejecución.
Cómo te ayuda ExcelMaster
Crear un objeto tiene más bifurcaciones de las que parece: New o CreateObject, vinculación temprana o
tardía, una referencia que marcar o no, y el atajo Dim As New que rompe en silencio la liberación y el
Is Nothing.
ExcelMaster elige el correcto a partir de lo
que describes —vinculación tardía con CreateObject cuando dices que la macro tiene que ejecutarse en las
máquinas de otras personas, vinculación temprana con New y la referencia anotada cuando quieres velocidad y
herramientas— y siempre separa Dim d As Dictionary de Set d = New Dictionary, así que la creación
perezosa y la autorresurrección nunca te muerden. Tú conservas el libro y el código.
Preguntas frecuentes
¿Qué hace New en VBA?
New crea una instancia totalmente nueva de un objeto a partir del plano de su clase o biblioteca.
Set d = New Dictionary construye un Dictionary nuevo y vacío en memoria y apunta d hacia él. Usa New
cuando quieres un objeto nuevo; usa el simple Set (sin New) cuando quieres referirte
a un objeto que ya existe.
¿Debo usar New o CreateObject?
Usa New (vinculación temprana) cuando el código se queda en máquinas que controlas y quieres IntelliSense,
comprobaciones de compilación y velocidad —necesita la biblioteca marcada en Tools ▸ References—. Usa
CreateObject (vinculación tardía) para el código que distribuyes, porque no
necesita referencia y es portable entre versiones, a costa de IntelliSense.
¿Qué tiene de malo Dim As New?
Dim d As New Dictionary crea el objeto de forma perezosa en el primer uso, inserta una comprobación oculta
de Nothing antes de cada acceso, hace que If d Is Nothing sea en la práctica siempre False, y resucita un
objeto nuevo la siguiente vez que lo tocas después de Set d = Nothing. Prefiere Dim d As Dictionary
seguido de Set d = New Dictionary para que la creación y la liberación sean explícitas.
¿Puedo usar New con un Worksheet o un Range?
No. Excel es el dueño del ciclo de vida de Worksheet, Workbook, Range y objetos de modelo similares,
así que no existe New Worksheet. Créalos a través del modelo de objetos —Worksheets.Add, Workbooks.Add—
y usa New solo para tus propios módulos de clase y clases de biblioteca instanciables como Dictionary y
Collection.
¿Necesito Set con New?
Sí, para las variables de objeto: Set d = New Dictionary. New construye el objeto y Set apunta la
variable hacia él. La única forma que omite Set es Dim d As New Dictionary, que recomendamos evitar por
las razones de arriba.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 19/09/2026.
Guías relacionadas: VBA Set · VBA Nothing · VBA CreateObject · VBA Dim · VBA Collection
