Hoy un ejercicio imaginativo para repartir elementos de un listado por nuestra hoja de cálculo, respetando unas condiciones de número máximo de elementos por cada fila, y además separándolos un número de columnas y de filas entre sí!!.
En la imagen vemos un ejemplo de lo esperado...
Dado un listado de N elementos cualquiera, y unas condiciones de inicio:
-máximo cuatro elementos por cada fila
-separados por dos columnas vacías entre cada elemento
-y por una fila vacía entre cada fila de datos
Hay diferentes formas de llegar al resultado esperado... pero en esta ocasión he optado por una función poco 'apetecible' inicialmente:
REPETIR(texto; núm_de_veces)
Muy simple, verdad?... Repite el texto o caracteres indicados las veces deseadas.
La combinaremos, entre otras, con la nueva función DIVIDIRTEXTO(text;col_delimiter;[row_delimiter];[ignore_empty]; [match_mode]; [pad_with])
La cual divide cadenas de texto mediante delimitadores de columna y fila.
Cadena de texto que compondremos con ayuda de la clásica UNIRCADENAS.
Para una mejor interpretación nos paoyaremos con la función LET.
Insertaremos en la celda D6 la siguiente fórmula:
=LET(MaxCols;$A$1; rng;ndListado; distanciaCols;$A$2; distanciaFilas;$A$3; NumEltos;CONTARA(rng); Pos;DIVIDIRTEXTO(UNIRCADENAS("";1;LET(dato;SECUENCIA(1;NumEltos);SI(RESIDUO(dato;MaxCols)=0;dato&REPETIR(";"&REPETIR("\";MaxCols*distanciaCols);distanciaFilas)&";";dato&"\"&REPETIR("\";distanciaCols))));"\";";"); SI.ERROR(INDICE(rng;Pos);""))
La clave de la fórmula la encontramos en la variable 'Pos' (de posición):
Pos;DIVIDIRTEXTO(UNIRCADENAS("";1;LET(dato;SECUENCIA(1;NumEltos);SI(RESIDUO(dato;MaxCols)=0;dato&REPETIR(";"&REPETIR("\";MaxCols*distanciaCols);distanciaFilas)&";";dato&"\"&REPETIR("\";distanciaCols))));"\";";")
Que ejecutada fuera del contexto de nuestra fórmula nos devolvería la siguiente cadena de texto:
1\\\2\\\3\\\4;\\\\\\\\\\\\;5\\\6\\\7\\\
Y si, has acertado... son los caracteres que en mi sistema se emplean para diferenciar las filas (;) y las columnas (\).
Solo faltaría interpretar esa cadena de texto como una matriz... lo que podemos hacer al aplicar la función DIVIDIRTEXTO.
El último paso aplica el reparto correspondiente de nuestro listado empleando la función INDICE...
La curiosidad del ejercicio es como la combinación de varias funciones REPETIR, en el orden correcto, nos permite generar la cadena de texto, con la secuencia correcta que distribuirá los elementos respetando las separaciones de filas y columnas...
Te animo a descomponer la fórmula ;-)
En la imagen vemos un ejemplo de lo esperado...
Dado un listado de N elementos cualquiera, y unas condiciones de inicio:
-máximo cuatro elementos por cada fila
-separados por dos columnas vacías entre cada elemento
-y por una fila vacía entre cada fila de datos
Hay diferentes formas de llegar al resultado esperado... pero en esta ocasión he optado por una función poco 'apetecible' inicialmente:
REPETIR(texto; núm_de_veces)
Muy simple, verdad?... Repite el texto o caracteres indicados las veces deseadas.
La combinaremos, entre otras, con la nueva función DIVIDIRTEXTO(text;col_delimiter;[row_delimiter];[ignore_empty]; [match_mode]; [pad_with])
La cual divide cadenas de texto mediante delimitadores de columna y fila.
Cadena de texto que compondremos con ayuda de la clásica UNIRCADENAS.
Para una mejor interpretación nos paoyaremos con la función LET.
Insertaremos en la celda D6 la siguiente fórmula:
=LET(MaxCols;$A$1; rng;ndListado; distanciaCols;$A$2; distanciaFilas;$A$3; NumEltos;CONTARA(rng); Pos;DIVIDIRTEXTO(UNIRCADENAS("";1;LET(dato;SECUENCIA(1;NumEltos);SI(RESIDUO(dato;MaxCols)=0;dato&REPETIR(";"&REPETIR("\";MaxCols*distanciaCols);distanciaFilas)&";";dato&"\"&REPETIR("\";distanciaCols))));"\";";"); SI.ERROR(INDICE(rng;Pos);""))
La clave de la fórmula la encontramos en la variable 'Pos' (de posición):
Pos;DIVIDIRTEXTO(UNIRCADENAS("";1;LET(dato;SECUENCIA(1;NumEltos);SI(RESIDUO(dato;MaxCols)=0;dato&REPETIR(";"&REPETIR("\";MaxCols*distanciaCols);distanciaFilas)&";";dato&"\"&REPETIR("\";distanciaCols))));"\";";")
Que ejecutada fuera del contexto de nuestra fórmula nos devolvería la siguiente cadena de texto:
1\\\2\\\3\\\4;\\\\\\\\\\\\;5\\\6\\\7\\\
Y si, has acertado... son los caracteres que en mi sistema se emplean para diferenciar las filas (;) y las columnas (\).
Solo faltaría interpretar esa cadena de texto como una matriz... lo que podemos hacer al aplicar la función DIVIDIRTEXTO.
El último paso aplica el reparto correspondiente de nuestro listado empleando la función INDICE...
La curiosidad del ejercicio es como la combinación de varias funciones REPETIR, en el orden correcto, nos permite generar la cadena de texto, con la secuencia correcta que distribuirá los elementos respetando las separaciones de filas y columnas...
Te animo a descomponer la fórmula ;-)
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.