Completar secuencia
- Jaime Franco Jimenez

- 15 nov 2023
- 4 Min. de lectura
Tenemos los siguientes datos:
Vemos que, en cada cadena, tenemos una “x” o mas de una, debemos de sustituir la “x” o las “x” por el valor que le sigue, por ejemplo, para la primera cadena, vemos que hay un salto de 2, quiere decir que el numero que falta es el 5.
Empecemos…
En la celda B2, usamos LET, creamos una variable, usamos la funcion DIVIDIRTEXTO, como argumento texto, seleccionamos la celda A2, como argumento delimitador de columna, entre comillas dobles, ponemos coma, probamos variable.
=LET(a;DIVIDIRTEXTO(A2;",");a)
Obtenemos una matriz desbordada en horizontal donde en cada celda tenemos cada valor de la celda A2.
Si arrastramos tenemos cada valor de cada cadena.
Antes de DIVIDIRTEXTO, usamos la funcion CONTARA.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));a)
Tenemos la longitud de la cadena de la celda A2, que es 5.
Creamos otra variable, volvemos a usar la funcion DIVIDIRTEXTO, usamos los mismos argumentos que para la variable “a”.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;DIVIDIRTEXTO(A2;",");b)
Volvemos a obtener cada carácter de la celda A2 en celdas.
Vemos que hay espacios de más, pues, antes de DIVIDIRTEXTO, ponemos la función ESPACIOS.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));b)
Ya tenemos la cadena sin espacios de más.
Creamos otra variable, usamos el condicional SI, como argumento prueba lógica, preguntamos si la variable “b” es igual a “x”, como argumento valor si verdadero, ponemos un error, como argumento valor si falso, ponemos la variable “b”.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;SI(b="x";NOD();b);c)
Obtenemos cada valor de la celda A2, y, error donde había “x”.
Usamos la funcion ENFILA, e, ignoramos blancos y errores.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;ENFILA(SI(b="x";NOD();b);3);c)
Tenemos solo los valores.
Vemos que están alineados a la izquierda, quiere decir que estañen formato de texto, pues, multiplicamos por 1, para, pasarlo a formato de número.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;ENFILA(SI(b="x";NOD();b);3)*1;c)
Nos vamos a quedar con los dos valores mayores, para ello, usamos la funcion K.ESIMO.MAYOR, como argumento matriz, es la funcion ENFILA, como argumento K, usamos una constante de matriz, ponemos los números 1 y 2, separados por la barra inclinada.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});c)
Tenemos los dos valores mayores de la celda A2.
Creamos otra variable, vamos a restar ambos números, para ello, usamos la funcion TOMAR, como argumento matriz, ponemos la variable “c”, omitimos el argumento filas, como argumento columnas, ponemos 1, ponemos el signo de menos, volvemos a poner la funcion TOMAR, como argumento matriz, ponemos la variable “c”, omitimos el argumento filas, como argumento columnas, ponemos -1.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);d)
Nos devuelve 2, que es el paso.
Creamos otra variable, usamos la funcion IZQUIERDA, como argumento texto, seleccionamos la celda A2, como argumento numero de caracteres, ponemos 2.
Ponemos 2 como argumento numero de caracteres, porque hay cadenas que tienen dos caracteres.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;IZQUIERDA(A2;2);inicio)
Nos devuelve.
Multiplicamos por 1.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;IZQUIERDA(A2;2)*1;inicio)
Vemos como nos ha devuelto solo el número 1 en formato de número.
Arrastramos, y, tenemos los primeros valores de cada cadena, y, error donde el primer valor es “x”.
Usamos la funcion SI.ERROR antes de la funcion IZQUIERDA, como argumento valor es la funcion IZQUIERDA, como argumento valor si error, usamos la funcion INDICE, donde vamos a solicitar la cadena que sigue a la letra “x” y dividimos por 2, para ello, como argumento matriz, ponemos la variable “b”, omitimos el argumento numero de fila, como argumento numero de columna ponemos 2, y, dividimos entre 2.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;SI.ERROR(IZQUIERDA(A2;2)*1;INDICE(b;;2)/2);inicio)
Aceptamos, arrastramos, y, podemos ver que donde aparece la letra “x”, aparece el siguiente valor dividido entre 2.
Creamos otra variable, usamos el condicional SI, como argumento prueba lógica, usamos la funcion IZQUIERDA, como argumento texto, seleccionamos la celda A2, omitimos el argumento numero de caracteres, e, igualamos a la letra “x”.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;SI.ERROR(IZQUIERDA(A2;2)*1;INDICE(b;;2)/2);f;SI(IZQUIERDA(A2)="x"
Como argumento valor si verdadero, usamos la funcion SECUENCIA, omitimos el argumento filas, como argumento columnas, usamos la funcion MAX, como argumento ponemos la variable “a”, como argumento inicio, volvemos a poner MAX, como argumento ponemos la variable “inicio”, como argumento paso, ponemos MAX y la variable “inicio”.
La variable “a” nos devuelve 5.
La variable “inicio”, nos devuelve nos devuelve 1, que es el primer valor de la celda A2, esta variable la creamos para comprobar si la primera posición de cada cadena nos devolvía un error, que nos diera el siguiente valor dividido entre 2.
Entonces, la funcion SECUENCIA, nos devuelve una matriz de cinco columnas, empezando desde el numero 1 con un paso de 1, pero, siempre que la primera posición de cada cadena sea igual a “x”.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;SI.ERROR(IZQUIERDA(A2;2)*1;INDICE(b;;2)/2);f;SI(IZQUIERDA(A2)="x";SECUENCIA(;MAX(a);MAX(inicio);MAX(inicio))
¿Por qué uso la funcion MAX?
Si ponemos solo el nombre de la variable, la funcion SECUENCIA no la reconoce, pero, con la funcion MAX, que nos devuelve el valor máximo de una cadena, si la reconoce, por lo que la funcion SECUENCIA, si nos devuelve los valores correctos.
Seguimos…
Como argumento valor si falso, volvemos a usar SECUENCIA, omitimos el argumento filas, como argumento columnas, usamos MAX como argumento ponemos la variable “a”, como argumento inicio, ponemos MAX, como argumento ponemos la variable “inicio”, como argumento paso, ponemos la variable “d”.
Con esta expresión, si el argumento prueba lógica no se cumple, nos devuelve una matriz en horizontal, de cinco columnas, empezando desde el numero 1 con un paso de 2.
Para la primera cadena, no se cumple el argumento prueba lógica, por los que nos devuelve una matriz en horizontal, de cinco columnas, empezando desde el numero 1 con un paso de 2.
Arrastramos, y, podemos ver como tenemos los inicios correctos, igual que el salto.
Creamos otra variable, usamos la funcion ENCONTRAR, como argumento texto buscado, ponemos la variable “f”, como argumento dentro del texto, ponemos la variable “b”.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;SI.ERROR(IZQUIERDA(A2;2)*1;INDICE(b;;2)/2);f;SI(IZQUIERDA(A2)="x";SECUENCIA(;MAX(a);MAX(inicio);MAX(inicio));SECUENCIA(;MAX(a);MAX(inicio);MAX(d)));g;ENCONTRAR(f;b);g)
Obtenemos 1 donde hay coincidencia, y, error donde no la hay.
El error es lo que nos interesa porque es el valor o valores que faltan en cada cadena.
Usamos la funcion ESERROR, como argumento es la funcion ENCONTRAR.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;SI.ERROR(IZQUIERDA(A2;2)*1;INDICE(b;;2)/2);f;SI(IZQUIERDA(A2)="x";SECUENCIA(;MAX(a);MAX(inicio);MAX(inicio));SECUENCIA(;MAX(a);MAX(inicio);MAX(d)));g;ESERROR(ENCONTRAR(f;b));g)
Obtenemos FALSO donde no es error, y, VERDADERO donde es error.
Preguntamos que, si la funcion ESERROR nos devuelve VERDADERO, que nos devuelva la variable “f”, en caso contrario, que devuelva blanco.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;SI.ERROR(IZQUIERDA(A2;2)*1;INDICE(b;;2)/2);f;SI(IZQUIERDA(A2)="x";SECUENCIA(;MAX(a);MAX(inicio);MAX(inicio));SECUENCIA(;MAX(a);MAX(inicio);MAX(d)));g;SI(ESERROR(ENCONTRAR(f;b));f;"");g)
Vemos que nos devuelve el valor faltante.
Usamos la funcion UNIRCADENAS, como argumento delimitador, entre comillas dobles, ponemos comas, ignoramos celdas vacías, como argumento texto1, es el condicional SI.
=LET(a;CONTARA(DIVIDIRTEXTO(A2;","));b;ESPACIOS(DIVIDIRTEXTO(A2;","));c;K.ESIMO.MAYOR(ENFILA(SI(b="x";NOD();b);3)*1;{1\2});d;TOMAR(c;;1)-TOMAR(c;;-1);inicio;SI.ERROR(IZQUIERDA(A2;2)*1;INDICE(b;;2)/2);f;SI(IZQUIERDA(A2)="x";SECUENCIA(;MAX(a);MAX(inicio);MAX(inicio));SECUENCIA(;MAX(a);MAX(inicio);MAX(d)));g;UNIRCADENAS(",";VERDADERO;SI(ESERROR(ENCONTRAR(f;b));f;""));g)
Aceptamos, arrastramos, y, ya lo tenemos.
Miguel Angel Franco





















Comentarios