top of page

Columnas no coincidentes

Tenemos los siguientes datos:

















Debemos de crear un informe, y, de la columna nombre a la columna Estado, deben de aparecer las columnas que no son coincidentes, las dos primeras columnas no las tendremos en cuenta.

















Cada dos filas pertenecen al mismo Id de empleado, por ejemplo, las dos primeras filas son:
















Pertenecen al id de empleado 167210, donde vemos que las columnas de, del primer id empleado son las mismas que las columnas del segundo id de empleado, en este caso, deben de aparecer en el informe estos id de empleados, pero sin datos, porque no hay columnas no coincidentes.


Empecemos…


En la celda K2, usamos LET, creamos una variable, usamos BYROW, como argumento array, ponemos el doble signo igual, ponemos la función IGUAL, como argumento texto1, seleccionamos el rango C2:H19, como argumento texto2, seleccionamos el rango C2:H19, con esta expresión vamos a comparar cada valor del rango C2:H19, con cada valor, pero a partir del siguiente valor de C2, es decir, va a comparar C2 con C3, C3 con C4, C4 con C5, y, así con el resto de celdas, si probamos la función IGUAL en una celda, tenemos una matriz desbordada con 1 donde el valor es el mismo en ambas filas, y, 0 donde no lo es.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19)


















Como argumento función, ponemos LAMBDA, creamos una variable, sumamos dicha variable, y, probamos variable.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));a)


Tenemos una matriz desbordada con la suma de los unos y ceros, excepto, en la última celda que tenemos un error, porque no hay valores que comparar.



















Estamos trabajando con seis columnas, quiere decir que el valor 6, indica que todos los resultados eran 1, es decir, VERDADERO, quiere decir que ambas filas son iguales, el resultado de cero, quiere decir que todos los resultados son ceros, o, FALSO, quiere decir que ninguna celda es igual a la fila siguiente, entonces, nos interesan loa valores que no sean ni 6 ni 0, quiere decir que hay columnas indistintas.


Creamos otra variable, usamos el condicional SI, como argumento prueba lógica, ponemos la variable “a”, y, comparamos con indistinto a cero, como argumento valor si verdadero, ponemos otro condicional SI, como argumento prueba lógica, volvemos a poner la variable “a”, y comparamos con indistinto a 6.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;SI(a<>0;SI(a<>6


Como argumento valor si verdadero del segundo SI, volvemos a poner el doble signo negativo, y, la función IGUAL, como argumento valor si falso, ponemos un texto en blanco.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;SI(a<>0;SI(a<>6;--IGUAL(C2:H19;C3:H19);""));b)


Tenemos una matriz desbordada con FALSO donde no hay coincidencia en ninguna fila, 1, donde hay coincidencia, y, 0 donde no hay coincidencia.


















Nos interesan los valores ceros.


Preguntamos si el resultado de la expresión anterior es igual a cero, en ese caso, que nos devuelva los encabezados, en caso contrario, que devuelva blanco.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;SI(SI(a<>0;SI(a<>6;--IGUAL(C2:H19;C3:H19);""))=0;C1:H1;"");b)


Obtenemos una matriz desbordada con el encabezado que es indistinto, y, blanco donde no lo es.



















Ahora, usamos UNIRCADENAS, pero debemos de aplicar dicha función a cada fila, por lo que volvemos a usar BYROW, como argumento array, es la expresión anterior.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;BYROW(SI(SI(a<>0;SI(a<>6;--IGUAL(C2:H19;C3:H19);""))=0;C1:H1;"")


Como argumento función, ponemos LAMBDA, creamos una variable, ponemos UNIRCADENAS, como argumento delimitador, entre comillas dobles, ponemos coma, ignoramos celdas vacías, como argumento texto1, ponemos la variable “x”.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;BYROW(SI(SI(a<>0;SI(a<>6;--IGUAL(C2:H19;C3:H19);""))=0;C1:H1;"");LAMBDA(x;UNIRCADENAS(",";VERDADERO;x)));b)


Aceptamos, y, ya tenemos unidos los encabezados no coincidentes separados por coma.




















Claro, pero como los id de empleados aparecen dos veces, estos resultados deben de aparecer por dos veces, para ello, creamos otra variable, usamos el condicional SI, preguntamos si la variable “b” es igual a blanco, en ese caso, ponemos APILARV, como argumento matriz1, seleccionamos la celda encima de la primera celda desbordada, como argumento matriz2, usamos INDICE, como argumento matriz, ponemos la variable “b”, como argumento número de fila, debemos de imprimir todos los valores, excepto, el ultimo, usamos SECUENCIA, como argumento filas, ponemos 17, pues, son 18 filas las que tenemos, Si no usamos APILARV, y, como matriz1, seleccionamos la celda de encima, entonces, nos devolverá los valores correspondientes, pero no para el mismo id de empleado, sino, para el mismo id de empleado, y, el id de empleado que se encuentra encima de él, que no es el mismo.


Probamos variable.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;BYROW(SI(SI(a<>0;SI(a<>6;--IGUAL(C2:H19;C3:H19);""))=0;C1:H1;"");LAMBDA(x;UNIRCADENAS(",";VERDADERO;x)));c;SI(b="";APILARV(C21;INDICE(b;SECUENCIA(17)));b);c)


Y vemos que aparecen los mismos datos cada dos filas.





















Vamos a quitar el cero que aparece en la primera celda, para ello, vamos a usar SUSTITUIR, como argumento texto es la expresión anterior, como argumento texto original, ponemos cero, como argumento texto nuevo, ponemos dobles comillas dobles.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;BYROW(SI(SI(a<>0;SI(a<>6;--IGUAL(C2:H19;C3:H19);""))=0;C1:H1;"");LAMBDA(x;UNIRCADENAS(",";VERDADERO;x)));c;SUSTITUIR(SI(b="";APILARV(C21;INDICE(b;SECUENCIA(17)));b);0;"");c)




















Como argumento cálculo de LET, usamos APILARH, como argumento matriz1, seleccionamos los id de empleados, como argumento matriz2, ponemos la variable “c”.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;BYROW(SI(SI(a<>0;SI(a<>6;--IGUAL(C2:H19;C3:H19);""))=0;C1:H1;"");LAMBDA(x;UNIRCADENAS(",";VERDADERO;x)));c;SUSTITUIR(SI(b="";APILARV(C21;INDICE(b;SECUENCIA(17)));b);0;"");APILARH(B2:B19;c))


Aceptamos y ya lo tenemos.
























Pero, en la última celda seguimos teniendo un error, y, debe de aparecer el valor que se encuentra encima de él, para ello, vamos a asignar una variable a la expresión anterior, usamos el condicional SI, como argumento prueba lógica, ponemos la función ESERROR, como argumento usamos INDICE, como argumento matriz, ponemos la variable “d”, como argumento número de fila, ponemos la función FILAS, como argumento usamos INDICE, como argumento matriz, ponemos la variable “d”, como argumento número de fila, omitimos el argumento número de fila, como argumento número de columna, ponemos la función SECUENCIA, ignoramos el argumento filas, como argumento columnas, ponemos 2, es decir, estamos preguntando si algún valor de la columna 2 es error.


Como argumento valor si falso, ponemos la variable “d”.


=LET(a;BYROW(--IGUAL(C2:H19;C3:H19);LAMBDA(x;SUMA(x)));b;BYROW(SI(SI(a<>0;SI(a<>6;--IGUAL(C2:H19;C3:H19);""))=0;C1:H1;"");LAMBDA(x;UNIRCADENAS(",";VERDADERO;x)));c;SUSTITUIR(SI(b="";APILARV(C21;INDICE(b;SECUENCIA(17)));b);0;"");d;APILARH(B2:B19;c);e;SI(ESERROR(INDICE(d;;2));INDICE(d;FILAS(INDICE(d;;2))-1;SECUENCIA(;2));d);e)


Aceptamos, y, ahora si lo tenemos.





















Miguel Angel Franco

 
 
 

Comentarios


© 2019 Miguel Ángel Franco García

bottom of page