TL;DR —
IsEmptyno mira la celda. Hace una única pregunta, muy concreta, sobre un Variant: ¿se le asignó alguna vez un valor? Para una celda que nadie ha tocado,IsEmptyda True. Para una celda con una fórmula que devuelve"", con un espacio o con un apóstrofo suelto da False, aunque las tres parezcan vacías. Un rango de varias celdas nunca da True, y una variableStringtampoco. Así que, antes de comprobar si algo está «vacío», decide a qué vacío te refieres: nunca se escribió nada (IsEmpty), no se muestra nada (una prueba de longitud tras recortar espacios que se salta las celdas con error) o todo un rango no contiene nada (CountAoCountBlank).
If IsEmpty(Range("A2").Value) Then
Debug.Print "Nothing was ever entered in A2"
End If
Este es el primer artículo de una serie sobre preguntarle a un valor qué es: aquí
IsEmpty, después VarType y TypeName y luego
IsNull. La idea de la serie es que un valor de VBA lleva una etiqueta de tipo aparte de
su contenido, y todas estas pruebas leen la etiqueta, no el aspecto del valor. Empty, Null, Nothing y ""
parecen todos «nada», y son cuatro etiquetas distintas.
Lo que aprenderás
- El modelo mental: Empty es una etiqueta, no un aspecto
- Tres celdas que parecen vacías y que, según IsEmpty, no lo están
- Por qué IsEmpty siempre es False para un rango o una variable String
- La celda vacía que es igual a 0 y la celda con error que provoca un fallo
- Qué prueba usar para cada significado de vacío
- Empty, Null, Nothing y la cadena vacía, frente a frente
El modelo mental: Empty es una etiqueta, no un aspecto
Un Variant lleva dos cosas: una etiqueta que indica qué clase de valor contiene, y el valor en sí. Empty es
una de esas etiquetas. Significa aquí nunca se puso ningún valor. Un Variant que declaras y no asignas es
Empty, y también lo es el .Value de una celda en la que nadie ha escrito.
IsEmpty solo lee la etiqueta. Nunca mira lo que muestra la celda, cómo está formateada ni si hay una fórmula
detrás. Por eso es precisa, y también por eso sorprende: una celda puede verse exactamente igual que una celda
vacía y llevar, aun así, una etiqueta String.
Tres celdas que parecen vacías y que, según IsEmpty, no lo están
Pon esto en A2, A3 y A4, deja A5 sin tocar y comprueba las cuatro:
| Celda | Contiene | Aspecto | IsEmpty(.Value) |
.Value = "" |
|---|---|---|---|---|
| A2 | =SI(B2="";"";B2) |
vacía | False | True |
| A3 | un espacio | vacía | False | False |
| A4 | un apóstrofo suelto ' |
vacía | False | True |
| A5 | nada | vacía | True | True |
A2 contiene una fórmula cuyo resultado es una String de longitud cero, así que la etiqueta es String, no Empty. A3 contiene una String de un carácter. A4 contiene una constante de texto de longitud cero: el apóstrofo es el carácter de prefijo de la celda, y la celda no está vacía. Solo a A5 no se le dio nunca un valor.
Este es el clásico «IsEmpty no funciona». Sí funciona; lo que estaba mal era la pregunta. Las funciones de hoja
hacen la misma distinción: ESBLANCO devuelve FALSO para A2 a A4, y CONTARA cuenta las tres.
La misma etiqueta aparece cuando buscas la última fila: End(xlUp) se detiene en una fórmula que devuelve
"", porque esa celda no está vacía. La guía de la última fila trata ese caso.
Por qué IsEmpty siempre es False para un rango o una variable String
IsEmpty solo tiene sentido para un único Variant. Dos usos habituales nunca devuelven True:
' Un rango de varias celdas: .Value es una matriz, y una matriz no es Empty
If IsEmpty(Range("A2:A100").Value) Then ' nunca True, aunque todas esten en blanco
' Una variable con tipo: una String empieza como "", un Long como 0, nunca Empty
Dim name As String
If IsEmpty(name) Then ' nunca True
En un rango, .Value devuelve una matriz bidimensional de Variants, así que la etiqueta es «matriz», nunca
Empty. En una variable String, Long o Date, la variable empieza con un valor real ("", 0, la
medianoche del 30 de diciembre de 1899), así que no hay nada que pueda ser Empty. Solo un Variant puede ser
Empty, y puedes devolverlo a ese estado con v = Empty. La guía de tipos de datos
explica por qué las variables con tipo nunca empiezan en blanco.
La celda vacía que es igual a 0 y la celda con error que provoca un fallo
Las comparaciones con Empty son generosas. VBA convierte Empty en lo que tenga al lado: 0 junto a un número,
"" junto a una String. Así que una celda vacía es igual a ambos:
' A5 esta vacia
Debug.Print Range("A5").Value = 0 ' True
Debug.Print Range("A5").Value = "" ' True
La primera línea provoca un error real en los datos. Un bucle que cuenta ventas a cero con If c.Value = 0
cuenta también cada celda en blanco como un cero, y un informe de «cuentas con saldo cero» incluye sin avisar las
cuentas que nunca se rellenaron. Comprueba primero IsEmpty cuando 0 y en blanco signifiquen cosas distintas.
La segunda trampa va en sentido contrario. Si una celda contiene un error como #N/A, su .Value es un valor
Error, y compararlo con una String falla:
' A6 contiene =VLOOKUP(...) que devolvio #N/A
If Range("A6").Value = "" Then ' Run-time error 13: Type mismatch
Ese es el error 13, Type mismatch («No coinciden los tipos» en un Excel en español). Una comprobación de celda
en blanco que falla con el primer error de búsqueda es habitual en hojas alimentadas por BUSCARV o BUSCARX.
Comprueba IsError antes de cualquier comparación. La guía de gestión de errores
trata el error 13 y sus parientes.
Qué prueba usar para cada significado de vacío
Hay tres preguntas que la gente quiere decir con «¿está vacía?». Cada una tiene su propia prueba.
1. ¿Se escribió algo alguna vez? Usa IsEmpty sobre el valor de la celda. Es la prueba correcta para
«¿esta celda de entrada sigue sin tocar?» o «buscar la siguiente fila libre».
If IsEmpty(c.Value) Then c.Value = Date
2. ¿La celda no muestra nada? Trata "", los espacios y el apóstrofo como vacíos, pero no falles nunca con
un error y no trates nunca 0 como vacío:
Function LooksBlank(ByVal c As Range) As Boolean
If IsError(c.Value) Then Exit Function ' #N/A no es vacio
LooksBlank = (Len(Trim$(CStr(c.Value))) = 0) ' "", espacios, Empty
End Function
CStr(Empty) es "", así que una celda realmente vacía también pasa, y CStr(0) es "0", así que un cero no.
3. ¿Está vacío todo el rango? No hagas un bucle ni uses IsEmpty. Pídele a Excel que cuente:
Dim rng As Range
Set rng = Range("A2:A100")
If Application.WorksheetFunction.CountA(rng) = 0 Then
Debug.Print "Nothing at all in the range, not even formulas"
End If
If Application.WorksheetFunction.CountBlank(rng) = rng.Cells.Count Then
Debug.Print "Every cell is blank or shows an empty string"
End If
CountA (CONTARA en la hoja) cuenta como valor una fórmula que devuelve ""; CountBlank (CONTAR.BLANCO)
la cuenta como vacía. Elige la que corresponda a la pregunta. En un rango que puede ser muy grande, CountA
es además muchísimo más rápido que un bucle por las celdas.
Empty, Null, Nothing y la cadena vacía
Estos cuatro se parecen en el depurador y se comprueban de forma distinta:
| Valor | Qué significa | Dónde aparece en Excel | Prueba |
|---|---|---|---|
| Empty | nunca se asignó un valor | .Value de una celda sin tocar; un Variant nuevo |
IsEmpty(v) |
"" |
una String sin caracteres | una fórmula que devuelve ""; un TextBox borrado |
Len(v) = 0 |
| Null | desconocido o mixto | Font.Bold de un rango con formatos mezclados |
IsNull(v) |
| Nothing | una variable de objeto que no apunta a ningún objeto | un Find que no encontró nada |
obj Is Nothing |
Una celda vacía nunca es Null ni Nothing, así que IsNull(Range("A5").Value) es False y Range("A5") nunca es
Nothing. La guía de IsNull explica de dónde sale realmente Null, y la
guía de Nothing trata las referencias a objetos.
La decisión de criterio: ponle nombre al vacío que quieres decir
La mayoría de los errores con celdas en blanco no son errores de IsEmpty. Vienen de código que dice «vacío»
sin decir de qué clase. La regla que los evita: escribe el significado en el nombre de la prueba. IsEmpty
para celdas de entrada sin tocar, una función LooksBlank para datos que vienen de fórmulas o de otras
personas, CountA o CountBlank para rangos completos, y una protección con IsError antes de cualquier
comparación con "" o con 0.
Cuando los datos vienen de una exportación o de un compañero, da por hecho que LooksBlank es el punto de
partida correcto: las hojas importadas están llenas de espacios y de fórmulas que devuelven "", y casi nadie
quiere decir «nunca se escribió nada» cuando dice que el campo de un cliente está vacío.
Cómo ayuda ExcelMaster
La lógica de celdas en blanco es fácil de escribir y fácil de equivocar por poco: un informe que cuenta los
vacíos como ceros, un bucle que se detiene en la primera fórmula, una comprobación que falla con #N/A.
ExcelMaster lee primero la hoja, ve qué
celdas «vacías» lo están de verdad, cuáles contienen fórmulas que devuelven "" o espacios y cuáles contienen
errores, y escribe la comprobación que corresponde a lo que tus datos contienen en realidad.
Preguntas frecuentes
¿Cómo compruebo si una celda está vacía en VBA?
Usa If IsEmpty(Range("A1").Value) Then. Es True solo si nunca se escribió nada. Si la celda puede contener
una fórmula que devuelve "" o espacios sueltos, usa Len(Trim$(CStr(c.Value))) = 0 después de una
comprobación con IsError.
¿Por qué IsEmpty devuelve False para una celda en blanco?
Porque la celda no está vacía: contiene una fórmula que devuelve una cadena vacía, un espacio o un apóstrofo
suelto. IsEmpty lee la etiqueta de tipo del valor, no lo que muestra la celda.
¿Cómo compruebo si un rango está vacío en VBA?
Usa Application.WorksheetFunction.CountA(rng) = 0. IsEmpty sobre un rango de varias celdas siempre es False,
porque el valor del rango es una matriz.
¿Qué diferencia hay entre IsEmpty y comprobar una cadena vacía en VBA?
IsEmpty es True solo para un valor que nunca se asignó. = "" es True para una celda vacía y para una cadena
vacía, y lanza un error Type mismatch («No coinciden los tipos») si la celda contiene un valor de error como
#N/A.
¿Por qué mi celda vacía cuenta como cero?
VBA convierte Empty en 0 cuando lo comparas con un número, así que If c.Value = 0 es True para una celda
vacía. Comprueba primero IsEmpty(c.Value) cuando en blanco y cero signifiquen cosas distintas.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 04/10/2026.
Guías relacionadas: VBA VarType y TypeName · VBA IsNull · VBA Nothing · VBA IsNumeric · VBA Data Types · VBA Last Row · VBA Error Handling · VBA SpecialCells
