Primer y segundo carácter
- Jaime Franco Jimenez

- 28 jun 2023
- 4 Min. de lectura
Vamos por el primer y segundo carácter empezando por la derecha.

Dependiendo del número que sea, por ejemplo, si ponemos 11, nos debe de devolver Once, pero si ponemos 31, debe de poner Treinta y Uno, por lo que debemos de controlar el valor introducido.
Ya tenemos la expresión donde extraemos el ultimo carácter por la derecha, y, lo tenemos convertido en texto, siendo la siguiente expresión:
ABS(EXTRAE(B1;CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1));1))
Para el primer carácter por la derecha, debemos de quedarnos con la ultima posición, por eso, hacemos uso de la función CONTARA, que cuenta el numero de caracteres de la secuencia de caracteres de la celda B1.
Para extraer el segundo número por la derecha, debemos de quedarnos de las posiciones del valor de la celda B1, con el segundo valor mayor, con la siguiente expresión, obtenemos la posición de cada carácter del valor de la celda B1.
SECUENCIA(LARGO(B1))

Debemos de quedarnos con el segundo valor mas grande, para ello, vamos a usar la función K.ESIMO.MAYOR, como argumento matriz, es la expresión anterior, como argumento “K” ponemos el numero 2, es decir, el segundo valor mayor, cerramos paréntesis.
=K.ESIMO.MAYOR(SECUENCIA(LARGO(B1));2)
Obtenemos el valor 4, que es la posición que debemos de recuperar del valor de la celda B1.
Usamos EXTRAE como argumento texto, es la celda B1.
=EXTRAE(B1
Como argumento posición inicial, es la expresión anterior.
=EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(LARGO(B1));2)
Como argumento numero de caracteres, ponemos 1, cerramos paréntesis.
=EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(LARGO(B1));2);1)
Aceptamos, y, vemos que obtenemos el segundo valor por la derecha.
Ahora, vamos a crear la expresión que vamos a usar para que nos devuelva dicho valor en texto.
En la celda B6, ponemos LET, creamos una variable que la voy a llamar pri_car, donde almacenamos la expresión donde hemos extraído el primer carácter.
=LET(pri_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));1);1))
Creamos otra variable, la voy a llamar seg_car, donde almacenamos la expresión que acabamos de crear para obtener el segundo carácter.
=LET(pri_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));1);1));seg_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(LARGO(B1));2);1))
La primera pregunta va a ser si el segundo carácter por la derecha es igual a 1, y, el primer carácter por la derecha es diferente a cero, es decir, un numero entre 11 y 19.
Como argumento cálculo de LET, preguntamos si seg_car es igual a 1, y, pri_car es diferente a cero, por lo que usamos el operador lógico Y, estamos preguntando por un numero entre 11 y 19.
=LET(pri_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));1);1));seg_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(LARGO(B1));2);1));SI(Y(seg_car=1;pri_car<>0)
Como argumento valor si verdadero, usamos la función BUSCARX, como argumento valor buscado concatenamos seg_car con pri_car, y, lo encerramos en la función ABS, para que el valor nos lo devuelva en formato de número.
=LET(pri_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));1);1));seg_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(LARGO(B1));2);1));SI(Y(seg_car=1;pri_car<>0);BUSCARX(ABS(seg_car&pri_car);H11:H19;I11:I19;"")
Como argumento valor si falso, debemos de tener en cuenta que si el número es 20, debe de poner veinte, pero si es 23, debe de poner veinte, ponemos otro condicional SI, como argumento prueba lógica, preguntamos si seg_car es igual a 2, y, pri_car es diferente a 0, en este caso, no he usado el operador lógico Y, he encerrado cada condición entre paréntesis, y, como separación entra cada condición, he puesto el asterisco (*) que es igual que el operador lógico Y, en ese caso, como argumento valor si verdadero, ponemos entre comillas dobles “Veinti”.
=LET(pri_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));1);1));seg_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(LARGO(B1));2);1));SI(Y(seg_car=1;pri_car<>0);BUSCARX(ABS(seg_car&pri_car);H11:H19;I11:I19;"");SI((seg_car=2)*(pri_car<>0);"Veinti"
Como argumento valor si falso de este segundo SI, preguntamos si seg_car es igual a 2, y, pri_car es igual a cero, es decir, es el número 20, en ese caso, debe de poner “Veinte”.
=LET(pri_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));1);1));seg_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));2);1));SI(Y(seg_car=1;pri_car<>0);BUSCARX(ABS(seg_car&pri_car);H11:H19;I11:I19;"");SI((seg_car=2)*(pri_car<>0);"Veinti";SI((seg_car=2)*(pri_car=0);"Veinte"
Como argumento valor si falso de este tercer SI, preguntamos su seg_car es distinto a 2, en ese caso, usamos BUSCARX, donde como argumento valor buscado es la variable seg_car, como argumento matriz de búsqueda, seleccionamos el rango H1:H9, que son los números desde el 1 al 9, como argumento matriz devuelta, seleccionamos el rango K1:K9, que es el texto de diez a noventa.
Cerramos paréntesis de todos los SI y de LET.
=LET(pri_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));1);1));seg_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(SECUENCIA(LARGO(B1));2);1));SI(Y(seg_car=1;pri_car<>0);BUSCARX(ABS(seg_car&pri_car);H11:H19;I11:I19;"");SI((seg_car=2)*(pri_car<>0);"Veinti";SI((seg_car=2)*(pri_car=0);"Veinte";SI((seg_car<>2);BUSCARX(seg_car;H1:H9;K1:K9;"");"")))))
Aceptamos.
Vamos a poner el número 13, vemos que nos devuelve el valor en texto, pero también nos devuelve como texto el primer carácter, para este caso, solo debe de aparecer trece.

Volvemos a la expresión del primer carácter, donde hemos puesto el primer SI, antes de la función FILTRAR, preguntamos con el operador lógico Y, si el valor de la celda B1 es mayor o igual a 11, y, menor o igual a 19, en ese caso, que ponga un texto en blanco, en caso contrario, que ejecute la función FILTRAR.
=LET(a;ABS(EXTRAE(B1;CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1));1));SI(Y(B1>=11;B1<=19);"";FILTRAR(I1:I9;H1:H9=a)))
Aceptamos, y, vemos que ya no aparece el texto del primer carácter.

Ponemos el número 20, y, vemos como aparece Veinte.

Vamos a poner el número 25, vemos que tenemos los dos textos que necesitamos.

Si ponemos el número 40, vemos que, para el primer carácter, aparece un error, error devuelto por la función FILTRAR.

Pues vamos a la expresión, vamos a la función FILTRAR, y, en el argumento si vacío, ponemos un texto en blanco.
=LET(a;ABS(EXTRAE(B1;CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1));1));SI(Y(B1>=11;B1<=19);"";FILTRAR(I1:I9;H1:H9=a;"")))
Como he dicho anteriormente, todas las expresiones que creemos, después debemos de unirlas para que quede una única función.
Volvamos a fijarnos en la expresión:
=LET(a; SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));pri_car;ABS(EXTRAE(B1;K.ESIMO.MAYOR(a;1);1));seg_car;SI.ERROR(ABS(EXTRAE(B1;K.ESIMO.MAYOR(a;2);1));"");SI(Y(seg_car=1;pri_car<>0);BUSCARX(ABS(seg_car&pri_car);H11:H19;I11:I19;"");SI((seg_car=2)*(pri_car<>0);"Veinti";SI((seg_car=2)*(pri_car=0);"Veinte";SI((seg_car<>2);BUSCARX(seg_car;H1:H9;K1:K9;"");"")))))
Podríamos sustituir la expresión de la variable pri_car, por la función DERECHA.
=LET(a; SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));pri_car;ABS(DERECHA(B1));seg_car;ABS(IZQUIERDA(DERECHA(B1;2)));SI(Y(seg_car=1;pri_car<>0);BUSCARX(ABS(seg_car&pri_car);H11:H19;I11:I19;"");SI((seg_car=2)*(pri_car<>0);"Veinti";SI((seg_car=2)*(pri_car=0);"Veinte";SI((seg_car<>2);BUSCARX(seg_car;H1:H9;K1:K9;"");"")))))
Pero, con la función DERECHA como podemos quedarnos con el segundo carácter empezando por la derecha, si usamos la siguiente expresión, DERECHA(B1;2), nos devuelve dos caracteres por la derecha, no el segundo carácter, pero si usamos la función IZQUIERDA, como argumento texto, es la función DERECHA, y, omitimos el argumento número de caracteres, del resultado de la función DERECHA, nos devolverá el primer carácter por la izquierda que es lo que queremos.
=LET(a; SECUENCIA(CONTARA(EXTRAE(B1;SECUENCIA(LARGO(B1));1)));pri_car;ABS(DERECHA(B1));seg_car;ABS(IZQUIERDA(DERECHA(B1;2)));SI(Y(seg_car=1;pri_car<>0);BUSCARX(ABS(seg_car&pri_car);H11:H19;I11:I19;"");SI((seg_car=2)*(pri_car<>0);"Veinti";SI((seg_car=2)*(pri_car=0);"Veinte";SI((seg_car<>2);BUSCARX(seg_car;H1:H9;K1:K9;"");"")))))
Miguel Angel Franco




Comentarios