TL;DR —
Nothinges el estado de referencia vacía: una variable de objeto que no apunta a ningún objeto. Compruébalo conIf x Is Nothing—el operadorIs, nunca un=a secas, porque los objetos no se pueden comparar con=—.Set x = Nothinglibera la referencia. Toda variable de objeto empieza comoNothing, y usar una mientras sigue siendoNothinges 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 —
Nothinges un puntero vacío, una etiqueta enganchada a ningún objeto - Por qué debes comprobar con
If x Is Nothing, y nunca conIf x = Nothing - El uso real más común — proteger un
Findo una búsqueda que devolvióNothing - Cuándo
Set x = Nothingimporta de verdad, y cuándo es un ritual inofensivo - En qué se diferencia
NothingdeEmpty,Nully""(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 = Nothingde 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.Applicationo unWord.Applicationque hayas creado sigue ejecutándose en segundo plano hasta que toda referencia a él seaNothing. 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— unVariantsin inicializar al que nunca se ha asignado nada (If IsEmpty(v)).Null— unVariantque contiene a propósito «ningún dato válido», casi siempre de un campo de base de datos (If IsNull(v)).""— unStringde 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
