¿Tu matriz desbordada en Excel “arrastra” elementos vacíos que en realidad son espacios invisibles? Aquí tienes un conjunto probado de fórmulas con FILTER, TRIM, SUBSTITUTE y TEXTSPLIT para limpiar y filtrar correctamente, incluido el temido NBSP (CHAR(160)
).
Entiende primero el problema: “vacío” no siempre es vacío
En matrices dinámicas (también llamadas “matrices desbordadas” o spilled arrays), es frecuente que ciertas entradas parezcan vacías, pero en realidad contengan uno o más caracteres invisibles. Los más comunes son:
- Espacio normal
(CHAR(32))
. - Espacio de no separación, NBSP
(CHAR(160))
, típico de copias desde páginas web. - Otros no imprimibles (tabulaciones, retornos, etc.) que
CLEAN
(LIMPIAR) puede eliminar.
Si aplicas un filtro ingenuo como <>""
, solo excluyes celdas 100% vacías. Si la celda contiene un espacio o NBSP, Excel la considera “no vacía” y permanece en el resultado.
Solución rápida
- Rango con celdas realmente vacías: usa
FILTER
con<>""
. - Rango con “vacíos” que son espacios u otros invisibles: limpia primero (con
TRIM
/SUBSTITUTE
/CLEAN
) y filtra por longitud > 0. - Si vas a dividir texto: elimina espacios antes de dividir, o usa
TEXTSPLIT
conignore_empty
.
Caso A — Celdas realmente vacías
Si el rango contiene celdas vacías genuinas, bastará con:
=FILTER(G5:G17, G5:G17<>"")
Este patrón es directo y eficiente: filtra todo lo que no sea exactamente vacío. Úsalo cuando tengas certeza de que no hay caracteres invisibles.
Caso B — Los “vacíos” son espacios u otros invisibles
Filtrar sin alterar los valores (enfoque robusto)
Queremos excluir elementos que solo contienen espacios (incluido NBSP), pero devolver los valores originales tal como están cuando no son “vacíos”.
=LET(t, G5:G17,
u, TRIM(SUBSTITUTE(t,CHAR(160)," ")),
FILTER(t, LEN(u)>0))
Cómo funciona: u
es la versión “limpia” de cada elemento de t
. SUBSTITUTE(...,CHAR(160)," ")
convierte NBSP a espacio normal y TRIM
elimina espacios al inicio/fin (y comprime dobles espacios internos a uno). Si un elemento era solo espacios, TRIM
lo deja en ""
, y LEN(u)>0
lo excluirá. El spill final devuelve los valores originales de t
, sin tocar su texto.
Limpiar aún más (tabulaciones, retornos, etc.)
Para una limpieza más agresiva, añade CLEAN
(LIMPIAR) al flujo:
=LET(t, G5:G17,
u, TRIM(CLEAN(SUBSTITUTE(t,CHAR(160)," "))),
FILTER(t, LEN(u)>0))
CLEAN
elimina caracteres no imprimibles (0–31). NBSP (160) no está en ese rango; por eso se mantiene la sustitución explícita CHAR(160)
→" "
.
Si estás dividiendo una cadena en caracteres
Cuando quieras dividir en caracteres y evitar que los espacios se conviertan en elementos del arreglo:
=LET(s, SUBSTITUTE(F3," ",""),
MID(s, SEQUENCE(LEN(s)), 1))
Variante más robusta, también quita NBSP:
=LET(s, SUBSTITUTE(SUBSTITUTE(F3,CHAR(160),"")," ",""),
MID(s, SEQUENCE(LEN(s)), 1))
Si tu arreglo viene de TEXTSPLIT y hay delimitadores consecutivos
Cuando dos o más delimitadores seguidos producen “huecos” en el resultado, indícale a TEXTSPLIT
que ignore los vacíos:
=TEXTSPLIT(F3, " ",, TRUE) // TRUE = ignore_empty
Cuándo usar cada enfoque
Escenario | Señales | Fórmula recomendada |
---|---|---|
Vacíos genuinos | Celdas vacías reales (sin caracteres) | =FILTER(G5:G17, G5:G17<>"") |
Espacios/NBSP sueltos | Visualmente vacío, pero LEN >0 | =LET(t, G5:G17, u, TRIM(SUBSTITUTE(t,CHAR(160)," ")), FILTER(t, LEN(u)>0)) |
Texto con varios no imprimibles | Datos pegados desde web/CSV | =LET(t, G5:G17, u, TRIM(CLEAN(SUBSTITUTE(t,CHAR(160)," "))), FILTER(t, LEN(u)>0)) |
Dividir en caracteres | No quieres que espacios sean elementos | =LET(s,SUBSTITUTE(F3," ",""), MID(s, SEQUENCE(LEN(s)), 1)) |
Delimitadores repetidos | Varias separaciones seguidas | =TEXTSPLIT(F3, " ",, TRUE) |
Diagnóstico rápido
Antes de limpiar, conviene confirmar qué está dentro de esas celdas:
- ¿Es NBSP? Comprueba el código del primer carácter:
=CODE(INDICE(t,1)) // 32 = espacio, 160 = NBSP
También puedes usarUNICODE(LEFT(t,1))
en libros modernos. - ¿Realmente está “vacío”? Compara la longitud antes y después de recortar:
=HSTACK(LEN(t), LEN(TRIM(SUBSTITUTE(t,CHAR(160)," "))))
Si la segunda columna cae a 0, solo había espacios.
Ejemplos prácticos
Rango vertical con entradas “vacías” por espacios
Supón que G5:G17
contiene valores como “” (NBSP), “” (espacios) y textos reales. El objetivo es devolver una matriz desbordada sin dichos huecos aparentes, manteniendo orden y valores originales.
=LET(t, G5:G17,
u, TRIM(SUBSTITUTE(t,CHAR(160)," ")),
FILTER(t, LEN(u)>0))
Obtendrás un listado limpio y estable: si G5:G17
cambia, el resultado se actualiza automáticamente.
Rango bidimensional (varias columnas)
Si tu matriz tiene varias columnas y quieres eliminar filas completas donde todas las celdas son “vacías” (solo espacio/NBSP), usa BYROW
para evaluar cada fila:
=LET(t, A2:D50,
u, TRIM(SUBSTITUTE(t,CHAR(160)," ")),
filtroFilas, BYROW(u, LAMBDA(r, SUM(LEN(r))>0)),
FILTER(t, filtroFilas))
Aquí, SUM(LEN(r))
suma las longitudes “limpias” de la fila. Si es 0, esa fila estaba vacía “de facto”.
Dividir sin vacíos al trabajar por caracteres
Si divides una cadena en unidades de un carácter y quieres ignorar espacios y NBSP:
=LET(s, SUBSTITUTE(SUBSTITUTE(F3,CHAR(160),"")," ",""),
MID(s, SEQUENCE(LEN(s)), 1))
TEXTSPLIT con delimitadores múltiples y vacíos intermedios
Para dividir por coma y punto y coma, ignorando elementos vacíos, y devolviendo por columnas:
=TEXTSPLIT(F3, {",";";"},, TRUE)
El cuarto argumento (TRUE
) indica ignore_empty. Así evitas que ,,
o ;;
generen elementos vacíos en el arreglo.
Buenas prácticas de rendimiento
- Encapsula con LET: Evita recalcular fragmentos costosos y haz la fórmula más legible (como en los ejemplos). Menos recalculo = mejor rendimiento en rangos grandes.
- Evita volátiles innecesarios: Las fórmulas aquí no usan funciones volátiles. Mantén esa ventaja.
- Aplica limpieza sobre el rango mínimo: Si solo necesitas una columna, no limpies todo el bloque; reduce el coste.
Errores frecuentes y cómo evitarlos
- Confiar solo en
<>""
: No elimina “vacíos” que tienen espacios. Valida conLEN
tras limpiar. - Olvidar NBSP: Es el culpable habitual al pegar desde web. Sin
SUBSTITUTE(...,CHAR(160)," ")
, muchos “vacíos” persisten. - Usar
TRIM
esperando eliminar todo:TRIM
no quita NBSP por sí solo y comprime espacios internos a uno. Si necesitas preservar espacios internos, limpia solo borde y NBSP. - Confundir “ver vacío” con “ser vacío”: Excel ve cualquier carácter como contenido. Usa diagnóstico con
LEN
/CODE
.
Plantilla LAMBDA reutilizable
Si repites este patrón a menudo, crea una función con nombre para filtrar elementos “vacíos visuales” sin modificar los originales:
=LAMBDA(rng,
LET(u, TRIM(SUBSTITUTE(rng,CHAR(160)," ")),
FILTER(rng, LEN(u)>0)))
Guárdala como FILTRARNOVACIOS_VISUALES y úsala así:
=FILTRARNOVACIOS_VISUALES(G5:G17)
Tabla de caracteres invisibles comunes
Carácter | Código | Nombre | Cómo tratarlo |
---|---|---|---|
Espacio | 32 | Space | TRIM lo quita al inicio/fin; se puede reemplazar con SUBSTITUTE(," ","") si procede. |
NBSP | 160 | No‑breaking space | SUBSTITUTE(,CHAR(160)," ") y luego TRIM . |
Tab | 9 | Tabulación | CLEAN lo elimina; también SUBSTITUTE(,CHAR(9)," ") si deseas convertirlo en espacio. |
CR / LF | 13 / 10 | Retorno / salto de línea | CLEAN o SUBSTITUTE(,CHAR(10)," ") según el caso. |
Compatibilidad y localización
- Versiones: Las matrices dinámicas (y funciones como
FILTER
,LET
,SEQUENCE
,TEXTSPLIT
) requieren Microsoft 365 o Excel 2021+. - Separador de argumentos: Algunas configuraciones regionales usan
;
en lugar de,
. Adapta las fórmulas si tu Excel lo requiere. - Nombres de funciones: Si tu Excel está localizado, estas son las equivalencias más habituales: Inglés Español FILTERFILTRAR TRIMESPACIOS SUBSTITUTESUSTITUIR CLEANLIMPIAR LENLARGO INDEXINDICE SEQUENCESECUENCIA MIDEXTRAE TEXTSPLITDIVIDIRTEXTO TEXTJOINUNIRCADENAS UNICODEUNICODE CODECODIGO LETLET
Comparativa de enfoques
Si lo único que quieres es “esconder” entradas vacías aparentes, el enfoque con LET
+ TRIM
+ SUBSTITUTE
+ FILTER
es el más equilibrado: rápido, legible y no altera el dato original. Si además pretendes normalizar el contenido (p. ej., suprimir tabs o saltos), añade CLEAN
. Cuando trabajas con listas generadas por TEXTSPLIT
o con delimitadores variables, la opción con ignore_empty evita crear los vacíos en primer lugar.
Patrones listos para copiar
Filtrar “vacíos” (NBSP incluido) sin tocar los valores
=LET(t, G5:G17,
u, TRIM(SUBSTITUTE(t,CHAR(160)," ")),
FILTER(t, LEN(u)>0))
Limpiar agresivo (NBSP + no imprimibles) y filtrar
=LET(t, G5:G17,
u, TRIM(CLEAN(SUBSTITUTE(t,CHAR(160)," "))),
FILTER(t, LEN(u)>0))
Dividir en caracteres sin introducir espacios
=LET(s, SUBSTITUTE(SUBSTITUTE(F3,CHAR(160),"")," ",""),
MID(s, SEQUENCE(LEN(s)), 1))
TEXTSPLIT ignorando vacíos por delimitadores repetidos
=TEXTSPLIT(F3, " ",, TRUE)
Consejos de depuración en el día a día
- Pinta longitudes: Añade a la derecha una columna con
=LEN(celda)
. Si sale >0, no es vacío. - Localiza el carácter problemático:
=CODE(LEFT(celda,1))
o=UNICODE(LEFT(celda,1))
te dicen si es 32, 160, 9, etc. - Normaliza antes de importar: Si el origen es web/CSV, considera pasar primero por Power Query para estandarizar espacios y codificaciones.
- Evita concatenaciones que “reviven” vacíos: Si luego unes texto, hazlo con
TEXTJOIN
/UNIRCADENAS
usando el argumento ignore_empty cuando sea posible.
Preguntas frecuentes
¿Por qué TRIM
deja un espacio interno? Por diseño, TRIM
elimina espacios de borde y convierte múltiples espacios internos en un solo espacio. Si necesitas suprimir todos los espacios, aplica SUBSTITUTE(," ","")
explícitamente (ten presente el impacto semántico).
¿Por qué <>""
no funciona con mis “vacíos”? Porque la celda contiene al menos un carácter (como NBSP), así que para Excel no está vacía. Debes limpiar y luego filtrar por longitud.
¿Puedo devolver el valor “limpio” en vez del original? Sí. Sustituye FILTER(t, ...)
por FILTER(u, ...)
en las fórmulas con u
como versión limpia, según lo que prefieras mostrar.
Resumen práctico
- Si son vacíos reales,
FILTER(rng, rng<>"")
. - Si hay espacios/NBSP, limpia con
TRIM(SUBSTITUTE(,CHAR(160)," "))
y filtra porLEN>0
. - Si vas a dividir, elimina espacios antes o usa
TEXTSPLIT(..., ignore_empty=TRUE)
. - Valida con
LEN
yCODE/UNICODE
para saber qué carácter tienes delante.
Fórmulas completas citadas
Caso A — Celdas realmente vacías
=FILTER(G5:G17, G5:G17<>"")
Caso B — Los “vacíos” son espacios u otros invisibles (por eso <>""
no sirve)
- Filtrar sin alterar los valores (robusto):
=LET(t, G5:G17, u, TRIM(SUBSTITUTE(t,CHAR(160)," ")), FILTER(t, LEN(u)>0))
u
limpia cada elemento; si un elemento es solo espacios,TRIM(...)
lo deja como""
y se excluye conLEN(u)>0
. - Si estás dividiendo una cadena en caracteres, quita espacios antes de dividir:
=LET(s, SUBSTITUTE(F3," ",""), MID(s, SEQUENCE(LEN(s)), 1))
Variante más robusta (también quita NBSP):=LET(s, SUBSTITUTE(SUBSTITUTE(F3,CHAR(160),"")," ",""), MID(s, SEQUENCE(LEN(s)), 1))
- Si tu arreglo viene de
TEXTSPLIT
y hay delimitadores consecutivos:=TEXTSPLIT(F3, " ",, TRUE) // TRUE = ignore_empty
Notas útiles finales
TRIM
quita espacios al inicio/fin y comprime dobles espacios internos a uno. Si necesitas aún más limpieza (tabulaciones/saltos), puedes envolver conCLEAN
:=LET(t, G5:G17, u, TRIM(CLEAN(SUBSTITUTE(t,CHAR(160)," "))), FILTER(t, LEN(u)>0))
- Diagnóstico rápido: si sospechas que no son vacíos, comprueba el código del primer carácter:
=CODE(INDICE(t,1)) // 32 = espacio normal, 160 = NBSP
- Las fórmulas con matrices dinámicas requieren Microsoft 365 / Excel 2021+.