Unpivot con separación de cuentas contables concatenadas

Interesante problema planteado por Juan en el grupo: tiene una tabla de asientos contables donde las cuentas vienen concatenadas con "/" en una sola celda (por ejemplo, 621/472/410), y cada cuenta tiene su importe asociado en columnas separadas. El reto es hacer un unpivot que no solo despliegue los importes, sino que también separe las cuentas individuales y las asocie correctamente.

Los datos de partida tienen esta estructura:

| Fecha | Cuentas | Importe 1 | Importe 2 | Importe 3 | Concepto |
|-------|---------|-----------|-----------|-----------|----------|
| 2026-03-31 | 621/472/410 | 100 | 21 | -410 | Inventado |
| 2026-04-30 | 623/472/410 | 3000 | 21 | -3021 | Prueba |

Y el resultado esperado es una fila por cada cuenta individual con su importe correspondiente:

| Fecha | Cuenta | Importe | Valor | Concepto |
|-------|--------|---------|-------|----------|
| 2026-03-31 | 621 | Importe | 100 | Inventado |
| 2026-03-31 | 472 | Importe | 21 | Inventado |
| 2026-03-31 | 410 | Importe | -410 | Inventado |
| 2026-04-30 | 623 | Importe | 3000 | Prueba |
| ... | ... | ... | ... | ... |

Juan ya tenía un LAMBDA heredado de otro ejercicio que casi lo resolvía, pero la columna de cuentas se repetía en vez de dividirse. La comunidad propuso tres enfoques distintos:

Solución de Nacho usando LET con un LAMBDA auxiliar para vectorizar la operación de columnas:

``
=LET(
H; APILARH;
F; LAMBDA(x; ENCOL(SI(F5:H6 = ""; ""; x); 2));
APILARV(
H(
F(D5:D6);
H(
EXCLUIR(ENCOL(DIVIDIRTEXTO(CONCAT(E5:E6 & "/"); "/")); -1);
F(F4:H4);
F(F5:H6);
F(I5:I6)
)
)
)
)
`

La clave está en usar CONCAT + DIVIDIRTEXTO para unir todas las cuentas y luego separarlas de golpe, mientras ENCOL con el parámetro de agrupación (2) reorganiza cada columna en bloques de 3 filas.

Solución con REDUCE y EXPANDIR que usa un enfoque más funcional, construyendo el resultado fila a fila:

`
=LET(
_f; D5:D6;
_c; E5:E6;
_t; I5:I6;
_d; F5:H6;
_R; LAMBDA(x; EXCLUIR(REDUCE(0; x; LAMBDA(a; v; APILARV(a; EXPANDIR(v; 3;; v)))); 1));
APILARH(
_R(_f);
EXCLUIR(REDUCE(0; _c; LAMBDA(a; v; APILARV(a; ENCOL(--DIVIDIRTEXTO(v; "/"))))); 1);
_R(EXPANDIR(F4; FILAS(D5:D6);; F4));
EXCLUIR(REDUCE(0; _d; LAMBDA(a; v; APILARV(a; v))); 1);
_R(_t)
)
)
`

Aquí, el LAMBDA _R se encarga de repetir cada valor tantas veces como cuentas hay (3 en este caso) usando EXPANDIR, y REDUCE va apilando cada bloque verticalmente.

Solución de Gerson, la más compacta, con un truco elegante: usar CONCAT con doble separador ("/" y "|") para aplanar todo en un solo paso:

`
=LET(
a; --DIVIDIRTEXTO(CONCAT(E5:E6 & "|"); "/"; "|"; 1);
F; LAMBDA(x; ENCOL(SI(a; x)));
APILARH(F(D5:D6); F(a); F(F4); F(F5:H6); F(I5:I6))
)
`

El DIVIDIRTEXTO con dos delimitadores ("/" para las cuentas y "|" para separar filas) genera directamente una matriz con la forma correcta, que luego sirve como máscara booleana para ENCOL`.

Miki también aportó su versión con una imagen que completaba el enfoque.

Las reacciones de Juan lo dicen todo: "Solución Increíble", "Perfecta", "Buenísima también".

Más contenido de Excel en InflueXcel