Dejar solo producto en minuscula
- Jaime Franco Jimenez

- 16 ago 2023
- 3 Min. de lectura
Actualizado: 17 ago 2023
Para el siguiente ejemplo, tenemos el modelo que suelo usar, pero, algo más corto.
El modelo esta en formato de rango.
Por error, en vez de introducir un solo producto, se ha introducido el mismo producto dos veces, uno en mayúsculas, y, otro en minúsculas.

Debemos de quedarnos con los productos en minúsculas, además, la primera letra debe de aparecer en mayúscula.
Vemos que el orden donde aparece el producto en minúsculas y mayúscula cambian de orden.
Lo podríamos resolver de una manera muy rápida, que es con la función TEXTOANTES, donde como argumento texto, ponemos la celda D2, como argumento delimitador, ponemos un espacio.
=TEXTOANTES(D2;" ")
Arrastramos, y, vemos que cuando hay un solo delimitador, la separación es correcta, pero, hay productos que tienen mas de un espacio, y, es ahí donde no lo hace bien.

Podemos usar el argumento numero de instancia, pero, no nos valdría para TV 32 pulgadas, nos devolvería TV 32.
La función TEXTODESPUES, tampoco nos valdría.
Pues, empecemos…
Tenemos que extraer cada carácter de la celda D2, cosa que ya hemos hecho en ejemplos anteriores, volvemos a usar LET, creamos una variable, ponemos la función EXTRAE, como argumento texto, seleccionamos la celda D2, como argumento posición inicial, ponemos la función SECUENCIA, como argumento filas, ponemos LARGO, y, como argumento seleccionamos la celda D2, como argumento numero de caracteres, ponemos 1, probamos variable.
=LET(a;EXTRAE(D2;SECUENCIA(LARGO(D2));1);a)
Tenemos una matriz desbordada en vertical con cada carácter de la celda D2.

Vamos a cambiar la celda D2 por la celda D9, que es la que tiene más espacios.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);a)

Creamos otra variable, usamos la función LARGO, y, como argumento ponemos la variable “a”.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;LARGO(a);b)
Tenemos una matriz desbordada con el valor 1 en cada celda, pues, sumamos la función LARGO.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SUMA(LARGO(a));b)
Nos devuelve 29.
Usamos la función SECUENCIA, como argumento filas, es la expresión anterior.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));b)
Tenemos una matriz desbordada desde el numero 1 al número 29.
He creado esta variable, porque necesitamos recuperar la fila, y, he usado la función FILA dentro de BYROW, y, devuelve un error.
El espacio en blanco le corresponde el código 32, pues, creamos otra variable, usamos la función CODIGO, y, como argumento ponemos la variable “a”.
=LET(a;EXTRAE(D2;SECUENCIA(LARGO(D2));1);b;SECUENCIA(SUMA(LARGO(a)));c;CODIGO(a);c)
Tenemos una matriz desbordada con el código ASCII de cada carácter.

Preguntamos si el resultado de la función CODIGO es igual a 32.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;CODIGO(a)=32;c)
Obtenemos VERDADERO donde el código es 32, y, FALSO donde no lo es.

Ponemos el doble signo negativo delante de la función CODIGO, pero primero, encerramos la expresión anterior entre paréntesis.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;--(CODIGO(a)=32);c)
Sumamos los resultados.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));c)
Nos devuelve 5.
Esta variable la vamos a usar para comprobar los espacios que hay en cada celda.
Creamos otra variable, usamos la función BYROW, como argumento array ponemos la variable “a”.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);bSUMA(LARGO(a));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;
Como argumento función, ponemos LAMBDA, creamos una variable que almacena el argumento array.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SUMA(LARGO(a));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x
Como argumento calculo de LAMBDA, ponemos el operador lógico O, como argumento valor logico1, ponemos la variable “x”, y, la igualamos al primer valor de la variable “a”, para ello, usamos INDICE, como argumento matriz es la variable “a”, como argumento numero de fila, ponemos 1, omitimos el argumento número de columna.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SUMA(LARGO(a));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1)
Como argumento valor lógico 2, seleccionamos el segundo valor de la variable “a”.
Cerramos paréntesis.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1);x=INDICE(a;2))));d)
Obtenemos una matriz desbordada con VERDADERO donde hay coincidencia, y, FALSO donde no la hay, podemos ver que las mismas letras se repiten dos veces.

Creamos otra variable, preguntamos si la variable “d” es igual a VERDADERO, que nos devuelva la variable “b”, y, restamos 2, que son los valores que hemos comparado, en caso contrario, que nos devuelva un texto en blanco.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1);x=INDICE(a;2))));e;SI(d;b-2;"");e)
Obtenemos cuatro números de filas, como estamos trabajando con dos valores, nos interesa el segundo valor mayor, que la ultima letra del primer producto, para ello, usamos la función K.ESIMO.MENOR, e, indicamos que nos devuelva el segundo valor mayor.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1);x=INDICE(a;2))));e;K.ESIMO.MAYOR(SI(d;b-2;"");2);e)
Nos devuelve 14, que son los caracteres para extraer desde la primera posición, pues, usamos la función SECUENCIA, como argumento filas es la expresión anterior.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1);x=INDICE(a;2))));e;SECUENCIA(K.ESIMO.MAYOR(SI(d;b-2;"");2));e)
Usamos INDICE, como argumento matriz es la variable “a”, como argumento numero de fila es la expresión anterior, omitimos el argumento número de columna.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1);x=INDICE(a;2))));e;INDICE(a;SECUENCIA(K.ESIMO.MAYOR(SI(d;b-2;"");2)));e)
Vemos que tenemos el primer producto.

Usamos la función UNIRCADENAS, como argumento delimitador ponemos dobles comillas dobles, ignoramos celdas vacías, y, como argumento texto1, es la expresión anterior.
=LET(a;EXTRAE(D9;SECUENCIA(LARGO(D9));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1);x=INDICE(a;2))));e;UNIRCADENAS("";VERDADERO;INDICE(a;SECUENCIA(K.ESIMO.MAYOR(SI(d;b-2;"");2))));e)
Tenemos el nombre del producto en una sola celda.
Cambiamos D9 por D2, y, arrastramos.
Vemos que solo aparecen correctos, aquellos productos que tienen más de un espacio.

Vamos a crear otra variable, preguntamos si la variable “c”, que es la variable que creamos para controlas los espacios, es mayor a 1, que ponga la variable “e”, en caso contrario, usamos la función TEXTOANTES, como argumento texto es la celda D2, como argumento delimitador, ponemos un espacio.
=LET(a;EXTRAE(D2;SECUENCIA(LARGO(D2));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1);x=INDICE(a;2))));e;UNIRCADENAS("";VERDADERO;INDICE(a;SECUENCIA(K.ESIMO.MAYOR(SI(d;b-2;"");2))));f;SI(c>1;e;TEXTOANTES(D2;" "));f)
Vemos que el primer producto es correcto.
Arrastramos y todos los productos son correctos.

Nos queda añadir el modelo, excepto la columna producto, y, poner la primera letra en mayúscula, pues, como argumento calculo de LET, usamos la función APILARH, como argumento matriz1, seleccionamos el rango A2:C2, como argumento matriz2, ponemos la función NOMPROPIO, como argumento ponemos la variable “f”, como argumento matriz3, seleccionamos el rango E2:G2.
=LET(a;EXTRAE(D2;SECUENCIA(LARGO(D2));1);b;SECUENCIA(SUMA(LARGO(a)));c;SUMA(--(CODIGO(a)=32));d;BYROW(a;LAMBDA(x;O(x=INDICE(a;1);x=INDICE(a;2))));e;UNIRCADENAS("";VERDADERO;INDICE(a;SECUENCIA(K.ESIMO.MAYOR(SI(d;b-2;"");2))));f;SI(c>1;e;TEXTOANTES(D2;" "));APILARH(A2:C2;NOMPROPIO(f);E2:G2))
Arrastramos, y, ya lo tenemos.

Copiamos el encabezado, y, copiamos el formato del modelo.

Miguel Angel Franco




Comentarios