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

VBA New en Excel — crear objetos, New frente a CreateObject y la trampa de Dim As New

|

VBA New en Excel — crear objetos, New frente a CreateObject y la trampa de Dim As New

TL;DRNew hace que un objeto exista: Set d = New Dictionary construye un Dictionary nuevo y vacío y apunta d hacia él. New es vinculación temprana —necesita una referencia a la biblioteca pero te da IntelliSense, comprobaciones en tiempo de compilación y velocidad—. CreateObject es vinculación tardía —sin referencia, resuelta en tiempo de ejecución, portable entre máquinas—. Y evita Dim d As New Dictionary: crea el objeto de forma perezosa y lo resucita en silencio después de que lo liberas. Prefiere Dim d As Dictionary y luego Set 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 — New es el constructor, el momento en que nace un objeto
  • New frente a CreateObject —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 de Nothing
  • Por qué un New significa una instancia, y qué hace New dentro de un bucle
  • De qué puedes y de qué no puedes hacer New (tus módulos de clase y Dictionary, sí; un Worksheet, 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
  1. 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 «si d es Nothing, créalo». Pequeña, pero se ejecuta en cada una de las referencias.
  2. No puedes comprobar Is Nothing de forma fiable. En el momento en que escribes If d Is Nothing, el acto de tocar d dispara esa creación automática, así que la prueba es en la práctica siempre False. Pierdes la capacidad de preguntar «¿se llegó a asignar esto?».
  3. Se resucita a sí mismo después de que lo liberas. Set d = Nothing parece liberar el objeto, pero la siguiente vez que tocas d, 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