Rellenar con valor de izquierda
- Jaime Franco Jimenez

- 16 ago 2023
- 3 Min. de lectura
Tenemos los siguientes datos, hemos realizado un ejemplo parecido, pero, con fechas, pero en este ejemplo tenemos algunas variables más, y, lo he visto interesante.

Nos solicitan rellenar la cuadricula con el valor inmediato que no está en blanco a la izquierda.
En la primera línea (A2:F2) tenemos dos blancos, ninguno de los blancos corresponde a la primera celda (A2).

El primer blanco debe de ser relleno con 493, y, el segundo blanco debe de ser relleno con 418.
Como en otros ejemplos, usaremos LET para ir dividiendo los pasos.
En la celda H2, creamos una variable, y, traemos el rango A2:F2.
Probamos variable.
=LET(a;TRANSPONER(A2:F2);a)

Debemos tener en cuenta, que la primera celda del rango puede ser blanco, por lo que vamos a atajar primero esta incidencia.
Si la primera celda es blanco, debe de ser rellena con la celda de la derecha, no con la de la izquierda, sino es la primera celda la que está en blanco, debe de ser rellena con la celda de la izquierda.
Creamos otra variable, preguntamos si el primer valor de la variable “a” es igual a cero.
=LET(a;TRANSPONER(A2:F2);b;SI(INDICE(a;1)=0
En ese caso, usamos la función APILARV, como argumento matriz1, usamos la función INDICE, como argumento matriz, ponemos la variable “a”, como argumento número de fila, ponemos 2, omitimos el argumento número de columna, es decir, si la primera celda es blanco, va a poner el valor de la celda siguiente de la derecha.
Como argumento matriz2, volvemos a poner INDICE, como argumento matriz, es la variable “a”, como argumento número de fila, usamos la función SECUENCIA, como argumento filas, ponemos 5, que son los valores para rescatar, excepto, el primer valor, omitimos el argumento columnas, como argumento inicio, ponemos 2, como argumento paso, ponemos 1.
Cambiamos A2:F2 por A4:F4, que es donde la primera celda es vacía.
Cerramos paréntesis.
Probamos variable.
=LET(a;TRANSPONER(A4:F4);b;SI(INDICE(a;1)=0;APILARV(INDICE(a;2);INDICE(a;SECUENCIA(5;;2;1)));a);b)
Vemos como ahora el primer valor es el valor de la derecha, el resto de los ceros continúan.

Cambiamos, de nuevo, A2:F4 por A2:F2.
Vamos a crear otra variable, donde vamos a usar la función SCAN, como argumento valor inicial, ponemos cero, como argumento array, ponemos la variable “b”.
=LET(a;TRANSPONER(A2:F2);b;SI(INDICE(a;1)=0;APILARV(INDICE(a;2);INDICE(a;SECUENCIA(5;;2;1)));a);c;SCAN(0;a
Como argumento función, ponemos LAMBDA, creamos dos variables, la primera variable empieza valiendo cero, la segunda variable contiene la variable “a”, como argumento calculo, sumamos la variable “a” más la variable “b”.
Probamos variable.
=LET(a;TRANSPONER(A2:F2);b;SI(INDICE(a;1)=0;APILARV(INDICE(a;2);INDICE(a;SECUENCIA(5;;2;1)));a);c;SCAN(0;a;LAMBDA(x;y;x+y));d)
Tenemos un acumulado, donde vemos que hay valores que se repiten.

La primera cantidad sale de sumar la variable “a” que entra valiendo cero, más la primera cantidad de la variable “b”, es decir, 0+930 = 930.
Ahora, la variable “a” vale 930, y, la variable “b”, vale el segundo valor, 493, entonces, 930+493 = 1423.
Así con el resto de las cantidades.

Creamos otra variable, usamos BUSCARX, como argumento valor buscado, es la variable “c”, como argumento matriz de búsqueda, es la variable “c”, como argumento matriz devuelta, es la variable “b”, probamos variable.
=LET(a;TRANSPONER(A2:F2);b;SI(INDICE(a;1)=0;APILARV(INDICE(a;2);INDICE(a;SECUENCIA(5;;2;1)));a);c;SCAN(0;a;LAMBDA(x;y;x+y));d;BUSCARX(c;c;b);d)
Transponemos.
=LET(a;TRANSPONER(A2:F2);b;SI(INDICE(a;1)=0;APILARV(INDICE(a;2);INDICE(a;SECUENCIA(5;;2;1)));a);c;SCAN(0;a;LAMBDA(x;y;x+y));d;TRANSPONER(BUSCARX(c;c;b));d)
Vemos que la primera fila, ya está corregida.

Arrastramos.
Vemos todos los valores corregidos, excepto, la fila donde tenemos tres celdas vacías consecutivas, siendo vacía, la primera celda.

La expresión que vamos a usar la realizare en una celda aparte, después, la agregamos a la expresión inicial.
Una de las cosas que debemos de calcular es la primera columna disponible, que es la que tenemos que repetir.
Vamos a trabajar con la fila 7, que es donde tenemos el problema.
Volvemos a usar la función SCAN, como argumento valor inicial, ponemos 0, como argumento array, ponemos el rango A7:F7, como argumento función, ponemos LAMBDA, declaramos dos variables, y, sumamos ambas variables.
=SCAN(0;A7:F7;LAMBDA(a;b;a+b))
Volvemos a obtener un acumulado.

Preguntamos si el resultado de SCAN es diferente a cero, que nos devuelva las columnas del rango A7:F7, en caso contrario, que devuelva un texto en blanco.
=SI(SCAN(0;A7:F7;LAMBDA(a;b;a+b))<>0;COLUMNA(A7:F7);"")
Ahora, nos vamos a quedar con el valor mínimo, para ello, usamos la función K.ESIMO.MENOR.
=K.ESIMO.MENOR(SI(SCAN(0;A7:F7;LAMBDA(a;b;a+b))<>0;COLUMNA(A7:F7);"");1)
Nos devuelve 4.
Con la función INDICE rescatamos el valor de la columna 4 del rango A7:F7, como argumento matriz, es el rango A7:F7, como argumento número de fila, ponemos 1, o, lo omitimos, como argumento número de columna, es la función K.ESIMO.MENOR.
=INDICE(A7:F7;;K.ESIMO.MENOR(SI(SCAN(0;A7:F7;LAMBDA(a;b;a+b))<>0;COLUMNA(A7:F7);"");1))
Obtenemos el valor de 482, que es el que debemos de repetir.
Ahora, preguntamos que si es blanco el rango A7:F7, en ese caso, que ejecute la función INDICE, en caso contrario, que nos el rango A7:F7.
=SI(ESBLANCO(A7:F7);INDICE(A7:F7;;K.ESIMO.MENOR(SI(SCAN(0;A7:F7;LAMBDA(a;b;a+b))<>0;COLUMNA(A7:F7);"");1));A7:F7)
Aceptamos, y, vemos como tenemos rellenada la fila correctamente.

Cambiamos A7:F7, por, A2:F2.
Volvemos a la primera expresión, al argumento cálculo de LET, preguntamos si la primera celda de la variable “d” es igual a 0, en ese caso, pegamos la expresión que hemos creado, en caso contrario, que devuelva la variable “d”.
=LET(a;TRANSPONER(A2:F2);b;SI(INDICE(a;1)=0;APILARV(INDICE(a;2);INDICE(a;SECUENCIA(5;;2;1)));a);c;SCAN(0;a;LAMBDA(x;y;x+y));d;TRANSPONER(BUSCARX(c;c;b));SI(INDICE(d;1)=0;SI(ESBLANCO(A2:F2);INDICE(A2:F2;;K.ESIMO.MENOR(SI(SCAN(0;A2:F2;LAMBDA(a;b;a+b))<>0;COLUMNA(A2:F2);"");1));A2:F2);d))
Arrastramos, y, ya lo tenemos.

Miguel Angel Franco




Comentarios