Para el siguiente ejemplo, trabajamos con el modelo que suelo usar habitualmente.
El modelo esta en formato de tabla, y, se llama Ventas.
Tenemos que crear un reporte con aquellos centros comerciales que estén formados por dos palabras, el resto de los centros, lo ignoramos.
Debemos de crear una única función, y, que nos arroje todos los resultados, por lo que hay funciones que no podremos usar.
Por ejemplo, no podemos usar la función DIVIDIRTEXTO, si en la celda I2, ponemos la función, como argumento texto, seleccionamos la columna centro, y, como argumento delimitador de columna, ponemos un espacio, vemos que solo nos devuelva la primera cadena empezando por la izquierda.
=DIVIDIRTEXTO(Ventas[Centro];" ")
Podemos pensar que no podemos usarla de forma matricial, pero, igual que hacemos con los operadores lógicos Y/O, usamos BYROW, para poder usarla como matricial, pues, vamos a hacer lo mismo con la función DIVIDIRTEXTO.
=BYROW(Ventas[Centro];LAMBDA(x;DIVIDIRTEXTO(x;" ")))
Obtenemos un error de cálculo.
Lo haremos de la siguiente manera.
En la celda I2, ponemos LET, creamos una variable, el valor a almacenar es la función TEXTOANTES, como argumento texto, es la columna centro.
=LET(a;TEXTOANTES(Ventas[Centro]
Como argumento delimitador, ponemos un espacio.
=LET(a;TEXTOANTES(Ventas[Centro];" "
Vamos poniendo punto y coma, hasta llegar al argumento si no se encuentra, y, ponemos un texto en blanco.
Probamos la variable.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");a)
Obtenemos una matriz desbordada con la primera parte del centro por la izquierda.
Creamos otra variable, usamos la función TEXTODESPUES, como argumento texto, es la columna centro.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;TEXTODESPUES(Ventas[Centro]
Como argumento delimitador, ponemos un espacio, vamos poniendo punto y coma, hasta llegar al argumento si no se encuentra, donde ponemos blanco.
Probamos la variable.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;TEXTODESPUES(Ventas[Centro];" ";;;;"");b)
Obtenemos una matriz desbordada con la segunda palabra de la columna centro.
Creamos otra variable, donde usamos APILARH, como argumento matriz1 es la variable “a”, como argumento matriz2, ponemos la variable “b”.
Probamos la variable.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;TEXTODESPUES(Ventas[Centro];" ";;;;"");c;APILARH(a;b);c)
Tenemos una matriz desbordada con cada palabra.
Preguntamos si el resultado de APILARH es igual a nada.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;TEXTODESPUES(Ventas[Centro];" ";;;;"");c;APILARH(a;b)="";c)
Obtenemos una matriz desbordada con FALSO donde no es vacío, y, VERDADERO donde lo es, VERDADERO quiere decir que el centro es de una sola palabra.
Estamos trabajando con dos columnas, por lo que obtenemos VERDADERO, o, FALSO para cada columna, quiere decir, que podríamos trabajar con la primera columna, para ello, volvemos a la expresión de la variable “c”, ponemos INDICE, como argumento matriz, es la función APILAR igualada a vacío, omitimos el argumento numero de fila, como argumento numero de columna, ponemos 1.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;TEXTODESPUES(Ventas[Centro];" ";;;;"");c;INDICE(APILARH(a;b)="";;1);c)
Obtenemos la primera columna.
Nos vamos a traer el modelo si los centros de una palabra, para ello, vamos a la expresión de la variable “c”, ponemos la función FILTRAR, como argumento array, es la tabla ventas, como argumento include, es la función INDICE siempre que sea igual a FALSO.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;TEXTODESPUES(Ventas[Centro];" ";;;;"");c;FILTRAR(Ventas;INDICE(APILARH(a;b)="";;1)=FALSO);c)
Todavía, debemos de quitar aquellos centros, con más de dos palabras.
Vamos a modificar la expresión anterior, vamos a la expresión de la variable “b”, usamos la función ENCONTRAR, como argumento texto buscado, ponemos un espacio, como argumento dentro del texto, es la función TEXTODESPUES.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;ENCONTRAR(" ";TEXTODESPUES(Ventas[Centro];" ";;;;""))
Obtenemos una matriz desbordada con error donde no es blanco, y, la posición de la primera letra donde hay coincidencia, donde hay un blanco.
Quitamos el error con la función SI.ERROR.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;SI.ERROR(ENCONTRAR(" ";TEXTODESPUES(Ventas[Centro];" ";;;;""));"")
Filtramos la tabla ventas, siempre que el resultado de la función SI.ERROR, sea igual a nada.
Probamos la variable “b”.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;FILTRAR(Ventas;SI.ERROR(ENCONTRAR(" ";TEXTODESPUES(Ventas[Centro];" ";;;;""));"")="");c;FILTRAR(b;SI.ERROR(ENCONTRAR(" ";INDICE(b;;3));"")<>"");b)
Ternemos el modelo, pero, vemos que los centros de mas de dos palabras han sigo ignorados.
Vamos a la expresión de la variable “c”, borramos la expresión, usamos la función ENCONTRAR, como argumento texto buscado, ponemos un espacio, como argumento dentro del texto, usamos INDICE, como argumento matriz, es la variable “b”, omitimos el argumento numero de fila, como argumento numero de columna, ponemos 3, es decir, la columna centro.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;FILTRAR(Ventas;SI.ERROR(ENCONTRAR(" ";TEXTODESPUES(Ventas[Centro];" ";;;;""));"")="");c;ENCONTRAR(" ";INDICE(b;;3));c)
Tenemos una matriz desbordada como error donde no hay espacio, y, la posición donde se encuentra el espacio.
Quitamos el error con la función SI.ERROR.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;FILTRAR(Ventas;SI.ERROR(ENCONTRAR(" ";TEXTODESPUES(Ventas[Centro];" ";;;;""));"")="");c;SI.ERROR(ENCONTRAR(" ";INDICE(b;;3));"");c)
Filtramos la variable “b”, siempre que el resultado de la función SI.ERROR, sea distinto a nada.
=LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;FILTRAR(Ventas;SI.ERROR(ENCONTRAR(" ";TEXTODESPUES(Ventas[Centro];" ";;;;""));"")="");c;FILTRAR(b;SI.ERROR(ENCONTRAR(" ";INDICE(b;;3));"")<>"");c)
Pues, ya tenemos nuestro modelo con los centros compuestos de dos palabras.
Nos traemos el encabezado.
=APILARV(Ventas[#Encabezados];LET(a;TEXTOANTES(Ventas[Centro];" ";;;;"");b;FILTRAR(Ventas;SI.ERROR(ENCONTRAR(" ";TEXTODESPUES(Ventas[Centro];" ";;;;""));"")="");c;FILTRAR(b;SI.ERROR(ENCONTRAR(" ";INDICE(b;;3));"")<>"");c))
Ya tenemos nuestro ejemplo resuelto.
Miguel Angel Franco
Comments