Tenemos el siguiente modelo:
El modelo esta en formato de tabla, y, se llama Ventas.
Debemos de crear un reporte, o, informe, donde debemos de invertir cada dos filas, por ejemplo, las dos primeras filas pertenecen a la provincia de Madrid y Granada, pues, debe de aparecer Granada y Madrid, así con el resto de los registros.
En la celda H1, usamos LET, creamos una variable, usamos la funcion FILA como argumento seleccionamos la columna de provincia, probamos variable.
=LET(xx;FILA(Ventas4[Provincia]);xx)
Tenemos una matriz desbordada en vertical con los números de filas de la columna provincia.
Creamos otra variable, usamos la funcion ES.IMPAR, como argumento número, ponemos la variable “xx”.
=LET(xx;FILA(Ventas4[Provincia]);aa;ES.IMPAR(xx);aa)
Obtenemos VERDADERO donde la fila es impar, y, FALSO donde no lo es.
Preguntamos que, si es impar el número de fila, que devuelva la variable “xx”, en caso contrario, que devuelva un error.
=LET(xx;FILA(Ventas4[Provincia]);aa;SI(ES.IMPAR(xx);xx;NOD());aa)
Obtenemos el numero de fila impar, y, error donde no lo es.
Usamos ENCOL, e, ignoramos blancos y errores.
=LET(xx;FILA(Ventas4[Provincia]);aa;ENCOL(SI(ES.IMPAR(xx);xx;NOD());3);aa)
Tenemos los números de filas impares.
Creamos otra variable, es la misma expresión que para la variable “aa”, pero, cambiamos ES.IMPAR por ES.PAR.
=LET(xx;FILA(Ventas4[Provincia]);aa;ENCOL(SI(ES.IMPAR(xx);xx;NOD());3);b;ENCOL(SI(ES.PAR(xx);xx;NOD());3);b)
Obtenemos los números de filas pares.
Creamos otra variable, usamos APILARH, como argumento matriz1, ponemos la variable “aa”, como argumento matriz2, ponemos la variable “b”.
=LET(xx;FILA(Ventas4[Provincia]);aa;ENCOL(SI(ES.IMPAR(xx);xx;NOD());3);b;ENCOL(SI(ES.PAR(xx);xx;NOD());3);c;APILARH(aa;b);c)
Vemos que en la última fila tenemos un error, debido a que el numero de filas es impar, usamos ENCOL, e, ignoramos blancos y errores.
=LET(xx;FILA(Ventas4[Provincia]);aa;ENCOL(SI(ES.IMPAR(xx);xx;NOD());3);b;ENCOL(SI(ES.PAR(xx);xx;NOD());3);c;ENCOL(APILARH(aa;b);3);c)
Ya tenemos los números de filas a recuperar.
Creamos otra variable, usamos INDICE, como argumento matriz, seleccionamos las columnas A:F, como argumento número de fila, ponemos la variable “c”, como argumento numero de columna, usamos SECUENCIA, omitimos el argumento filas, como argumento columnas, ponemos 6, que son los encabezados que hay.
=LET(xx;FILA(Ventas4[Provincia]);aa;ENCOL(SI(ES.IMPAR(xx);xx;NOD());3);b;ENCOL(SI(ES.PAR(xx);xx;NOD());3);c;ENCOL(APILARH(aa;b);3);d;INDICE(A:F;c;SECUENCIA(;6));d)
Ya tenemos el modelo, donde vemos como se han invertido las provincias cada dos filas, pero, como el modelo tiene un numero de filas impar, la ultima provincia no ha sido invertida.
Usamos el argumento calculo de LET, usamos APILARV, como argumento matriz1, nos traemos los encabezados de la tabla, como argumento matriz2, ponemos la variable “d”.
=LET(xx;FILA(Ventas[Provincia]);aa;ENCOL(SI(ES.IMPAR(xx);xx;NOD());3);b;ENCOL(SI(ES.PAR(xx);xx;NOD());3);c;ENCOL(APILARH(aa;b);3);d;INDICE(A:F;c;SECUENCIA(;6));APILARV(Ventas[#Encabezados];d))
Aceptamos, y, ya lo tenemos.
Lo siguiente es lo mismo, pero, invertir cada tres provincias.
En la celda H1, usamos LET, creamos una variable, usamos la funcion CONTARA, como argumento seleccionamos la columna de provincia.
=LET(aa;CONTARA(Ventas5[Provincia]);aa)
Nos devuelve 15.
Dividimos entre 3, que son la cantidad de provincias a invertir.
=LET(aa;CONTARA(Ventas5[Provincia])/3;aa)
Si tenemos mas filas, y, el resultado de la división en un numero decimal, podemos usar la funcion REDONDEAR.MENOS, como argumento numero es la funcion CONTARA, como argumento numero de decimales, ponemos 0.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas5[Provincia])/3;0);aa)
Seguimos teniendo el mismo resultado.
Creamos otra variable, usamos la funcion SECUENCIA, omitimos el argumento filas, como argumento columnas, ponemos la variable “a”, como argumento inicio, ponemos 2, ya que la primera provincia se encuentra en la fila 2, como argumento paso, ponemos 3.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas5[Provincia])/3;0);b;SECUENCIA(;aa;2;3);b)
Tenemos una matriz desbordada en horizontal con el numero de fila donde debemos de empezar a extraer.
Creamos otra variable, usamos la funcion REDUCE, como argumento valor inicial, ponemos 0, como argumento array, ponemos la variable “b”, como argumento funcion, ponemos LAMBDA, y, declaramos dos variables.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas5[Provincia])/3;0);b;SECUENCIA(;aa;2;3);c;REDUCE(0;b;LAMBDA(x;y
Como argumento calculo de LAMBDA, usamos APILARH, como argumento matriz1, ponemos la variable “x”, como argumento matriz2, usamos SECUENCIA, como argumento filas, ponemos la variable “y”, omitimos el argumento columnas, como argumento inicio, ponemos la variable “y”.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas5[Provincia])/3;0);b;SECUENCIA(;aa;2;3);c;REDUCE(0;b;LAMBDA(x;y;APILARH(x;SECUENCIA(3;;y))));c)
Tenemos una matriz desbordada de seis columnas, con los números de filas a rescatar.
La primera columna nos sobra, usamos la función EXCLUIR, como argumento matriz es la función REDUCE, omitimos el argumento filas, como argumento columnas, ponemos 1.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas5[Provincia])/3;0);b;SECUENCIA(;aa;2;3);c;EXCLUIR(REDUCE(0;b;LAMBDA(x;y;APILARH(x;SECUENCIA(3;;y))));;1);c)
Como debemos de invertir las provincias, los valores que tenemos debemos de ordenarlos de mayor a menor, para ello, dentro de REDUCE vamos a la funcion SECUENCIA, y, antes de SECUENCIA, usamos la funcion ORDENAR, como argumento matriz es la funcion SECUENCIA, omitimos el argumento ordenar índice, como argumento criterio ordenación, seleccionamos descendente.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas5[Provincia])/3;0);b;SECUENCIA(;aa;2;3);c;EXCLUIR(REDUCE(0;b;LAMBDA(x;y;APILARH(x;ORDENAR(SECUENCIA(3;;y);;-1))));;1);c)
Ya lo tenemos.
Creamos otra variable, y, transponemos la variable “c”.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas5[Provincia])/3;0);b;SECUENCIA(;aa;2;3);c;EXCLUIR(REDUCE(0;b;LAMBDA(x;y;APILARH(x;ORDENAR(SECUENCIA(3;;y);;-1))));;1);d;TRANSPONER(c );d)
Usamos ENCOL, y, como argumento es la funcion TRANSPONER.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas5[Provincia])/3;0);b;SECUENCIA(;aa;2;3);c;EXCLUIR(REDUCE(0;b;LAMBDA(x;y;APILARH(x;ORDENAR(SECUENCIA(3;;y);;-1))));;1);d;ENCOL(TRANSPONER(c ));d)
Ya tenemos los números de filas a rescatar.
Creamos otra variable, usamos la funcion INDICE, como argumento matriz, seleccionamos las columnas A:F, como argumento numero de fila, ponemos la variable “d”, como argumento número de columna, usamos SECUENCIA, omitimos el argumento filas, como argumento columnas, ponemos 6.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas56[Provincia])/3;0);b;SECUENCIA(;aa;2;3);c;EXCLUIR(REDUCE(0;b;LAMBDA(x;y;APILARH(x;ORDENAR(SECUENCIA(3;;y);;-1))));;1);d;ENCOL(TRANSPONER(c ));e;INDICE(A:F;d;SECUENCIA(;6));e)
Como argumento calculo de LET, usamos APILARV, como argumento matriz1, nos traemos el encabezado de la tabla, como argumento matri2, ponemos la variable “e”.
=LET(aa;REDONDEAR.MENOS(CONTARA(Ventas56[Provincia])/3;0);b;SECUENCIA(;aa;2;3);c;EXCLUIR(REDUCE(0;b;LAMBDA(x;y;APILARH(x;ORDENAR(SECUENCIA(3;;y);;-1))));;1);d;ENCOL(TRANSPONER(c ));e;INDICE(A:F;d;SECUENCIA(;6));APILARV(Ventas5[#Encabezados];e))
Aceptamos y ya lo tenemos.
Miguel Angel Franco
Comments