Para el siguiente ejemplo, tenemos una serie de palabras.
Debemos de crear un reporte, o, informe con las palabras que contengan todas las vocales.
Tenemos las vocales, y, el código ASCII que corresponde con cada vocal.
En la celda B2, usamos LET, creamos una variable, seleccionamos el rango A2:A10.
=LET(xx;A2:A10
Creamos otra variable, usamos la función EXTRAE, como argumento texto, nos traemos las cadenas en minúsculas, porque el código que tenemos de las vocales es en minúsculas.
=LET(xx;A2:A10;a;EXTRAE(MINUSC(xx)
Como argumento posición inicial, usamos la función SECUENCIA, omitimos el argumento filas, como argumento columnas, usamos la función MAX, como argumento numero1, ponemos la función LARGO, como argumento texto de LARGO, ponemos la variable “xx”, como argumento numero de caracteres, ponemos 1.
Probamos variable.
=LET(xx;A2:A10;a;EXTRAE(MINUSC(xx);SECUENCIA(;MAX(LARGO(xx)));1);a)
Vamos a tener cada carácter por separado de cada cadena.
Nos traemos el código obtenido con la función EXTRAE.
=LET(xx;A2:A10;a;CODIGO(EXTRAE(MINUSC(xx);SECUENCIA(;MAX(LARGO(xx)));1));a)
Vemos que donde no hay códigos que devolver muestra un error, pues, usamos la función SI.ERROR, como argumento valor, es la expresión anterior, como argumento valor si error, ponemos blanco.
=LET(xx;A2:A10;a;SI.ERROR(CODIGO(EXTRAE(MINUSC(xx);SECUENCIA(;MAX(LARGO(xx)));1));"");a)
Creamos otra variable, usamos la función MAP, como argumento array, ponemos la variable “a”, como argumento lambda, ponemos LAMBDA, declaramos una variable.
=LET(xx;A2:A10;a;SI.ERROR(CODIGO(EXTRAE(MINUSC(xx);SECUENCIA(;MAX(LARGO(xx)));1));"");b;MAP(a;LAMBDA(x
Como argumento calculo de LAMBDA, usamos el operador lógico O, como argumento valor logico1, peguntamos si la variable “x” es igual a 97 (a), como argumento valor logico2, preguntamos si la variable “x” es igual a 101 (e), como argumento valor logico3, preguntamos si la variable “x” es igual a 105 (i), como argumento valor logico4, preguntamos si la variable “x” es igual a 111 (o), como argumento valor logico5, preguntamos si la variable “x” es igual a 117(u).
Obtenemos una matriz desbordada con VERDADERO donde hay coincidencia, es decir, si uno de los caracteres es una vocal, y, FALSO donde no lo es.
Usamos el doble signo negativo antes de MAP, y, encerramos la función MAP entre paréntesis.
=LET(xx;A2:A10;a;SI.ERROR(CODIGO(EXTRAE(MINUSC(xx);SECUENCIA(;MAX(LARGO(xx)));1));"");b;--(MAP(a;LAMBDA(x;O(x=97;x=101;x=105;x=111;x=117))));b)
Obtenemos 1 donde es VERDADERO, y, 0 donde es FALSO.
Creamos otra variable, usamos la función BYROW, como argumento array, ponemos la variable “b”, como argumento función, ponemos LAMBDA, declaramos una variable, como argumento calculo de LAMBDA, sumamos la variable “x”.
=LET(xx;A2:A10;a;SI.ERROR(CODIGO(EXTRAE(MINUSC(xx);SECUENCIA(;MAX(LARGO(xx)));1));"");b;--(MAP(a;LAMBDA(x;O(x=97;x=101;x=105;x=111;x=117))));c;BYROW(b;LAMBDA(x;SUMA(x)));c)
Tenemos una matriz desbordada en vertical con la cantidad de vocales de cada cadena.
Si en una cadena una vocal aparece mas de una vez, cuenta como una.
Vamos a preguntar que, si el resultado de BYROW es mayor o igual a 5, que devuelva la variable “xx”, en caso contrario, que devuelva un error.
=LET(xx;A2:A10;a;SI.ERROR(CODIGO(EXTRAE(MINUSC(xx);SECUENCIA(;MAX(LARGO(xx)));1));"");b;--(MAP(a;LAMBDA(x;O(x=97;x=101;x=105;x=111;x=117))));c;SI(BYROW(b;LAMBDA(x;SUMA(x)))>=5;xx;NOD());c)
Ya tenemos las palabras que contienen todas las vocales, y, error donde no hay coincidencia.
Como argumento calculo de LET, usamos la función ENCOL, como argumento matriz, ponemos la variable “c”, y, como argumento ignorar, ponemos 3, es decir, ignorar blancos y errores.
=LET(xx;A2:A10;a;SI.ERROR(CODIGO(EXTRAE(MINUSC(xx);SECUENCIA(;MAX(LARGO(xx)));1));"");b;--(MAP(a;LAMBDA(x;O(x=97;x=101;x=105;x=111;x=117))));c;SI(BYROW(b;LAMBDA(x;SUMA(x)))>=5;xx;NOD());ENCOL(c;3))
Aceptamos, y, ya lo tenemos.
Veamos otra forma de hacerlo.
En la celda B7, usamos LET, creamos una variable, y, seleccionamos el rango A2:A10.
=LET(xx;A2:A10
Creamos otra variable, usamos la función EXTRAE, como argumento texto, ponemos la variable “xx”, como argumento posición inicial, usamos la función SECUENCIA, omitimos le argumento filas, como argumento columnas, usamos la función MAX, como argumento numero1, usamos la función LARGO, como argumento texto de LARGO, ponemos la variable “xx”, como argumento numero de caracteres, ponemos 1.
Probamos variable.
=LET(xx;A2:A10;a;EXTRAE(xx;SECUENCIA(;MAX(LARGO(xx)));1);a)
Igual que antes, vamos a tener cada carácter de cada cadena por separado.
Creamos otra variable, usamos la función REDUCE, como argumento valor inicial, ponemos blanco, como argumento array, seleccionamos el rango D1:H1, como función, ponemos LAMBDA, y, declaramos dos variables.
=LET(xx;A2:A10;a;EXTRAE(xx;SECUENCIA(;MAX(LARGO(xx)));1);b;REDUCE("";D1:H1;LAMBDA(x;y
Como argumento cálculo de LAMBDA, usamos la función APILARH, como argumento matriz1, ponemos la variable “x”, como argumento matriz2, usamos la función HALLAR, como argumento texto buscado, ponemos la variable “y”, como argumento dentro del texto, ponemos la variable “y”.
=LET(xx;A2:A10;a;EXTRAE(xx;SECUENCIA(;MAX(LARGO(xx)));1);b;REDUCE("";D1:H1;LAMBDA(x;y;APILARH(x;HALLAR(y;a))));b)
Obtenemos una matriz desbordada con la posición de cada vocal, y, error donde no hay coincidencia.
Usamos la función SI.ERROR antes de REDUCE, como argumento valor es la función REDUCE, como argumento valor si error, ponemos blanco.
=LET(xx;A2:A10;a;EXTRAE(xx;SECUENCIA(;MAX(LARGO(xx)));1);b;SI.ERROR(REDUCE("";D1:H1;LAMBDA(x;y;APILARH(x;HALLAR(y;a))));"");b)
Creamos otra variable, usamos la función BYROW, como argumento array, ponemos la variable “b”, como argumento función, ponemos LAMBDA, declaramos una variable, como argumento calculo de LAMBDA, contamos la variable “x”.
=LET(xx;A2:A10;a;EXTRAE(xx;SECUENCIA(;MAX(LARGO(xx)));1);b;SI.ERROR(REDUCE("";D1:H1;LAMBDA(x;y;APILARH(x;HALLAR(y;a))));"");c;BYROW(b;LAMBDA(x;CONTAR(x)));c)
Obtenemos la misma matriz desbordada en vertical con el numero de vocales de cada cadena.
Creamos otra variable, usamos el condicional SI, preguntamos si la variable “c” es mayor o igual a 5, como argumento valor si verdadero, ponemos la variable “xx”, como argumento valor si falso, ponemos blanco.
=LET(xx;A2:A10;a;EXTRAE(xx;SECUENCIA(;MAX(LARGO(xx)));1);b;SI.ERROR(REDUCE("";D1:H1;LAMBDA(x;y;APILARH(x;HALLAR(y;a))));"");c;BYROW(b;LAMBDA(x;CONTAR(x)));d;SI(c>=5;xx;"");d)
Tenemos las cadenas que contienen todas las vocales, y, blanco donde no hay coincidencia.
Usamos el argumento calculo de LET, filtramos la variable “d”, siempre que dicha variable sea distinto a blanco.
=LET(xx;A2:A10;a;EXTRAE(xx;SECUENCIA(;MAX(LARGO(xx)));1);b;SI.ERROR(REDUCE("";D1:H1;LAMBDA(x;y;APILARH(x;HALLAR(y;a))));"");c;BYROW(b;LAMBDA(x;CONTAR(x)));d;SI(c>=5;xx;"");FILTRAR(d;d<>""))
Ya lo tenemos.
Veamos otro ejemplo.
Tenemos las siguientes cadenas.
Sabemos que una dirección IP es una cadena de números separados por puntos.
Las direcciones IP se expresan como un conjunto de cuatro números, cada número del conjunto puede variar de 0 a 255.
Debemos de extraer las direcciones IP correctas.
En la celda B2, usamos LET, creamos una variable, y, seleccionamos el rango A2:A12.
=LET(xx;A2:A12
Creamos otra variable, usamos la función CONCAT, como argumento texto1, ponemos la variable “xx” y concatenamos con un asterisco.
=LET(xx;A2:A12;a;CONCAT(xx&"*");a)
Tenemos una fila donde tenemos unidas todas las cadenas, y, cada cadena esta separada por un asterisco.
Antes de CONCAT, usamos la función DIVIDIRTEXTO, como argumento texto, es la función CONCAT, como argumento delimitador de columna, entre comillas dobles, ponemos punto, como argumento delimitador de fila, entre comillas dobles, ponemos asterisco.
=LET(xx;A2:A12;a;DIVIDIRTEXTO(CONCAT(xx&"*");".";"*");a)
Tenemos una matriz desbordada, donde en cada fila, tenemos cada carácter por separado, y, error donde no hay nada que separar.
Vemos que tenemos cinco columnas, cuando una dirección IP esta formada por cuatro números, lo que ocurre es que hay una dirección IP que está formada por cinco números.
También, los valores numéricos están alineados a la izquierda, quiere decir que esta en formato de texto, pues, multiplicamos por 1 la funcion DIVIDIRTEXTO.
=LET(xx;A2:A12;a;DIVIDIRTEXTO(CONCAT(xx&"*");".";"*")*1;a)
Quitamos los errores con la función SI.ERROR, y, ponemos blanco donde es error.
=LET(xx;A2:A12;a;SI.ERROR(DIVIDIRTEXTO(CONCAT(xx&"*");".";"*")*1;"");a)
Creamos otra variable, abrimos paréntesis para poner una primera condición, ponemos la variable “a”, comparamos como mayor o igual a 0, cerramos paréntesis, ponemos el símbolo de asterisco, abrimos otro paréntesis, ponemos la variable “a”, comparamos con menor o igual a 255, cerramos paréntesis.
=LET(xx;A2:A12;a;SI.ERROR(DIVIDIRTEXTO(CONCAT(xx&"*");".";"*")*1;"");b;(a>=0)*(a<=255);b)
Tenemos una matriz desbordada de cinco columnas con 1 donde el valor esta entre 0 y 255, y, 0 donde no se cumple condición.
Creamos otra variable, usamos la función BYROW, como argumento array, ponemos la variable “b”, como argumento función, ponemos LAMBDA, declaramos una variable, como argumento cálculo de LAMBDA, sumamos la variable.
=LET(xx;A2:A12;a;SI.ERROR(DIVIDIRTEXTO(CONCAT(xx&"*");".";"*")*1;"");b;(a>=0)*(a<=255);c;BYROW(b;LAMBDA(x;SUMA(x)));c)
Tenemos una matriz desbordada en vertical con la suma de los 1 de cada cadena.
Creamos otra variable, filtramos la variable “a”, siempre que la variable “c” sea igual a 4.
=LET(xx;A2:A12;a;SI.ERROR(DIVIDIRTEXTO(CONCAT(xx&"*");".";"*")*1;"");b;(a>=0)*(a<=255);c;BYROW(b;LAMBDA(x;SUMA(x)));d;FILTRAR(a;c=4);d)
Tenemos una matriz desbordada de cuatro filas y cuatro columnas con las direcciones IP correctas, pero, con una columna de mas en blanco, por la quinta cantidad de una de las direcciones IP.
Usamos el argumento calculo de LET, usamos BYROW, como argumento array, ponemos la variable “d”, como argumento función ponemos LAMBDA, como argumento cálculo de LAMBDA, ponemos la función UNIRCADENAS, como argumento delimitador, entre comillas dobles, ponemos punto, ignoramos celdas vacías, como argumento texto1, ponemos la variable “x”.
=LET(xx;A2:A12;a;SI.ERROR(DIVIDIRTEXTO(CONCAT(xx&"*");".";"*")*1;"");b;(a>=0)*(a<=255);c;BYROW(b;LAMBDA(x;SUMA(x)));d;FILTRAR(a;c=4);BYROW(d;LAMBDA(x;UNIRCADENAS(".";VERDADERO;x))))
Aceptamos, y, ya lo tenemos.
Miguel Angel Franco
Comments