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

VBA IsNull en Excel — qué significa realmente Null y por qué = Null nunca funciona

|

VBA IsNull en Excel — qué significa realmente Null y por qué = Null nunca funciona

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 IsNull sobre una celda en blanco siempre es False. Obtienes Null cuando lees una propiedad de un rango cuyas celdas no coinciden, como Font.Bold sobre celdas en negrita y sin negrita, NumberFormat sobre formatos de número distintos o RowHeight sobre filas de distinto alto, y cuando lees un campo de una base de datos. De ahí salen dos reglas: compruébalo solo con IsNull, porque x = Null es a su vez Null y nunca es True; y lee las propiedades de todo un rango en un Variant, porque asignar Null a un Boolean, una String o un Double se 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