Valor dentro de grupo
- Jaime Franco Jimenez

- 22 feb 2024
- 3 Min. de lectura
Para el siguiente ejemplo, tenemos dos columnas, en la primera de ellas tenemos un grupo, y, en la segunda de ellas, un código.
Debemos de registrar el valor dentro de un grupo si el valor cambia, pero, si para un grupo ningún valor se repite, debemos de excluir el primer valor.
Empecemos…
En la celda E2, usamos LET, creamos una variable, transponemos los valores únicos del rango A2:A31 (Grupos), para ello, usamos la funcion TRANSPONER, como argumento usamos la funcion UNICOS, como argumento matriz, seleccionamos el rango A2:A31.
=LET(xx;TRANSPONER(UNICOS(A2:A31));xx)
Tenemos en horizontal los grupos únicos.
Creamos otra variable, usamos la funcion REDUCE, como valor inicial, ponemos blanco, como argumento array, ponemos la variable “xx”, como argumento funcion, ponemos LAMBDA, y, declaramos dos variables.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;REDUCE("";xx;LAMBDA(x;y
Como argumento cálculo de LAMBDA, usamos la funcion APILARH, como argumento matriz1, ponemos la variable “x”, como argumento matriz2, usamos la funcion FILTRAR, como argumento array, seleccionamos el rango B2:B31, como argumento Include, seleccionamos el rango A2:A31 e igualamos a la variable “y”.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));a)
Tenemos una matriz desbordada de 11 columnas y tres filas, donde en cada columna, tenemos los códigos de cada grupo.
La primera columna está de más, usamos la funcion EXCLUIR antes de la funcion REDUCE, como argumento matriz es la funcion REDUCE, omitimos el argumento filas, como argumento columnas, ponemos 1.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);a)
Creamos otra variable, y, transponemos la variable “a”.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);b)
Creamos otra variable, usamos la funcion SCAN, omitimos el argumento valor inicial, como argumento array, ponemos la variable “b”, como argumento funcion, ponemos LAMBDA, y, declaramos dos variables.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);c;SCAN(;b;LAMBDA(x;y
Como argumento cálculo de LAMBDA, usamos el condicional SI, como argumento prueba lógica, preguntamos si la variable “y” es igual a la variable “x”, como argumento valor si verdadero, ponemos blanco, como argumento valor si falso, ponemos la variable “y”.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);c;SCAN(;b;LAMBDA(x;y;SI(y=x;"";y)));c)
Con esta expresión, hemos conseguido quitar duplicados.
Como si los códigos de un grupo no se repiten, debemos de excluir el primer código, vamos a excluir la primera columna, si nos fijamos en el modelo, el primer valor para los grupos 1,2,3,4,5,7,8,9, y, 10 son 22-AP, para el código 6, los códigos son 22-UY, 22-RT, y, 22-RT, donde se repite el código 22-RT, quiere decir que es el código que cambia, por eso, vamos a excluir la primera columna, para ello, antes de SCAN, usamos EXCUIR, como argumento matriz, es la funcion SCAN, omitimos el argumento filas, como argumento columnas, ponemos 1.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);c;EXCLUIR(SCAN(;b;LAMBDA(x;y;SI(y=x;"";y)));;1);c)
Antes de EXCLUIR, usamos la funcion APILARH, como argumento matriz1, , es la funcion EXCLUIR, como argumento matriz2 ponemos blanco.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);c;APILARH(EXCLUIR(SCAN(;b;LAMBDA(x;y;SI(y=x;"";y)));;1);" ");c)
Tenemos la misma matriz que la anterior, pero con una columna más, donde solo en la primera celda aparece en blanco, en el resto de las celdas aparece error.
Usamos la funcion SI.ERROR, como argumento valor es la funcion APILARH, como argumento valor si error, ponemos blanco.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);c;SI.ERROR(APILARH(EXCLUIR(SCAN(;b;LAMBDA(x;y;SI(y=x;"";y)));;1);" ");"");c)
Ahora, tenemos blanco en toda la columna.
Usamos ENCOL, como argumento es la funcion SI.ERROR.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);c;ENCOL(SI.ERROR(APILARH(EXCLUIR(SCAN(;b;LAMBDA(x;y;SI(y=x;"";y)));;1);" ");""));c)
Ya lo tenemos, pero, falta el primer espacio, para ello, como argumento calculo de LET, usamos la funcion APILARV, como argumento matriz1, ponemos blanco, como argumento matriz2, ponemos la variable “c”.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);c;ENCOL(SI.ERROR(APILARH(EXCLUIR(SCAN(;b;LAMBDA(x;y;SI(y=x;"";y)));;1);" ");""));APILARV("";c))
Aceptamos, lo tenemos, pero, tenemos una celda de más, por lo que volvemos a usar la funcion EXCLUIR, como argumento matriz, es la funcion APILARV, como argumento filas, ponemos -1.
=LET(xx;TRANSPONER(UNICOS(A2:A31));a;EXCLUIR(REDUCE("";xx;LAMBDA(x;y;APILARH(x;FILTRAR(B2:B31;A2:A31=y))));;1);b;TRANSPONER(a);c;ENCOL(SI.ERROR(APILARH(EXCLUIR(SCAN(;b;LAMBDA(x;y;SI(y=x;"";y)));;1);" ");""));EXCLUIR(APILARV("";c);-1))
Ahora si lo tenemos.
Miguel Angel Franco















Comentarios