Antes del motor de arrays dinámicos de Microsoft 365, disponible de forma general desde enero de 2020, las fórmulas de Excel devolvían exactamente un valor por celda. VLOOKUP te daba un resultado. SUMIFS te devolvía un número. Cada fórmula estaba contenida en su propia celda.
Los arrays dinámicos rompieron ese contrato. FILTER puede devolver 500 filas. UNIQUE retorna un número impredecible de valores distintos. SEQUENCE genera una cuadrícula. Excel necesita un bloque contiguo de celdas vacías (el "rango de desbordamiento" o spill range) para depositar esos resultados. Cuando no puede hacerlo, obtienes #SPILL!.
Según Microsoft Support en "Dynamic array formulas and spilled array behavior" (support.microsoft.com/en-us/office/dynamic-array-formulas-and-spilled-array-behavior-205c6b06-03ba-4151-89a1-87a7eb36e531): "un spill range es el rango de celdas que una fórmula de array dinámico llena con resultados". Si alguna celda de ese rango contiene cualquier cosa (un valor, una fórmula, un espacio o un borde de celda combinada), la fórmula lanza #SPILL!.
Las 5 causas del error #SPILL! en Excel
| Causa | Texto en el menú de error | Solución |
|---|---|---|
| Datos o fórmula en el rango de desbordamiento | "El rango de desbordamiento no está en blanco" | Identificar la celda bloqueante con el borde azul punteado y limpiarla |
| Celdas combinadas en el rango de salida | "El rango de desbordamiento tiene celdas combinadas" | Descombinar todas las celdas del rango de salida |
| Fórmula dentro de una tabla de Excel (ListObject) | "El rango de desbordamiento está en una tabla" | Convertir la tabla en rango (Diseño de tabla → Convertir en rango) |
| Rango de desbordamiento demasiado grande | "El rango de desbordamiento es demasiado grande" | Acotar los argumentos para limitar el número de resultados |
| Conflicto con fórmulas volátiles | "Desbordamiento por dependencias volátiles" | Forzar recálculo completo con Ctrl+Alt+F9 |
Causa 1: Datos o fórmula en el rango de desbordamiento
La más común. Colocas una fórmula FILTER en D2, pero D15 tiene un número fijo del cierre del trimestre anterior. Excel no lo sobreescribirá. Esto incluye el caso del contenido invisible descrito al inicio: una fórmula que devuelve "" en D15 produce exactamente el mismo error que si tuviera un número visible.
Solución: selecciona la celda con la fórmula, observa el borde azul punteado que indica el rango de desbordamiento previsto, ubica la celda ocupada y límpiala.
Causa 2: Celdas combinadas en el rango de desbordamiento
Las plantillas de modelos financieros suelen tener celdas combinadas para encabezados de sección. Una fórmula SEQUENCE que genera una columna de 12 meses se detendrá completamente si alguna fila de esa columna tiene celdas combinadas.
Solución: descombinar. No hay alternativa. Las celdas combinadas y los arrays dinámicos son estructuralmente incompatibles en Excel.
Causa 3: La fórmula está dentro de una tabla de Excel (ListObject)
Las tablas de Excel no permiten que las fórmulas se desborden fuera de sus límites. Una fórmula UNIQUE en la columna H de una tabla que devolvería 15 valores, pero donde la tabla solo tiene 8 filas, lanza #SPILL!.
Solución: convierte la tabla a rango normal (Diseño de tabla → Convertir en rango) antes de usar fórmulas de desbordamiento, o mueve la fórmula a una celda fuera de la tabla. En Google Sheets esta restricción no existe.
Causa 4: El rango de desbordamiento es demasiado grande
=SEQUENCE(1,048,576) intenta llenar una columna entera. Excel lo rechaza. También obtendrás este error si una fórmula intenta desbordarse más allá de la columna XFD o de la fila 1,048,576.
Solución: acota la fórmula. Para una serie de fechas en un modelo a 5 años, usa SEQUENCE(60) en lugar de SEQUENCE(ROWS(A:A)).
Causa 5: Conflicto con fórmulas volátiles
RAND() o TODAY() dentro de una fórmula de array dinámico pueden ocasionalmente causar un conflicto de desbordamiento al recalcular. Microsoft documenta este comportamiento en "SPILL errors in Excel" (support.microsoft.com/en-us/office/spill-errors-in-excel-ffe0f555-b479-4a17-a6e6-d7c2b88c1b2d) como "desbordamiento en celdas no vacías por dependencias volátiles". Generalmente es transitorio.
Solución: presiona Ctrl+Alt+F9 para forzar un recálculo completo. Si persiste, la volatilidad está interactuando con algún elemento estructural del modelo.
Cómo diagnosticar #SPILL! rápidamente en Excel
Selecciona la celda con #SPILL!. Verás dos cosas: un borde azul punteado que muestra dónde quiere desbordarse la fórmula, y un menú desplegable con la sub-razón específica ("El rango de desbordamiento no está en blanco", "El rango de desbordamiento tiene celdas combinadas", etc.). Esa sub-razón corresponde directamente a una de las cinco causas de la tabla anterior.
Cuando la celda bloqueante está fuera de pantalla, el borde azul punteado te da el rango completo. Puedes navegar hasta el extremo inferior con Ctrl+G, escribir la dirección de la última celda del rango y usar Ctrl+F dentro de esa selección para identificar celdas con contenido.
Escenarios de FP&A donde el error de desbordamiento golpea fuerte
Extraer líneas de variación con FILTER
=FILTER('P&L'!B4:N50,'P&L'!B4:B50=Supuestos!$B$3,"Sin coincidencia")
Esta fórmula va en tu pestaña de análisis de variaciones y se desborda hacia abajo con todas las filas que coincidan con el centro de costos seleccionado. Si alguien pegó cifras reales 30 filas debajo de la fórmula mientras trabajabas en la pestaña de supuestos, el error aparece en el momento en que la hoja recalcule.
La misma fórmula funciona en Excel y en Sheets con la misma sintaxis. La diferencia operativa: en Excel verás #SPILL! sin saber qué celda exacta causó el problema hasta que leas el borde punteado. En Sheets, el tooltip te da la celda directamente.
Solución práctica: reserva columnas exclusivas para la salida de fórmulas de desbordamiento, sin nada debajo. Columna D para la salida de FILTER, columna E para cálculos auxiliares, nunca mezcladas. Documenta esta convención en una pestaña de "Estructura del Modelo" para que el equipo no pegue datos en esas columnas durante actualizaciones manuales.
XLOOKUP con retorno de múltiples columnas
=XLOOKUP(B3,'Tabla Deuda'!$A$4:$A$40,'Tabla Deuda'!$D$4:$N$40,"No encontrado",0,1)
Un XLOOKUP que devuelve una fila completa de amortización se desborda en 11 columnas. Si alguna celda a la derecha tiene contenido (un comentario obsoleto, un apóstrofe suelto, una fórmula que devuelve "") el error elimina toda la búsqueda. Una celda con solo un espacio es suficiente para tumbar el modelo completo.
UNIQUE para centros de costos distintos en un modelo de presupuesto
=UNIQUE(FILTER('Exportación GL'!C:C,'Exportación GL'!A:A=Supuestos!$B$1))
Esta fórmula construye una lista dinámica de centros de costos que se actualiza cada vez que se refresca la exportación del libro mayor. Si la plantilla tiene texto de "marcador de posición" unas filas más abajo, el error aparece cada vez que alguien pega datos frescos del GL.
En Sheets, esta misma fórmula acepta la columna completa C:C sin necesidad de definir el rango hasta una fila fija. Cuando la exportación crece de 800 a 1,500 filas entre un cierre mensual y el siguiente, la fórmula en Sheets se adapta sin intervención.
Solución: coloca la fórmula UNIQUE en una sección dedicada y documéntala. Usa el operador # para que otras pestañas referencien su salida sin necesidad de saber cuántas filas tiene la lista en cada momento.
Referencias estables entre pestañas con el operador
El operador # resuelve uno de los problemas más frecuentes en modelos con múltiples pestañas: las referencias a rangos de tamaño variable.
=SUMIFS('Análisis Retornos'!E2#,'Análisis Retornos'!D2#,">="&Supuestos!$B$5)
Si E2 en la pestaña "Análisis Retornos" contiene una fórmula FILTER que devuelve 20 filas hoy y 35 la próxima semana cuando cambien los datos del GL, E2# referencia siempre la salida completa, sin que tengas que ajustar ningún rango fijo. Reemplaza los OFFSET con conteos COUNTA que son difíciles de auditar en revisiones con el equipo o con inversionistas.
Estabilidad en modelos con muchas pestañas
El riesgo del operador # en un modelo de 8 a 12 pestañas es que una referencia E2# en la pestaña de Resumen apunta a la salida de una fórmula en la pestaña de Retornos. Si alguien mueve esa fórmula de E2 a F2 durante una reorganización, la referencia # no se actualiza automáticamente porque depende de la dirección de celda, no del nombre del rango.
La solución es combinar # con rangos con nombre. Define un nombre como ListaCentrosCosto que apunte a la celda de inicio de la fórmula UNIQUE (=Exportación!$C$2), y referencia el desbordamiento como ListaCentrosCosto# desde otras pestañas. Si reorganizas la pestaña y mueves la fórmula, solo actualizas la definición del rango con nombre en un lugar, y todas las referencias dependientes se ajustan.
A junio de 2026, el operador # funciona en Excel para Microsoft 365 (suscripción) y Excel 2021 en adelante. No funciona en Excel 2019 ni versiones anteriores, que no admiten arrays dinámicos. En Google Sheets está disponible desde 2022.
El operador @ cuando no quieres desbordamiento en Excel
Si el error #SPILL! aparece porque la fórmula devuelve un array pero tú necesitas solo el primer resultado, usa el prefijo @:
=@XLOOKUP(B3,'Tabla Deuda'!$A$4:$A$40,'Tabla Deuda'!$D$4:$D$40,"No encontrado")
El @ fuerza la intersección implícita: el mismo comportamiento que tenía Excel antes de 2020. Un resultado por celda, sin desbordamiento. Es lo que necesitas cuando construyes una columna auxiliar donde cada fila busca su propio valor.
En Google Sheets no existe el operador @ con esta función. Para obtener un solo resultado de una función que normalmente devuelve un array, usa INDEX(FILTER(...),1) o agrega una condición más restrictiva directamente en la fórmula.
Cómo localizar la celda bloqueante más rápido
Un error #SPILL! enterrado en un modelo de 12 pestañas puede tomar tiempo considerable si la celda bloqueante está 40 filas más abajo de la fórmula y no es visible en pantalla.
En Excel, el flujo más rápido es: leer la sub-razón del menú de error, seleccionar el rango completo del borde punteado, y usar Ctrl+F dentro de esa selección para identificar celdas con contenido. En Sheets, las fórmulas auxiliares con FILTER sobre la columna (descritas en la sección de diagnóstico anterior) dan el inventario completo de bloqueos en un solo paso, sin tener que iterar celda por celda.
Si trabajas con modelos donde los errores de desbordamiento reaparecen después de cada actualización de datos, ModelMonkey identifica la celda bloqueante en Google Sheets directamente desde la interfaz, sin necesidad de construir fórmulas auxiliares temporales.
Preguntas frecuentes sobre el error #SPILL! en Excel y Google Sheets
¿Por qué aparece #SPILL! cuando uso una tabla de Excel?
Las tablas de Excel (ListObjects) no permiten que las fórmulas de array dinámico se desborden fuera de sus límites. Si la fórmula devuelve más filas de las que tiene la tabla, o intenta desbordarse en columnas externas, Excel muestra #SPILL!. La solución es convertir la tabla en rango normal (Diseño de tabla → Convertir en rango) antes de usar fórmulas de desbordamiento, o mover la fórmula a una celda fuera de la tabla. En Google Sheets esta restricción no existe.
¿Cómo elimino #SPILL! causado por celdas combinadas en Excel?
Descombina las celdas del rango de desbordamiento. Haz clic en la celda con #SPILL!, observa el borde azul punteado que delimita el rango afectado, selecciona ese rango y ve a Inicio → Combinar y centrar → Deshacer combinación de celdas. No existe forma de mantener las celdas combinadas y que el array dinámico funcione al mismo tiempo: son estructuralmente incompatibles. En Sheets esta restricción no aplica de la misma manera.
¿Qué hace el operador # en Excel y Google Sheets?
El operador # (operador de referencia de desbordamiento) le indica a una fórmula que use todo el rango de salida de una fórmula de array dinámico, independientemente de cuántas filas o columnas ocupe en ese momento. Si D2 contiene una fórmula FILTER que devuelve 20 filas, D2# referencia las 20 filas automáticamente. Si los datos cambian y la fórmula pasa a devolver 35 filas, D2# se actualiza solo, sin que tengas que ajustar ningún rango fijo. Funciona en Excel (Microsoft 365 / Excel 2021 en adelante) y en Google Sheets (desde 2022).
¿Cómo se llama el error equivalente a #SPILL! en Google Sheets?
En Google Sheets no existe el código #SPILL!. Cuando una función de array no puede expandirse porque hay datos en el camino, Sheets muestra un tooltip descriptivo que indica exactamente qué celda está bloqueando la expansión: "Array result was not expanded because it would overwrite data in [celda]". El diagnóstico es más directo porque la herramienta identifica la celda problemática sin que tengas que inspeccionar manualmente ningún borde punteado.
¿Qué hago si la celda bloqueante en Sheets parece estar vacía?
La celda contiene contenido invisible: un espacio, un carácter especial pegado de un sistema externo, o una fórmula que devuelve "". Para confirmarlo, selecciona la celda señalada en el tooltip y revisa la barra de fórmulas. Si muestra algo que no es visible en la celda, ese es el origen del bloqueo. Para encontrar todos los bloqueos de la columna en un solo paso, usa en una columna temporal:
=FILTER(ROW(C2:C3000),LEN(C2:C3000)>0)
Esto lista los números de fila de todas las celdas que tienen cualquier contenido, incluyendo espacios simples. Para detectar además celdas con fórmulas que devuelven cadena vacía, complementa con:
=FILTER(ROW(C2:C3000),ISFORMULA(C2:C3000))
¿El operador # funciona en versiones antiguas de Excel?
No. El operador # requiere el motor de arrays dinámicos, disponible en Excel para Microsoft 365 (suscripción) y Excel 2021 en adelante. En Excel 2019 y versiones anteriores, los arrays dinámicos y el operador # no están disponibles. Las funciones FILTER, UNIQUE y SEQUENCE tampoco funcionan en esas versiones.