Excel: eliminar “vacíos” en matrices desbordadas (spilled array) con FILTER, TRIM y TEXTSPLIT

¿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)).

Índice

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 con ignore_empty.

Caso A — Celdas realmente vacías

Si el rango contiene celdas vacías genuinas, bastará con:

=FILTER(G5:G17, G5:G17&lt;&gt;"")

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)&gt;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)&gt;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

EscenarioSeñalesFórmula recomendada
Vacíos genuinosCeldas vacías reales (sin caracteres)=FILTER(G5:G17, G5:G17<>"")
Espacios/NBSP sueltosVisualmente vacío, pero LEN>0=LET(t, G5:G17, u, TRIM(SUBSTITUTE(t,CHAR(160)," ")), FILTER(t, LEN(u)>0))
Texto con varios no imprimiblesDatos pegados desde web/CSV=LET(t, G5:G17, u, TRIM(CLEAN(SUBSTITUTE(t,CHAR(160)," "))), FILTER(t, LEN(u)>0))
Dividir en caracteresNo quieres que espacios sean elementos=LET(s,SUBSTITUTE(F3," ",""), MID(s, SEQUENCE(LEN(s)), 1))
Delimitadores repetidosVarias 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 usar UNICODE(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)&gt;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))&gt;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 con LEN 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)&gt;0)))

Guárdala como FILTRARNOVACIOS_VISUALES y úsala así:

=FILTRARNOVACIOS_VISUALES(G5:G17)

Tabla de caracteres invisibles comunes

CarácterCódigoNombreCómo tratarlo
Espacio32SpaceTRIM lo quita al inicio/fin; se puede reemplazar con SUBSTITUTE(," ","") si procede.
NBSP160No‑breaking spaceSUBSTITUTE(,CHAR(160)," ") y luego TRIM.
Tab9TabulaciónCLEAN lo elimina; también SUBSTITUTE(,CHAR(9)," ") si deseas convertirlo en espacio.
CR / LF13 / 10Retorno / salto de líneaCLEAN 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)&gt;0))

Limpiar agresivo (NBSP + no imprimibles) y filtrar

=LET(t, G5:G17,
     u, TRIM(CLEAN(SUBSTITUTE(t,CHAR(160)," "))),
     FILTER(t, LEN(u)&gt;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 por LEN>0.
  • Si vas a dividir, elimina espacios antes o usa TEXTSPLIT(..., ignore_empty=TRUE).
  • Valida con LEN y CODE/UNICODE para saber qué carácter tienes delante.

Fórmulas completas citadas

Caso A — Celdas realmente vacías

=FILTER(G5:G17, G5:G17&lt;&gt;"")

Caso B — Los “vacíos” son espacios u otros invisibles (por eso <>"" no sirve)

  1. 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 con LEN(u)>0.
  2. 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))
  3. 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 con CLEAN: =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+.
Índice