Aplicar DIVIDIRTEXTO a una matriz dinámica completa
Un miembro de la comunidad tiene una columna dinámica generada con UNICOS (600 filas) y necesita dividir cada celda por un separador "/". El problema: DIVIDIRTEXTO aplicado con el operador # solo procesa la primera celda.
La comunidad propone tres enfoques con niveles de complejidad creciente:
Con SECUENCIA + TEXTOANTES + TEXTODESPUES (Leo): recorre las N partes del texto usando SECUENCIA como índice de posición. Funciona cuando sabes cuántas columnas tendrá el resultado:
``
=LET(
i; E3#;
d; "/";
s; SECUENCIA(; 3);
TEXTODESPUES(d&TEXTOANTES(i&d; d; s); d; s)
)
`
Con MATRIZATEXTO + DIVIDIRTEXTO (Alejandro): la solución más corta. Convierte toda la matriz a un solo texto y luego divide:
`
=DIVIDIRTEXTO(MATRIZATEXTO(E3#); "/"; ";")
`
Leo advierte que esta solución tiene un límite: si LARGO(CONCAT(E3#)) supera 32.767 caracteres (probable con 600 filas), la fórmula falla.
Con LAMBDA recursiva y bisección (Leo): la solución definitiva para cualquier número de filas. Divide la matriz en mitades recursivamente, aplica DIVIDIRTEXTO a cada celda individual, y las apila con APILARV:
`
=LET(
F; LAMBDA(F; x;
LET(n; FILAS(x);
SI(n = 1;
DIVIDIRTEXTO(x; "/");
APILARV(F(F; TOMAR(x; n/2)); F(F; EXCLUIR(x; n/2)))
)
)
);
SI.ND(F(F; E3#); "")
)
``
La técnica de bisección divide el array por la mitad en cada llamada recursiva, lo que mantiene la profundidad de recursión en O(log n) en lugar de O(n). Con 600 filas, solo necesita ~10 niveles de recursión en vez de 600.
El problema: DIVIDIRTEXTO solo se lleva la primera celda
Tienes una columna dinámica generada con UNICOS (600 filas desbordadas) y necesitas partir cada celda por un separador. Escribes lo obvio, pasarle el rango desbordado con el operador de almohadilla, y Excel te devuelve una sola fila.
DIVIDIRTEXTO no está pensada para recibir una matriz: procesa la primera celda del rango y se olvida del resto. Es la misma limitación que tienen otras funciones que ya devuelven matriz por sí solas, y la que convierte un problema aparentemente trivial en un ejercicio de fórmulas matriciales.
En la comunidad salieron tres enfoques, con complejidad creciente. Merece la pena verlos los tres, porque cada uno vale para un tamaño de datos distinto.
Enfoque 1: SECUENCIA con TEXTOANTES y TEXTODESPUES
La propuesta de Leo no divide: recorta por posición. Dentro de un LET guarda el rango, el delimitador y una SECUENCIA horizontal de tres elementos, y usa esa secuencia como índice de la parte que quiere extraer: TEXTOANTES se queda con lo anterior a la aparición número N del delimitador y TEXTODESPUES con lo posterior.
La clave está en los pegotes de separador. Concatenando un delimitador al final de cada texto y otro al principio, TEXTOANTES y TEXTODESPUES siempre encuentran algo que buscar, incluso cuando la parte pedida está en el borde de la cadena. Y como la SECUENCIA es horizontal, el resultado se despliega en tres columnas. Tienes la fórmula completa en la descripción del caso.
Su límite: hay que saber de antemano cuántas columnas tendrá el resultado. Ese tres es fijo. Si un texto trae cuatro partes, la cuarta se pierde.
Enfoque 2: MATRIZATEXTO con DIVIDIRTEXTO
La solución de Alejandro es la más corta con diferencia, y por eso es la primera que hay que probar:
=DIVIDIRTEXTO(MATRIZATEXTO(E3#); "/"; ";")La idea es elegante: si DIVIDIRTEXTO solo sabe tratar un texto, dale un solo texto. MATRIZATEXTO aplana toda la matriz en una única cadena separando las filas con punto y coma, y luego DIVIDIRTEXTO deshace las dos cosas a la vez: la barra marca las columnas y el punto y coma marca las filas.
Su límite, y es serio: Leo avisa de que la cadena intermedia no puede pasar de 32.767 caracteres. Con 600 filas es muy probable que las pase, y entonces la fórmula falla. Puedes comprobarlo antes midiendo el largo de CONCAT sobre el rango.
Enfoque 3: LAMBDA recursiva con bisección
Cuando el volumen no cabe en el truco anterior, la solución definitiva es la recursiva. En vez de aplicar DIVIDIRTEXTO a la matriz, la partes en trozos hasta que cada trozo es una sola celda, que es el caso que DIVIDIRTEXTO sí sabe resolver:
=LET(
F; LAMBDA(F; x;
LET(n; FILAS(x);
SI(n = 1;
DIVIDIRTEXTO(x; "/");
APILARV(F(F; TOMAR(x; n/2)); F(F; EXCLUIR(x; n/2)))
)
)
);
SI.ND(F(F; E3#); "")
)El detalle que la hace viable no es la recursividad, es la bisección. Una recursión ingenua que fuera fila a fila necesitaría 600 llamadas anidadas y Excel se quedaría sin pila. Al partir por la mitad en cada paso, la profundidad crece de forma logarítmica: con 600 filas bastan unos diez niveles. Ese cambio es lo que separa una fórmula que funciona en el ejemplo de una que funciona en producción.
El patrón de pasarle la propia función como primer argumento, para que pueda llamarse a sí misma, es el idioma habitual para hacer recursividad dentro de un LET sin tener que registrar nada en el Administrador de nombres. Y SI.ND limpia los huecos que dejan las filas con menos partes.
Funciones clave
DIVIDIRTEXTO: parte un texto por un delimitador. Trabaja sobre una celda, no sobre una matriz.MATRIZATEXTO: convierte una matriz entera en una sola cadena, con separadores de fila y de columna.TEXTOANTESyTEXTODESPUES: extraen el trozo anterior o posterior a la enésima aparición de un delimitador.LAMBDA: define una función anónima que, pasándose a sí misma como argumento, puede llamarse de forma recursiva.TOMARyEXCLUIR: cogen o descartan las primeras N filas de una matriz. Son las dos mitades de la bisección.APILARV: junta verticalmente los resultados parciales de cada rama.
Conclusión
Tres soluciones al mismo problema y ninguna sobra: la de SECUENCIA cuando el número de columnas es conocido, la de MATRIZATEXTO cuando el volumen es pequeño, y la recursiva cuando ninguna de las dos llega. Esta forma de resolver —alguien plantea un caso real, varios miembros proponen enfoques distintos y entre todos aparecen los límites de cada uno— es exactamente lo que pasa a diario en la comunidad de Influexcel.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Generar la serie de Fibonacci con REDUCE, APILARV y LAMBDA CasoInteresante ejercicio compartido en la comunidad: generar los primeros N números de la serie de Fibonacci usando exclusivamente fórmulas de
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Reestructurar datos apilados con LAMBDA y PIVOTARPOR CasoUn miembro de la comunidad comparte un archivo de revisión de Seguridad Social con una tabla amplia (34 columnas x 1540 filas) en formato "a
- Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección CasoAlejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícu
- Fibonacci sin recursión lenta: de LAMBDA exponencial a fórmula instantánea CasoUn ingeniero industrial del grupo implementa Fibonacci con LAMBDA recursiva (Fibonacci(n-1)+Fibonacci(n-2)), pero a partir de n=35 la fórmul
- Agrupar y limpiar referencias con AGRUPARPOR, DIVIDIRTEXTO y APILARV CasoInteresante problema de un miembro que trabaja con una tabla de "Push Money cancelado" con más de 150 productos. Las referencias vienen dupl
- Estructurar correctamente LAMBDA con LET y parámetros opcionales CasoNuevo reto de Excel resuelto por la comunidad: un miembro está creando una función LAMBDA personalizada para calcular potencia de bombeo (fó
- Excel Inventario LIFO/FIFO Técnica Avanzada con LAMBDA TutorialCómo aplicar la función recursiva en Excel para transformar los tediosos procesos de valoración de inventario, mediante los métodos LIFO y F
- Filtrado multi-checkbox con comparación perpendicular CasoJoan Recasens plantea un problema muy práctico en plena Navidad: tiene una lista de registros y varios checkboxes, y necesita filtrar mostra
- LISTAS DESPLEGABLES DINÁMICAS: 3 Métodos para conseguirlas TutorialUnas buenas listas desplegables mejoran la usabilidad de tu hoja de cálculo y disminuyen drásticamente los errores al introducir nueva infor