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, usamos la funcion REGEXEXTRACT, como argumento texto, ponemos la celda A2, como argumento patrón, entre comillas dobles ponemos "[.]+", como argumento return mode, ponemos, es decir, que nos devuelva todas las veces que aparece el punto.
=LET(a;REGEXEXTRACT(A2;"[.]+";1);a)
Aceptamos, y, para la primera celda tenemos tres puntos, 3 puntos significa que hay cuatro valores.
Usamos la funcion CONTARA antes de REGEXEXTRACT.
=LET(a;CONTARA(REGEXEXTRACT(A2;"[.]+";1));a)
Nos devuelve 3.
Creamos otra variable, usamos el condicional SI, como argumento prueba lógica preguntamos si la variable “a” es igual a 3, como argumento valor si verdadero, ponemos la celda A2, como argumento valor si falso, ponemos un error.
=LET(a;CONTARA(REGEXEXTRACT(A2;"[.]+";1));b;SI(a=3;A2;NOD());b)
Como hay coincidencia, obtenemos la dirección IP de la celda A2.
Creamos otra variable, usamos la funcion DIVIDIRTEXTO, como argumento texto, ponemos la variable “b”, como argumento delimitador de columna, entre comillas dobles, ponemos punto, vamos a tener cada cantidad separada.
=LET(a;CONTARA(REGEXEXTRACT(A2;"[.]+";1));b;SI(a=3;A2;NOD());c;DIVIDIRTEXTO(b;".");c)
Vemos que los números están alineados a la izquierda, quiere decir que están en formato de texto, para pasarlo a formato de número, multiplicaos por 1 la funcion DIVIDIRTEXTO.
=LET(a;CONTARA(REGEXEXTRACT(A2;"[.]+";1));b;SI(a=3;A2;NOD());c;DIVIDIRTEXTO(b;".")*1;c)
Después de la funcion DIVIDIRTEXTO comparamos con menor o igual a 255.
=LET(a;CONTARA(REGEXEXTRACT(A2;"[.]+";1));b;SI(a=3;A2;NOD());c;DIVIDIRTEXTO(b;".")*1<=255;c)
Tenemos una matriz desbordada, en este caso, con VERDADERO porque todos los números son menores o igual a 255.
Encerramos la funcion DIVIDIRTEXTO entre paréntesis, y, ponemos el doble signo negativo.
=LET(a;CONTARA(REGEXEXTRACT(A2;"[.]+";1));b;SI(a=3;A2;NOD());c;--(DIVIDIRTEXTO(b;".")*1<=255);c)
En este caso, tenemos todo 1.
Antes del doble signo negativo, ponemos la funcion SUMA.
=LET(a;CONTARA(REGEXEXTRACT(A2;"[.]+";1));b;SI(a=3;A2;NOD());c;SUMA(--(DIVIDIRTEXTO(b;".")*1<=255));c)
Obtenemos 4.
Antes de la función SUMA, usamos el condicional SI, como argumento prueba lógica, es la funcion SUMA, y, comparamos con igual a 4, como argumento valor si verdadero, ponemos la variable “b”, como argumento valor si falso, ponemos un error.
=LET(a;CONTARA(REGEXEXTRACT(A2;"[.]+";1));b;SI(a=3;A2;NOD());c;SI(SUMA(--(DIVIDIRTEXTO(b;".")*1<=255))=4;b;NOD());c)
Obtenemos la IP de la celda A2 porque cumple con la condición.
Vamos a convertirla en matricial, para ello, después del signo igual, ponemos BYROW, como argumento array, seleccionamos el rango A2:A12, como argumento funcion, ponemos LAMBDA, declaramos una variable, como argumento calculo, es la funcion LET; pero sustituimos A2 por la variable “x”.
=BYROW(A2:A12;LAMBDA(x;LET(a;CONTARA(REGEXEXTRACT(x;"[.]+";1));b;SI(a=3;x;NOD());c;SI(SUMA(--(DIVIDIRTEXTO(b;".")*1<=255))=4;b;NOD());c)))
Tenemos una matriz desbordada en vertical con las IP correctas, y, error donde no son correctas.
Después del signo igual, usamos la funcion ENCOL, como argumento matriz es la funcion BYROW, como argumento ignorar, seleccionamos 3.
=ENCOL(BYROW(A2:A12;LAMBDA(x;LET(a;CONTARA(REGEXEXTRACT(x;"[.]+";1));b;SI(a=3;x;NOD());c;SI(SUMA(--(DIVIDIRTEXTO(b;".")*1<=255))=4;b;NOD());c)));3)
Aceptamos, y, ya lo tenemos.
Miguel Angel Franco
Comments