top of page

Cuadrado magico

Para el siguiente ejemplo, tenemos cuatro cuadros con números.













Un cuadrado mágico es una cuadrícula de 3x3 donde:


· Los números del 1 al 9 aparecen una vez (Esto se ha asegurado en los cuadrados dados. Por lo tanto, no debemos de verificarlo)

· Debemos de sumar sobre filas, columnas y diagonales que sean igual a 15.


El ejercicio consiste en detectar que cuadros de los cuatro cuadros dados suman 15 en filas, columnas, y, diagonales.


Empecemos…


En la celda F2, ponemos la función LET, creamos una variable, como valor para dicha variable, seleccionamos el rango B2:D4.


Probamos variable.


=LET(a;B2:D4;a)


Tenemos una matriz desbordada con el primer cuadro.







Creamos otra variable, la llamaremos primera_fila, usamos la función INDICE, como argumento matriz, es la variable “a”, como argumento numero de fila, usamos la función SECUENCIA, como argumento filas, ponemos 2, omitimos el argumento columnas, como argumento inicio, ponemos 1, como argumento paso, ponemos 2, con la función SECUENCIA vamos a crear una matriz en vertical con los valores 1, y, 3, que son las filas que debemos de rescatar para sumar en diagonal, como argumento numero de columna, ponemos 1, o, lo omitimos.


Probamos variable.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);primera_fila)


Tenemos dicha matriz.






Creamos otra variable, la llamaremos segunda_fila, volvemos a usar la función INDICE, como argumento matriz es la variable “a”, como argumento numero de fila, usamos una constante de matriz, abrimos unas llaves, ponemos el numero 2, ponemos punto y coma, volvemos a poner el número 2, cerramos llaves, con esta constante de matriz, vamos a obtener el numero central, el numero 5, ya que se cruza para calcular el total en diagonal, como argumento numero de columna, ponemos 2.


Probamos variable.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);segunda_fila)






Creamos otra variable, la llamaremos tercera_fila, volvemos a usar la función INDICE, como argumento matriz, ponemos la variable “a”, como argumento numero de fila, usamos otra constante de matriz, abrimos unas llaves, ponemos el numero 3, punto y coma, ponemos el numero 1, cerramos llaves, como argumento número de columna, ponemos 3, probamos variable.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);tercera_fila)







Ya tenemos los valores a sumar en diagonal.


Creamos otra variable, la llamaremos suma_filas, usamos la función BYROW, como argumento array, ponemos la variable “a”.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(a


Como argumento función, ponemos LAMBDA, creamos una variable que almacena el argumento array, sumamos dicha variable.


Con esta expresión, obtenemos la suma de cada fila.


Probamos variable.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(a;LAMBDA(x;SUMA(x)));suma_filas)


Vemos que la suma en vertical cumple con la condición, ya que nos devuelve 15.








Creamos otra variable, la llamaremos suma_columnas, usamos la función BYCOL, porque vamos a sumar en horizontal, como argumento array, es la variable “a”, como argumento función, ponemos LAMBDA, creamos una variable, sumamos variable.


Probamos variable.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(a;LAMBDA(x;SUMA(x)));suma_columnas;BYCOL(a;LAMBDA(x;SUMA(x)));suma_columnas)

Tenemos la suma de cada columna, también, nos devuelve 15.





Creamos otra variable, la llamaremos resultado, usamos la función APILARV, como argumento matriz1, ponemos la variable “a”, como argumento matriz2, transponemos la variable suma_filas.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(a;LAMBDA(x;SUMA(x)));suma_columnas;BYCOL(a;LAMBDA(x;SUMA(x)));resultado;APILARV(a;TRANSPONER(suma_filas));resultado)


Obtenemos una matriz desbordada con los valores numéricos, y, la suma de cada fila.











Volvemos a la expresión de la variable resultado, antes de APILARV, ponemos APILARH, como argumento matriz1, es la función APILARV, como argumento matriz2, transponemos la variable suma_columnas.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(a;LAMBDA(x;SUMA(x)));suma_columnas;BYCOL(a;LAMBDA(x;SUMA(x)));resultado;APILARH(APILARV(a;TRANSPONER(suma_filas));TRANSPONER(suma_columnas));resultado)


Obtenemos la misma matriz desbordada que anteriormente, pero vemos que también tenemos el total para cada columna, y, error donde no hay valores que sumar.







La suma de las variables primera_fila, segunda_fila, y, tercera_fila, nos devuelve la suma de las diagonales, vamos a sustituir el error por la suma de estas variables, para ello, usamos la función SI.ERROR, como argumento valor si error, sumamos las tres variables, y, usamos la función UNICOS, porque solo necesitamos un valor.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(a;LAMBDA(x;SUMA(x)));suma_columnas;BYCOL(a;LAMBDA(x;SUMA(x)));resultado;SI.ERROR(APILARH(APILARV(a;TRANSPONER(suma_filas));TRANSPONER(suma_columnas));UNICOS(primera_fila+segunda_fila+tercera_fila));resultado)


Tenemos la suma de la primera diagonal.










Creamos otra variable, la llamaremos resultado2, usamos la función APILARH, como argumento matriz1, es la misma expresión que hemos usado para el argumento valor si error de la función SI.ERROR, como argumento matriz2, ponemos la variable resultado.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(a;LAMBDA(x;SUMA(x)));suma_columnas;BYCOL(a;LAMBDA(x;SUMA(x)));resultado;SI.ERROR(APILARH(APILARV(a;TRANSPONER(suma_filas));TRANSPONER(suma_columnas));UNICOS(primera_fila+segunda_fila+tercera_fila));resultado2;APILARH(UNICOS(primera_fila+segunda_fila+tercera_fila);resultado);resultado2)


Obtenemos la misma matriz, pero con una primera columna, donde en la primera fila aparece 15, y, en el resto de las filas, aparece error.









Vamos a la expresión de la variable resultado2, antes de APILARH, ponemos la función SI.ERROR, como argumento valor es la función APILARH, como argumento valor si error, volvemos a sumar las variables primera_fila, segunda_fila, y, tercera_fila, quedándonos con los valores únicos.


=LET(a;B2:D4;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(a;LAMBDA(x;SUMA(x)));suma_columnas;BYCOL(a;LAMBDA(x;SUMA(x)));resultado;SI.ERROR(APILARH(APILARV(a;TRANSPONER(suma_filas));TRANSPONER(suma_columnas));UNICOS(primera_fila+segunda_fila+tercera_fila));resultado2;SI.ERROR(APILARH(UNICOS(primera_fila+segunda_fila+tercera_fila);resultado);UNICOS(primera_fila+segunda_fila+tercera_fila));resultado2)






Ya tenemos el ejercicio resuelto, viendo la suma de filas, columnas y diagonales.


Vamos a usar la función LAMBDA, la ponemos después del signo igual, declaramos una variable, la llamaremos rango, sustituimos el rango de la variable “a” por la variable rango, cerramos la funcion LAMBDA, abrimos un paréntesis, seleccionamos el rango B2:D4, y, cerramos paréntesis.


=LAMBDA(rango;LET(a;rango;primera_fila;INDICE(a;SECUENCIA(2;;1;2);1);segunda_fila;INDICE(a;{2;2};2);tercera_fila;INDICE(a;{3;1};3);suma_filas;BYROW(INDICE(a;SECUENCIA(3);SECUENCIA(;3));LAMBDA(x;SUMA(x)));suma_columnas;BYCOL(a;LAMBDA(x;SUMA(x)));resultado;SI.ERROR(APILARH(APILARV(a;TRANSPONER(suma_filas));TRANSPONER(suma_columnas));UNICOS(primera_fila+segunda_fila+tercera_fila));resultado2;SI.ERROR(APILARH(UNICOS(primera_fila+segunda_fila+tercera_fila);resultado);UNICOS(primera_fila+segunda_fila+tercera_fila));resultado2))(B2:D4)


Seleccionamos la matriz desbordada, desplegamos formato condicional, seleccionamos reglas para resaltar celdas, en la ventana que se despliega, seleccionamos es igual a.












Se abre la ventana es igual a, en la ventana de la izquierda ponemos 15, en la ventana de la derecha, seleccionamos relleno verde con texto verde oscuro.














Ahora, vamos a crear una función personalizada, seleccionamos la función, pulsamos CTRL más C, vamos a la pestaña formulas, dentro del grupo nombres definidos, hacemos clic en asignar nombre.








Como nombre ponemos rango, en la ventana se refiere a, pegamos la expresión.








Aceptamos.


Vamos a la celda F7, ponemos el nombre de rango creado, y, aceptamos.


=rango


En las celdas Q2, y, Q7, volvemos a poner el nombre de rango.


Aplicamos el mismo formato condicional, pero donde no se cumple la regla, ponemos un formato rojo claro.


Vemos que los dos primeros cuadros en vertical cumple con la condición, los otros dos cuadros no cumplen.











Miguel Angel Franco

 
 
 

Comentarios


© 2019 Miguel Ángel Franco García

bottom of page