TL;DR — Null es la etiqueta de «no hay una única respuesta». En Excel VBA casi nunca la obtienes de una celda: una celda vacía es Empty, así que
IsNullsobre una celda en blanco siempre es False. Obtienes Null cuando lees una propiedad de un rango cuyas celdas no coinciden, comoFont.Boldsobre celdas en negrita y sin negrita,NumberFormatsobre formatos de número distintos oRowHeightsobre filas de distinto alto, y cuando lees un campo de una base de datos. De ahí salen dos reglas: compruébalo solo conIsNull, porquex = Nulles a su vez Null y nunca es True; y lee las propiedades de todo un rango en unVariant, porque asignar Null a unBoolean, unaStringo unDoublese detiene con el error 94, Invalid use of Null («Uso no válido de Null» en un Excel en español).
Dim bold As Variant
bold = Range("A1:A10").Font.Bold
If IsNull(bold) Then Debug.Print "Some cells are bold, some are not"
Este es el tercer artículo de una serie sobre preguntarle a un valor qué es: IsEmpty
para valores que nunca se asignaron, VarType y TypeName para leer cualquier etiqueta, y
aquí IsNull para la etiqueta que significa mixto o desconocido. La idea de la serie es que un valor de VBA
lleva una etiqueta de tipo aparte de su contenido, y estas pruebas leen la etiqueta, no el aspecto del valor.
Lo que aprenderás
- El modelo mental: Null significa que no hay una única respuesta
- De dónde viene Null en Excel, y de dónde no
- Por qué = Null nunca funciona
- El error 94, Invalid use of Null
- Cómo se propaga Null por las expresiones
- Tratar un rango mixto como una tercera respuesta
- Null desde bases de datos, en la frontera
El modelo mental: Null significa que no hay una única respuesta
Empty significa nunca recibió un valor. Null significa no hay un único valor que dar. Una pregunta como
«¿está este rango en negrita?» tiene tres respuestas honestas: sí, no y «en parte». VBA no tiene un tercer
Boolean, así que responde con un Variant que contiene Null.
En cuanto ves Null como «las celdas no coinciden» o «el valor es desconocido», su comportamiento tiene sentido.
Una comparación con un valor desconocido da un resultado desconocido. Una suma que incluye un desconocido es
desconocida. Y una variable Boolean, que solo admite True o False, no tiene dónde guardar «en parte».
De dónde viene Null en Excel, y de dónde no
No de las celdas. El valor de una celda vacía es Empty, una celda con "" es una String, una celda con error
es un Error. IsNull(Range("A1").Value) es False para todas ellas, y por eso IsNull usado como prueba de celda
en blanco nunca salta. Para eso, usa IsEmpty.
De las propiedades de rango sobre celdas que no coinciden. Muchas propiedades de Range devuelven Null
cuando las celdas del rango no comparten un mismo valor:
| Propiedad sobre un rango de varias celdas | Devuelve Null cuando |
|---|---|
Font.Bold, Font.Italic |
unas celdas están en negrita o cursiva y otras no |
Font.Name, Font.Size, Font.Color |
las celdas usan fuentes, tamaños o colores distintos |
NumberFormat |
las celdas tienen formatos de número distintos |
HorizontalAlignment, WrapText |
las celdas tienen alineación o ajuste de texto distintos |
RowHeight, ColumnWidth |
las filas o columnas tienen tamaños distintos |
HasFormula |
unas celdas contienen fórmulas y otras constantes |
MergeCells, Locked |
unas celdas están combinadas o bloqueadas y otras no |
Selection.Font.Bold sobre una selección que está en parte en Negrita es el ejemplo de todos los días: no hay
True ni False que la describa, así que la respuesta es Null.
De fuera de Excel. Un campo leído de una base de datos mediante ADO es Null cuando la columna de la base de datos contiene NULL.
Por qué = Null nunca funciona
El primer instinto es comparar:
v = Range("A1:A10").Font.Bold
If v = Null Then Debug.Print "mixed" ' nunca imprime nada
If v <> Null Then Debug.Print "not mixed" ' tampoco imprime nada
Cualquier comparación con Null es a su vez Null, porque comparar con un desconocido da un desconocido. If trata
una condición Null como no True, así que las dos ramas anteriores se saltan, contenga lo que contenga v. No
hay error de compilación ni error en tiempo de ejecución; la comprobación está muerta sin que nadie lo note.
IsNull(v) es la única prueba que funciona.
El error 94, Invalid use of Null
El segundo instinto es declarar el tipo que esperas:
Dim isBold As Boolean
isBold = Range("A1:A10").Font.Bold ' Run-time error 94: Invalid use of Null
Esto funciona en todas las hojas de prueba en las que el rango está entero en negrita o entero sin ella, y falla
la primera vez que un usuario pone en negrita una sola celda. Lo mismo ocurre con
Dim fmt As String: fmt = rng.NumberFormat sobre formatos mezclados, con
Dim h As Double: h = Rows("1:5").RowHeight sobre filas de distinto alto, y con CStr(Null) o CLng(Null).
Solo un Variant puede contener Null.
El arreglo es siempre el mismo: lee las propiedades de todo un rango en un Variant, comprueba IsNull y después convierte.
Dim fmt As Variant
fmt = rng.NumberFormat
If IsNull(fmt) Then
Debug.Print "Mixed formats in " & rng.Address
Else
Debug.Print "All cells use " & fmt
End If
Cómo se propaga Null por las expresiones
Null se propaga por la aritmética y por la mayoría de las funciones, pero no por el operador &:
Dim n As Variant
n = Null
Debug.Print n + 1 ' Null
Debug.Print Len(n) ' Null
Debug.Print "Total: " + n ' Null (+ propaga)
Debug.Print "Total: " & n ' Total: (& trata Null como "")
Así que un Null que entra en un cálculo viaja hasta el final y solo falla cuando llega a una variable con tipo o a una función que necesita un valor real. El error 94 que ves puede estar varias líneas después del punto por el que entró Null. Cuando te encuentres con el error 94, busca la primera propiedad o el primer campo que se lee en esa expresión, no la línea que falló.
Tratar un rango mixto como una tercera respuesta
Mixto no es un error; es información. Decide qué debe hacer tu macro con ello. Una regla habitual, la que usa
Word en su botón Negrita, es que una selección mixta pasa a estar entera en negrita. Un conmutador escrito solo
con Not no puede tomar esa decisión, porque Not Null es Null:
Sub ToggleBold()
Dim rng As Range, state As Variant
If TypeName(Selection) <> "Range" Then Exit Sub
Set rng = Selection
state = rng.Font.Bold
If IsNull(state) Then
rng.Font.Bold = True ' mixto: todo en negrita
Else
rng.Font.Bold = Not state
End If
End Sub
El mismo patrón sirve para cualquier propiedad de la tabla anterior: lee en un Variant, dale al caso mixto su
propia rama y luego actúa. Para el ancho de columna y el Alto de fila, la rama mixta suele ser «ponerlos todos al
mismo valor»; para NumberFormat (el Formato de número), suele ser «informar de qué celdas difieren» antes de
sobrescribir nada.
Null desde bases de datos, en la frontera
Cuando lees registros con ADO, cualquier columna NULL llega como Null y falla en cuanto la metes en una variable
con tipo o la sumas a un total. Conviértela una sola vez, donde entra en tu código. Excel VBA no tiene función
Nz (eso es de Access), así que escribe una pequeña:
Function NzV(ByVal v As Variant, Optional ByVal ifNull As Variant = "") As Variant
If IsNull(v) Then NzV = ifNull Else NzV = v
End Function
total = total + NzV(rs!Amount, 0)
customer = NzV(rs!CustomerName, "")
Volcar un recordset entero en la hoja con Range.CopyFromRecordset no necesita conversión: los campos Null se
convierten en celdas vacías.
La decisión de criterio: Null es una tercera respuesta, no un error
La mayoría de los errores con Null son declaraciones de tipo que no dejaron sitio para «en parte». La regla que
los evita: cualquier propiedad leída de un rango de varias celdas va a un Variant, y el caso mixto tiene su
propia rama. No compares nunca con = Null; no pases nunca una propiedad de todo un rango directamente a un
Boolean, una String o un Double.
Y no recurras a IsNull para comprobar celdas. Una celda en blanco es Empty, una entrada borrada es "", una
búsqueda fallida es un Error. Si tu código comprueba celdas con IsNull, la prueba que buscas es IsEmpty,
Len o IsError.
Cómo ayuda ExcelMaster
El código que lee formatos suele romperse con libros reales, donde un rango nunca es del todo uniforme: una celda en negrita, un encabezado combinado, una fila un poco más alta que las demás.
ExcelMaster examina el formato del rango real antes de escribir el código, ve dónde no coinciden las celdas y trata el caso mixto de forma explícita en lugar de dejárselo al error 94.
Preguntas frecuentes
¿Qué hace IsNull en VBA?
IsNull(v) devuelve True si v es un Variant que contiene Null, el valor que significa «no hay una única
respuesta» o «desconocido». En Excel lo encuentras sobre todo en propiedades de rango sobre celdas que no
coinciden, y en campos de bases de datos.
¿Por qué IsNull devuelve False para una celda vacía?
Porque una celda vacía es Empty, no Null. Usa IsEmpty(Range("A1").Value) para comprobar una celda que nunca se
rellenó.
¿Qué provoca el error en tiempo de ejecución 94 Invalid use of Null?
Asignar Null a una variable que no puede contenerlo, como un Boolean, una String, un Long o un Double, o pasar
Null a una función como CStr. En un Excel en español el mensaje es «Uso no válido de Null». Lee el valor en un
Variant y comprueba primero IsNull.
¿Por qué If x = Null nunca funciona en VBA?
Cualquier comparación con Null devuelve Null, y If trata Null como no True. Tanto x = Null como x <> Null
se saltan. Usa IsNull(x).
¿Cómo compruebo si un rango tiene formato mixto en VBA?
Lee la propiedad en un Variant y compruébala: If IsNull(rng.Font.Bold) Then. Propiedades como Font.Bold,
NumberFormat, RowHeight y HorizontalAlignment devuelven Null cuando las celdas difieren.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 04/10/2026.
Guías relacionadas: VBA IsEmpty · VBA VarType y TypeName · VBA Nothing · VBA Font · VBA Number Format · VBA Column Width · VBA Data Types · VBA Error Handling
