Tenemos los siguientes datos.
Debemos de transponer la tabla como sigue:
Empecemos…
En la celda F2, usamos LET, creamos una variable, usamos el condicional SI, como argumento prueba lógica, preguntamos si es numero el rango B3:D12, como argumento valor si verdadero, seleccionamos el rango A3:A12, concatenamos con un espacio, concatenamos con el rango B2:D2, concatenamos con un espacio, concatenamos con el rango B3:D12, como argumento valor si falso, ponemos blanco.
=LET(a;SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;"");a)
Tenemos una matriz desbordada de 10 filas, y, 3 columnas, en cada celda donde hay coincidencia, aparece el nombre, espacio, el dato, espacio, y, el valor, donde no hay coincidencia, aparece blanco.
Antes del condicional SI, ponemos la funcion ENCOL.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));a)
Creamos otra variable, preguntamos si es numero el rango A2:A12, en ese caso, seleccionamos el rango A2:A12, concatenamos con un espacio, concatenamos con el rango B2:D2, en caso contrario, que ponga blanco.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");b)
Tenemos una matriz desbordada con las mismas filas y columnas que la matriz anterior, donde hay coincidencia aparece la fecha en formato de texto, un espacio, y el dato.
Vamos a excluir la ultima fila, para ello, antes del condicional SI, usamos la funcion EXCLUIR, como argumento matriz es el condicional SI, como argumento filas, ponemos -1.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);b)
Vamos a rellenar los espacios con la fecha anterior, para ello, antes de EXCLUIR, usamos SCAN, omitimos el argumento valor inicial, como argumento array es la funcion EXCLUIR, como argumento funcion ponemos LAMBDA, y, declaramos dos variables.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y
Como argumento calculo, usamos el condicional SI, preguntamos si la variable “y” es igual a blanco, en ese caso, que devuelva la variable “x”, en caso contrario, que devuelva la variable “y”.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y;SI(y="";x;y)));b)
Ya lo tenemos.
Creamos otra variable, usamos la funcion ENCOL, como argumento matriz, usamos la funcion TEXTOANTES, como argumento texto, ponemos la variable “b”, como argumento delimitador, ponemos un espacio, y, multiplicamos por 1, para obtener la fecha.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y;SI(y="";x;y)));c;ENCOL(TEXTOANTES(b;" "))*1;c)
Tenemos las fechas en vertical.
Creamos otra variable, usamos la funcion APILARH, como argumento matriz1, ponemos la variable “c”, como argumento matriz2, ponemos la variable “a”.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y;SI(y="";x;y)));c;ENCOL(TEXTOANTES(b;" "))*1;d;APILARH(c;a);d)
Tenemos una matriz desbordada de dos columnas, en la primera columna tenemos las fechas, y, en la segunda columna el nombre, dato, y, valor.
Creamos otra variable, usamos la funcion FILTRAR, como argumento matriz ponemos la variable “d”, como argumento include, tomamos la última columna de la variable “d”, TOMAR(d;;-1), y, comparamos con desigual a blanco.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y;SI(y="";x;y)));c;ENCOL(TEXTOANTES(b;" "))*1;d;APILARH(c;a);e;FILTRAR(d;TOMAR(d;;-1)<>"");e)
Tenemos los datos sin blancos.
Creamos otra variable, usamos la funcion REDUCE, como argumento valor inicial ponemos blanco, como argumento array, tomamos la ultima columna de la variable “e”, TOMAR(e;;-1), como argumento funcion, ponemos LAMBDA, y, declaramos dos variables.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y;SI(y="";x;y)));c;ENCOL(TEXTOANTES(b;" "))*1;d;APILARH(c;a);e;FILTRAR(d;TOMAR(d;;-1)<>"");f;REDUCE("";TOMAR(e;;-1);LAMBDA(x;y
Como argumento calculo, usamos APILARV, como argumento matriz1, ponemos la variable “x”, como argumento matriz2, usamos la funcion DIVIDIRTEXTO, como argumento texto, ponemos la variable “y”, como argumento delimitador, ponemos espacio.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y;SI(y="";x;y)));c;ENCOL(TEXTOANTES(b;" "))*1;d;APILARH(c;a);e;FILTRAR(d;TOMAR(d;;-1)<>"");f;REDUCE("";TOMAR(e;;-1);LAMBDA(x;y;APILARV(x;DIVIDIRTEXTO(y;" "))));f)
Tenemos una matriz desbordada de tres columnas, en la primera columna tenemos los nombres, en la segunda columna tenemos los datos, y, en la tercera columna, los valores.
La primera fila esta demás, antes de REDUCE, usamos la funcion EXCLUIR, como argumento matriz es la funcion REDUCE, como argumento filas, ponemos 1.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y;SI(y="";x;y)));c;ENCOL(TEXTOANTES(b;" "))*1;d;APILARH(c;a);e;FILTRAR(d;TOMAR(d;;-1)<>"");f;EXCLUIR(REDUCE("";TOMAR(e;;-1);LAMBDA(x;y;APILARV(x;DIVIDIRTEXTO(y;" "))));1);f)
Usamos el argumento calculo de LET, usamos la funcion APILARH, como argumento matriz1 tomamos la primera columna de la variable “e”, TOMAR(e;;1), como argumento matriz2, ponemos la variable “f”.
=LET(a;ENCOL(SI(ESNUMERO(B3:D12);A3:A12&" "&B2:D2&" "&B3:D12;""));b;SCAN(;EXCLUIR(SI(ESNUMERO(A2:A12);A2:A12&" "&B2:D2;"");-1);LAMBDA(x;y;SI(y="";x;y)));c;ENCOL(TEXTOANTES(b;" "))*1;d;APILARH(c;a);e;FILTRAR(d;TOMAR(d;;-1)<>"");f;EXCLUIR(REDUCE("";TOMAR(e;;-1);LAMBDA(x;y;APILARV(x;DIVIDIRTEXTO(y;" "))));1);APILARH(TOMAR(e;;1);f))
Aceptamos, y, ya lo tenemos.
Miguel Angel Franco Garcia
Comments