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

VBA Nothing en Excel — liberar referencias, Is Nothing frente a = Nothing y cuándo importa

|

VBA Nothing en Excel — liberar referencias, Is Nothing frente a = Nothing y cuándo importa

TL;DRNothing es el estado de referencia vacía: una variable de objeto que no apunta a ningún objeto. Compruébalo con If x Is Nothing —el operador Is, nunca un = a secas, porque los objetos no se pueden comparar con =—. Set x = Nothing libera la referencia. Toda variable de objeto empieza como Nothing, y usar una mientras sigue siendo Nothing es el origen del error 91, «Object variable or With block variable not set».

Sub NothingBasics()
    Dim ws As Worksheet              ' empieza como Nothing - no apunta a ninguna hoja
    Set ws = FindSheet("Data")       ' una funcion que puede devolver Nothing

    If ws Is Nothing Then            ' Is, no = (un = a secas no compila aqui)
        MsgBox "Sheet not found"
        Exit Sub
    End If

    ws.Range("A1").Value = 1
    Set ws = Nothing                 ' libera la referencia
End Sub

Nothing es el paso de la «liberación» en el ciclo de vida de un objeto: creas un objeto con New, apuntas una variable hacia él con Set, y sueltas la referencia con Nothing. También es el estado inicial de toda variable de objeto —que es justo por lo que un objeto sin Set revienta—.

Lo que aprenderás

  • El modelo mental — Nothing es un puntero vacío, una etiqueta enganchada a ningún objeto
  • Por qué debes comprobar con If x Is Nothing, y nunca con If x = Nothing
  • El uso real más común — proteger un Find o una búsqueda que devolvió Nothing
  • Cuándo Set x = Nothing importa de verdad, y cuándo es un ritual inofensivo
  • En qué se diferencia Nothing de Empty, Null y "" (no son intercambiables)

El modelo mental: un puntero vacío

Si una variable de objeto es una etiqueta que apunta a una cosa, entonces Nothing es esa etiqueta apuntando a ninguna cosa. No es cero, ni una cadena vacía, ni «en blanco» —eso describe valores—. Nothing es el estado concreto de una referencia que no tiene ningún objeto al otro extremo.

Toda variable de objeto empieza ahí. En el momento en que escribes Dim ws As Worksheet, ws es Nothing; sigue siendo Nothing hasta que un Set la apunta a una hoja de verdad. Ese único hecho explica el error 91: usa una variable de objeto antes de asignarla con Set y estás desreferenciando Nothing —«Object variable or With block variable not set» (ver Set)—. Nothing es a la vez donde nace una referencia y adonde va cuando la liberas.

Comprueba con Is Nothing, nunca con = Nothing

Esta es la trampa que pilla a todo el mundo una vez. No puedes comprobar si una referencia está vacía con =:

If ws = Nothing Then      ' MAL - no compila / error de tipos
If ws Is Nothing Then     ' BIEN - Is compara identidad, no valor

= pregunta «¿son iguales estos dos valores?», y comparar así necesita un valor por defecto —por eso Range("A1") = 5 funciona pero ws = Nothing no—. Is hace una pregunta distinta: «¿apuntan estas dos etiquetas al mismo objeto (o a ningún objeto)?». Comprobar si algo es Nothing, o si dos variables se refieren al mismo objeto, es una pregunta de identidad, así que usa Is. Para comprobar lo contrario, envuélvelo: If Not ws Is Nothing Then.

El uso real número uno: proteger un Find que devolvió Nothing

El sitio con diferencia más común donde Nothing aparece en las macros reales es el resultado de una búsqueda. Range.Find devuelve Nothing cuando no encuentra ninguna coincidencia —y buscar .Row sobre ese resultado es un error 91 sin más—:

Dim hit As Range
Set hit = ws.Columns("A").Find(What:="Total", LookAt:=xlWhole)

If hit Is Nothing Then                ' la proteccion que evita el error 91
    MsgBox "No 'Total' row found"
    Exit Sub
End If

MsgBox "Found in row " & hit.Row      ' seguro - sabemos que hit apunta a una celda real

Cualquier API que «podría no encontrar ninguno» —Find, una búsqueda en un Dictionary envuelta en un ayudante, una función que devuelve un objeto— puede entregarte Nothing. El hábito que te salva: siempre que una asignación pueda dar Nothing, comprueba Is Nothing antes de usar el resultado.

Cuándo Set x = Nothing importa de verdad

Aquí está la respuesta honesta que la mayoría de los tutoriales se salta: para una variable de objeto local normal, Set x = Nothing al final de un Sub suele ser redundante. VBA libera automáticamente las referencias de objeto locales cuando la variable sale de ámbito al terminar el procedimiento. Ponerlas a Nothing antes es inofensivo, pero es un ritual, no una necesidad.

Importa de verdad en tres casos:

  • Referencias circulares. Si el objeto A guarda una referencia a B y B guarda otra de vuelta a A, se mantienen vivos mutuamente y nunca se reclaman, ni siquiera después de que termine el Sub. Set A.Partner = Nothing de forma explícita rompe el ciclo para que ambos se puedan liberar.
  • Variables de objeto a nivel de módulo, globales o Static. Estas sobreviven al procedimiento que las llenó, así que retienen su objeto —y cualquier recurso de Excel que este bloquee— hasta que las liberas o el libro se cierra. Libéralas a propósito cuando termines.
  • Objetos de aplicación externa. Un Outlook.Application o un Word.Application que hayas creado sigue ejecutándose en segundo plano hasta que toda referencia a él sea Nothing. Libéralo pronto para que el otro programa pueda cerrarse.

La regla: libera a propósito allí donde una referencia es de larga vida o compartida; no apliques Set x = Nothing por inercia a cada variable local.

Nothing no es Empty, Null ni la cadena vacía

Cuatro «vacíos» distintos hacen tropezar a la gente porque el lenguaje corriente los mete a todos en el mismo saco. VBA los mantiene estrictamente separados:

  • Nothing — una referencia de objeto que no apunta a ningún objeto (If obj Is Nothing).
  • Empty — un Variant sin inicializar al que nunca se ha asignado nada (If IsEmpty(v)).
  • Null — un Variant que contiene a propósito «ningún dato válido», casi siempre de un campo de base de datos (If IsNull(v)).
  • "" — un String de longitud cero. Una cadena de verdad, solo que vacía (If s = "").

No son intercambiables, y cada uno tiene su propia comprobación. Usar Is Nothing sobre un Variant, o IsNull sobre un objeto, no hará lo que esperas. Nothing es el de los objetos —resérvalo para las referencias—.

Cómo te ayuda ExcelMaster

Nothing se sitúa en los dos extremos de la vida de un objeto, y cada movimiento equivocado a su alrededor falla de una forma fácil de pasar por alto: un = Nothing que no compila, un resultado de Find usado sin protección que lanza el 91, una aplicación externa que se queda ejecutándose porque una referencia nunca se liberó.

ExcelMaster escribe la protección por ti —If Not hit Is Nothing Then después de cualquier búsqueda—, usa Is para cada comprobación de identidad, y libera las referencias de larga vida y las externas que de verdad lo necesitan sin sembrar Set x = Nothing por cada variable local. Tú describes el resultado; él se ocupa del ciclo de vida. Tú conservas el libro y el código.

Preguntas frecuentes

¿Qué significa Nothing en VBA?

Nothing es el estado de referencia vacía de una variable de objeto —la variable no apunta a ningún objeto—. Toda variable de objeto empieza como Nothing hasta que un Set le da uno, y Set x = Nothing la devuelve a ese estado. Se aplica solo a los objetos, no a los valores.

¿Por qué no puedo usar If x = Nothing?

Porque = compara valores, y una referencia de objeto no tiene ningún valor que comparar —así que If x = Nothing no compila o lanza un error de tipos—. Usa en su lugar el operador de identidad: If x Is Nothing. Para comprobar lo contrario, escribe If Not x Is Nothing.

¿Necesito poner los objetos a Nothing con Set al final de una macro?

Normalmente no. VBA libera las variables de objeto locales automáticamente cuando termina el procedimiento, así que Set x = Nothing sobre una local normal es un ritual inofensivo. Sí importa para las referencias circulares, para las variables de objeto a nivel de módulo o globales que sobreviven al procedimiento, y para los objetos de aplicación externa como Outlook.Application que conviene liberar pronto.

¿Cómo compruebo si un Find o una búsqueda no devolvió nada?

Comprueba el resultado con Is Nothing antes de usarlo: Set hit = ws.Columns("A").Find("Total") y luego If hit Is Nothing Then ... Exit Sub. Range.Find devuelve Nothing cuando no hay coincidencia, y tocar .Row sobre un resultado Nothing lanza el error 91, «Object variable or With block variable not set».

¿Cuál es la diferencia entre Nothing, Empty, Null y la cadena vacía?

Nothing es una referencia de objeto que no apunta a ningún objeto; Empty es un Variant sin inicializar; Null es un Variant que contiene «ningún dato válido», a menudo de una base de datos; "" es un String de longitud cero. Son estados distintos con comprobaciones distintas (Is Nothing, IsEmpty, IsNull, = "") y no son intercambiables.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 19/09/2026.

Guías relacionadas: VBA Set · VBA New · VBA Dim · VBA CreateObject · VBA With