Varios valores en una celda: listas y arrays en celda en Excel (APLANAR, TIENE, HASANY y HASALL)

En los cuarenta años de Excel, una celda ha guardado siempre un solo valor. Quien necesitaba apuntar tres responsables de un proyecto o las competencias de una persona acababa escribiendo «Excel, SQL, Inglés» en una celda: un texto que parece una lista, pero que para Excel es un único dato. No se puede filtrar por uno de sus elementos ni contarlos, y las búsquedas dan falsos positivos.

Eso se acaba. Microsoft ha anunciado las listas, los arrays en celda y los arrays anidados, de momento en el canal Beta de Excel para Windows y Mac (anuncio oficial en el blog de Microsoft 365 Insider). Llevo semanas probándolas en la beta. Este artículo recoge qué son, cómo se usan, las cuatro funciones nuevas y, sobre todo, cómo se comportan las funciones de siempre cuando se encuentran con una celda que guarda varios valores.

> Son funciones en vista previa: su comportamiento puede cambiar antes de llegar a todo el mundo. Microsoft recomienda no usarlas todavía en libros importantes.

Tres conceptos que conviene separar

La novedad trae tres nombres, y no son sinónimos.

| Concepto | Qué es | Para quién |
|---|---|---|
| Lista | Varios valores escritos en una celda. Se crea, se edita y se filtra como cualquier otro valor | Cualquier usuario |
| Array en celda | Cualquier array guardado dentro de una celda, como valor o como resultado de una fórmula, de cualquier tamaño y forma | Quien usa fórmulas |
| Array anidado | Un array que contiene otros arrays | Quien escribe LAMBDA |

Las listas son la puerta de entrada: no hace falta saber nada de matrices para usarlas. Los arrays en celda y los anidados son el cambio de fondo, y es donde están las novedades para quien escribe fórmulas.

Listas: varios valores en una celda

Cómo se crean

- Insertar › Lista, o el atajo Ctrl+J, y escribir o pegar los elementos separados por comas o por punto y coma, según la configuración regional. En Excel en español, punto y coma: Excel; SQL; Inglés.
- Copiar y pegar como valores el resultado de una fórmula que devuelve un array también deja un array de valor en la celda, sin fórmula detrás.

Cómo se editan y se consultan

- Doble clic o F2 para añadir, quitar o cambiar elementos, como cualquier otro valor.
- El icono de la celda enseña los elementos uno por uno.
- El formato de número de la celda se aplica a cada elemento: una lista de precios con formato de moneda enseña 4,95 €; 9,95 €; 99,95 €.

Filtrar por elemento: la razón de ser

El autofiltro de una columna con listas ofrece los elementos sueltos, no los textos enteros. En una tabla de empleados con sus deportes, marcar Tenis devuelve a quien juega al tenis y no a quien juega al tenis de mesa. Con texto separado por comas, esto no tenía una solución limpia: o filtrabas por el texto completo o una búsqueda por «Tenis» te colaba el tenis de mesa.

Envolver: las llaves que meten un array en una celda

Desde las matrices dinámicas, una fórmula que devuelve varios valores desborda: los reparte por las celdas de alrededor. =SECUENCIA(5) ocupa cinco filas.

Ahora se puede envolver la fórmula con llaves (Microsoft lo llama wrapping) para que el resultado se quede en una sola celda:

``
=SECUENCIA(5) → desborda en cinco celdas
={SECUENCIA(5)} → una celda que guarda 1; 2; 3; 4; 5
`

Las llaves crean un array de 1×1 alrededor del resultado. Excel desborda ese array exterior, que solo ocupa una celda, y el array original queda dentro de ella. Las llaves ya servían para escribir arrays en Excel; lo nuevo es que ahora se pueden poner varias capas.

Dos detalles prácticos:

- Referenciar una celda que guarda un array devuelve todos sus valores: =B2 los desborda en celdas separadas. Si quieres el array entero en una sola celda, ={B2}.
- Las operaciones se aplican a cada elemento. Con una lista de precios en B18, =B182 desborda los tres precios multiplicados, y ={B182} los deja en una celda.

Arrays anidados: el fin de un error muy conocido

Hasta ahora, una fórmula que tenía que devolver un array por cada elemento acababa en #CALC! o devolvía solo una parte. Quien haya escrito un BYROW o un MAP que devolvía más de un valor por fila conoce el error de memoria.

Con los arrays anidados, cada elemento guarda su propio resultado:

`
=BYROW(SECUENCIA(6); LAMBDA(n; SECUENCIA(; n)))
`

Antes, #CALC!. Ahora, seis celdas: la primera guarda 1, la segunda 1; 2, y así hasta 1; 2; 3; 4; 5; 6.

El caso más visible es DIVIDIRTEXTO sobre una columna entera. Con productos por pedido escritos como texto (Papel A4, Sobres, Tóner):

`
=DIVIDIRTEXTO(D17:D21; ", ")
`

Antes devolvía solo el primer producto de cada pedido. Ahora devuelve una celda por pedido con todos sus productos, cada uno un array de distinta longitud. Si necesitas un rectángulo, lo pides con APLANAR; pero el resultado anidado conserva más información: cuántos productos lleva cada pedido, sin huecos que rellenar.

Las cuatro funciones nuevas

| Excel en español | Excel en inglés | Sintaxis | Qué devuelve |
|---|---|---|---|
| APLANAR | FLATTEN | APLANAR(array; [relleno]; [niveles]) | El array con una o varias capas de anidamiento menos |
| TIENE | HAS | TIENE(array; valor) | VERDADERO si el valor está en el array |
| HASANY | HASANY | HASANY(array; valores) | VERDADERO si está alguno de los valores |
| HASALL | HASALL | HASALL(array; valores) | VERDADERO si están todos los valores |

HASANY y HASALL se escriben igual en Excel en español: no tienen traducción. Y se escriben sin punto entre HAS y ANY.

TIENE, HASANY y HASALL

Una tabla de empleados con sus competencias como listas, y una celda E5 con la lista de requisitos de un puesto (Excel; SQL):

`
Cumplen todos: =FILTRAR(B5:B12; MAP(C5:C12; LAMBDA(l; HASALL(l; E5))); "Nadie")
Cumplen alguno: =FILTRAR(B5:B12; MAP(C5:C12; LAMBDA(l; HASANY(l; E5))); "Nadie")
Saben inglés: =FILTRAR(B5:B12; MAP(C5:C12; LAMBDA(l; TIENE(l; "Inglés"))); "Nadie")
`

Editar la lista de requisitos con doble clic recalcula las tres columnas al momento.

Lo que conviene saber de las tres:

- Comparan elementos enteros, no trozos de texto. Es la diferencia con HALLAR: buscar «SQL» con HALLAR en el texto «NoSQL, Inglés» da positivo; TIENE sobre la lista, no.
- No distinguen mayúsculas: «inglés» encuentra «Inglés».
- TIENE se aplica valor a valor si el segundo argumento es un array: TIENE({1;2;3}; {2;5}) desborda VERDADERO; FALSO. HASANY y HASALL devuelven siempre un único resultado.
- HASALL con un array vacío como segundo argumento devuelve #CALC!.

Filtrar una tabla por los valores de una lista

Un truco que salió en el grupo el 14/10/2026: para quedarte con las filas de una tabla cuyo registro está en una lista guardada en H1, no hace falta MAP ni BYROW. Basta con pasar la lista primero y la columna después:

`
=FILTRAR(t; TIENE(H1; t[Registro]))
`

Como el segundo argumento es una columna, TIENE se aplica valor a valor y devuelve un VERDADERO o FALSO por fila, que es justo lo que pide FILTRAR. El orden importa: con TIENE(t[Registro]; H1) la pregunta es otra y la fórmula da error. Tampoco hace falta comparar con =VERDADERO.

La pista fue de Leo («con TIENE, sin necesidad de BYROW»; «invierte los argumentos»), y Miki la llevó a la práctica después de probar dos alternativas que también funcionan:

`
=FILTRAR(t; BYROW(t[Registro]; LAMBDA(x; HASANY(x; H1))))
=FILTRAR(t; BYROW(1(t[Registro] = ENFILA(APLANAR(H1))); SUMA) = 1)
`

La de TIENE es la más corta y la más fácil de leer: es la que conviene recordar.

APLANAR: relleno y niveles

Relleno. Cuando los arrays tienen distinta longitud, al aplanarlos quedan huecos. Por defecto Excel los llena con #N/D. Con "" quedan en blanco:

`
=APLANAR(DIVIDIRTEXTO(D17:D21; ", "); "")
`

Niveles. Cuántas capas de anidamiento se quitan. Por defecto, una. Se puede pedir 2, 3… y 0 quita todas: el resultado es un rectángulo sin ningún array dentro.

Un aviso que ahorra tiempo: BYROW envuelve cada resultado una capa más. Sobre la salida de un BYROW, APLANAR con un nivel no hace nada visible; hace falta niveles = 2: =APLANAR(BYROW(SECUENCIA(6); LAMBDA(n; SECUENCIA(; n))); ""; 2).

Cómo se comportan las funciones de siempre

Es la parte que más cuesta al principio. Esto es lo que he comprobado en la beta, con una lista de precios (4,95; 9,95; 99,95) en B18 y una de productos (Papel A4; Sobres; Tóner) en F5:

| Fórmula | Resultado | Qué enseña |
|---|---|---|
| =SUMA(B18) · =MAX(B18) · =PROMEDIO(B18) | 114,85 · 99,95 · 38,28 | Las funciones de agregado ven todos los elementos |
| =CONTARA(F5) | 3 | Cuenta elementos: es la forma de medir una lista |
| =B182 | Desborda 9,9 · 19,9 · 199,9 | Las operaciones se aplican a cada elemento |
| =INDICE(F5; 2) | Sobres | INDICE entra en la lista |
| =FILAS(F5) | 3 | Sobre la celda, mide la lista |

Y una trampa: dentro de un MAP que recorre varias celdas con listas, FILAS y COLUMNAS devuelven 1. Para medir cada lista ahí dentro, CONTARA.

Tres casos que antes eran difíciles

1. De lista a tabla larga

Es lo que Power Query llama «expandir a nuevas filas»: una fila por cada producto de cada pedido, repitiendo el número de pedido. Con los pedidos en B17:B21 y sus productos partidos en F17#:

`
=LET(
g; APLANAR(F17#);
k; SI(ESERROR(g); g; B17:B21);
APILARH(ENCOL(k; 2); ENCOL(g; 2))
)
`

APLANAR rellena los huecos con #N/D. El número de pedido se reparte por todas las columnas con SI(ESERROR(g); g; pedido), de modo que los huecos siguen siendo error. ENCOL(…; 2) recorre cada rejilla ignorando los errores. El resultado es una tabla normal que se puede agrupar, filtrar o contar como cualquier otra.

2. Agrupar recogiendo los elementos

El camino de vuelta: una fila por cliente con la lista de lo que compra en una celda. AGRUPARPOR acepta ahora una LAMBDA que devuelve un array, algo que antes daba #CALC!:

`
=AGRUPARPOR(C17:C21; F17#; LAMBDA(x; {UNICOS(ENCOL(APLANAR(x); 2))}); ; 0)
`

Las llaves envuelven el resultado para que cada grupo guarde su lista en una celda.

3. Un organigrama: la cadena de mando de cada persona

Con una tabla empleado → jefe directo, una LAMBDA recursiva sube de jefe en jefe y devuelve la ruta entera en una celda:

`
=LET(
sube; LAMBDA(f; e;
LET(j; BUSCARX(e; B6:B17; C6:C17; "") & "";
SI(j = ""; e; APILARH(e; f(f; j))))
);
MAP(B6:B17; LAMBDA(e; sube(sube; e)))
)
`

Oscar → Angela → Michael → Jan → David. A partir de ahí:

- El nivel jerárquico de cada persona es CONTARA(cadena) - 1.
- Quién depende de alguien, directa o indirectamente, es una sola pregunta de sí o no: =FILTRAR(B6:B17; MAP(D6#; LAMBDA(c; TIENE(c; H5))) * NO(B6:B17 = H5); "Nadie").

Un detalle que costó encontrar: la recursión funciona con MAP, pero con BYROW devuelve #¡NUM!, porque BYROW pasa cada nombre envuelto como un array de 1×1 y la búsqueda falla.

Cómo activarlo

- Canal Beta de Microsoft 365. Windows: versión 2610 (compilación 20520.20000) o posterior. Mac: versión 16.114 (compilación 26092111) o posterior. El despliegue es gradual: puede que tarde en aparecerte aunque tengas la versión.
- Versión de compatibilidad 3 en cada libro. Los cálculos con arrays anidados la necesitan, y se elige libro a libro desde las opciones de cálculo de la pestaña Fórmulas. Algunas fórmulas existentes dan resultados distintos en la versión 3; si un libro se comporta de forma extraña, se puede dejar en la 1 o la 2. Si algo de este artículo te da #CALC!` en un libro nuevo, mira esto primero.

Lo que todavía no funciona

Según Microsoft, en esta primera versión de la beta:

- El formato condicional no mira dentro de los arrays, salvo que uses una fórmula.
- La validación de datos no puede usar una lista o un array como origen del desplegable.
- Los gráficos no convierten un array en serie de datos.
- Las tablas dinámicas no leen arrays como datos de origen.
- Power Query no carga ni devuelve columnas con arrays.
- Buscar y reemplazar no cambia elementos de una lista.

Para seguir

Esto acaba de salir y las mejores ideas van a venir de probarlo con datos reales. En el grupo de WhatsApp de InflueXcel lo estamos probando: si encuentras un caso bueno, o algo que no funciona como esperabas, es el sitio para contarlo.

Y la fuente de todo, con las capturas oficiales: Put multiple values in one cell with lists and arrays in Excel, de Jake Armstrong, en el blog de Microsoft 365 Insider.

Más casos con estas funciones

Más contenido de Excel en InflueXcel