Para el siguiente ejemplo, todas las filas llevan un operador matemático (para simplificar solo usaremos 4 operadores matemáticos básicos que son +, -, * y /). Debemos de concatenar todas las celdas a la izquierda del operador y realice operaciones matemáticas en la concatenación de todas las celdas a la derecha del operador.
Por ejemplo, para la primera fila, tenemos:
Concatenando los caracteres de la izquierda, seria 1354.
Concatenando los caracteres de la derecha, seria 15205.
Para este caso, debemos de sumar ambas cantidades, que seria 1355 + 15205 = 16559.
Empecemos…
En la celda I2, usamos LET, creamos una variable, y, seleccionamos el rango A2:G2.
=LET(xx;A2:G2;xx)
Creamos otra variable, usamos la función UNIRCADENAS, como argumento delimitador, entre comillas dobles, ponemos coma (,), ignoramos celdas vacías, como argumento texto1, ponemos la variable “xx”.
=LET(xx;A2:G2;a;UNIRCADENAS(",";VERDADERO;xx);a)
Tenemos la cadena unida separada por coma.
Antes de la función UNIRCADENAS, ponemos la función DIVIDIRTEXTO, como argumento texto, es la función UNIRCADENAS, como argumento delimitador de columna, entre comillas dobles, ponemos coma, como argumento delimitador de fila, debemos de poner el operador que corresponda, pero, no sabemos que operador hay en cada cadena, por lo que usamos una constante de matriz, abrimos llaves, entre comillas dobles ponemos “+”, punto y coma, entre comillas dobles ponemos “-“, punto y coma, entre comillas dobles, ponemos “*”, punto y coma, entre comillas dobles, ponemos “/”, cerramos llaves, cerramos paréntesis.
=LET(xx;A2:G2;a;DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});a)
Tenemos una matriz desbordada de cuatro columnas y dos filas, en la primera fila tenemos los valores antes del operador, y, en la segunda fila, los valores después del operador.
Si arrastramos habrá celdas donde habrá un error, por lo que antes de la función DIVIDIRTEXTO, usamos la función SI.ERROR, como argumento valor, es la expresión que tenemos, como argumento valor si error, ponemos blanco.
=LET(xx;A2:G2;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");a)
Creamos otra variable, usamos la función BYROW, como argumento matriz, ponemos la variable “a”, como argumento función, ponemos LAMBDA, declaramos una variable, y, concatenamos dicha variable.
=LET(xx;A2:G2;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");b;BYROW(a;LAMBDA(x;CONCAT(x)));b)
Ya tenemos unidas las cantidades antes y después del operador.
Creamos una variable, usamos la función TOMAR, como argumento matriz, ponemos la variable “b”, como argumento filas, ponemos 1, vamos a quedarnos con la primera cantidad.
=LET(xx;A2:G2;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");b;BYROW(a;LAMBDA(x;CONCAT(x)));c;TOMAR(b;1);c)
Creamos otra variable, volvemos a usar la función TOMAR, como argumento matriz, ponemos la variable “b”, como argumento filas, ponemos -1, vamos a tomar la última cantidad.
=LET(xx;A2:G2;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");b;BYROW(a;LAMBDA(x;CONCAT(x)));c;TOMAR(b;1);d;TOMAR(b;-1);d)
Creamos una variable, usamos el condicional SI, como argumento prueba lógica, preguntamos si la variable “xx” es igual que uno de los operadores, para ello, igual que antes usamos una constante de matriz.
=LET(xx;A2:G2;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");b;BYROW(a;LAMBDA(x;CONCAT(x)));c;TOMAR(b;1);d;TOMAR(b;-1);e;SI(xx={"-";"+";"*";"/"}
Como argumento valor si verdadero, ponemos la variable “xx”, como argumento valor si falso, ponemos un error.
=LET(xx;A2:G2;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");b;BYROW(a;LAMBDA(x;CONCAT(x)));c;TOMAR(b;1);d;TOMAR(b;-1);e;SI(xx={"-";"+";"*";"/"};xx;NOD());e)
Tenemos una matriz desbordada de siete columnas, y, cuatro filas, donde tenemos el operador de la fila, y, error donde no hay coincidencia.
Antes del condicional SI, usamos la función ENFILA, como argumento matriz, es la expresión que tenemos, como argumento ignorar, ponemos 3.
=LET(xx;A2:G2;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");b;BYROW(a;LAMBDA(x;CONCAT(x)));c;TOMAR(b;1);d;TOMAR(b;-1);e;ENFILA(SI(xx={"-";"+";"*";"/"};xx;NOD());3);e)
Tenemos el operador de la primera fila.
Como argumento calculo de LET, usamos el condicional SI, como argumento prueba lógica, preguntamos si la variable e es igual a “+”, como argumento valor si verdadero, sumamos las variables “c”, y, “d”, como argumento valor si falso, ponemos otro condicional SI, como argumento prueba lógica, preguntamos si la variable “e” es igual a “-“, en ese caso, que reste las variables “c”, y, “d”, como argumento valor si falso del segundo SI, ponemos otro condicional SI, preguntamos si la variable “e” es igual a “*”, en ese caso, que multiplique ambas variables, como argumento valor si falso del tercer SI, ponemos otro condicional SI, preguntamos si la variable “e” es igual a “/”, en ese caso, que divida ambas variables.
=BYROW(A2:G10;LAMBDA(x;LET(xx;x;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");b;BYROW(a;LAMBDA(x;CONCAT(x)));c;TOMAR(b;1);d;TOMAR(b;-1);e;ENFILA(SI(xx={"-";"+";"*";"/"};xx;NOD());3);SI(e="+";c+d;SI(e="-";c-d;SI(e="*";c*d;SI(e="/";c/d)))))))
Aceptamos, arrastramos y ya lo tenemos.
Ahora, vamos a convertir la expresión que tenemos en matricial, para ello, después del signo igual ponemos la función BYROW, como argumento array, seleccionamos el rango A2:G10, como argumento función, ponemos LAMBDA, declaramos una variable, como argumento cálculo de LAMBDA, es la función LET, pero, sustituimos el rango A2:G2 por la variable “x”.
=BYROW(A2:G10;LAMBDA(x;LET(xx;x;a;SI.ERROR(DIVIDIRTEXTO(UNIRCADENAS(",";VERDADERO;xx);",";{"+";"-";"*";"/"});"");b;BYROW(a;LAMBDA(x;CONCAT(x)));c;TOMAR(b;1);d;TOMAR(b;-1);e;ENFILA(SI(xx={"-";"+";"*";"/"};xx;NOD());3);SI(e="+";c+d;SI(e="-";c-d;SI(e="*";c*d;SI(e="/";c/d)))))))
Aceptamos, y, ya lo tenemos.
Miguel Angel Franco
Comments