Tenemos los siguientes estudiantes, y, las materias para cada estudiante.
Debemos de sumar las calificaciones en varias materias y ordenarlas por materias.
En la celda D3, usamos REDUCE, como argumento valor inicial ponemos blanco, como argumento array, seleccionamos el rango B3:B7, como argumento funcion ponemos LAMBDA, y, declaramos dos variables.
=REDUCE("";B3:B7;LAMBDA(x;y
Como argumento calculo, usamos APIALRV, como argumento matriz1, ponemos la variable “x”, como argumento matriz2, usamos la funcion REGEXEXTRACT, como argumento texto, ponemos la variable “y”, es decir, cada valor de cada celda, como argumento patrón ponemos "[A-Z][a-z]+", es decir, vamos a extraer tanto las letras mayúsculas como minúsculas tantas veces como aparecen, como argumento return mode, seleccionamos 1, todas las coincidencias.
=REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1)
Como argumento matriz3, volvemos a usar REGEXEXTRACT, como argumento texto, ponemos la variable “y”, como argumento patrón ponemos "[0-9]+", es decir, vamos a extraer todos los números cada vez que aparezcan, como argumento return mode, ponemos 1.
Cerramos paréntesis.
=REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))))
Aceptamos, y, tenemos una matriz desbordada de tres columnas, en la primera columna tenemos la cada primera asignatura con su calificación, en la segunda columna, la segunda materia con su calificación, y, en la tercera columna, la tercera materia junto con su calificación, y, error, donde no hay datos que mostrar.
Antes de REDUCE usamos la funcion ENCOL, como argumento matriz es la funcion REDUCE, como argumento ignorar, seleccionamos 3, ignorar blancos, y, errores.
Antes de ENCOL, usamos la funcion EXCLUIR, como argumento matriz es la funcion ENCOL, como argumento filas, ponemos 1.
=EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1)
Tenemos todos los datos en una columna.
Después del signo igual, usamos LET, creamos una variable, y, almacenamos la expresión anterior.
=LET(a;EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1);a)
Creamos otra variable, multiplicamos la variable “a” por 1, de esa manera, al multiplicar por 1, solo nos devolverá los números, pero el valor lógico VERDADERO, y, error donde no lo es (FALSO), pero los números nos lo devolverá en formato de texto.
=LET(a;EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1);b;ESNUMERO(a*1);b)
Creamos otra variable, usamos la funcion FILTRAR, como argumento matriz, ponemos la variable “a”, como argumento Include, ponemos la variable “b” e igualamos a FALSO, vamos a obtener las asignaturas.
=LET(a;EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1);b;ESNUMERO(a*1);c;FILTRAR(a;b=FALSO);c)
Antes de FILTRAR usamos la funcion APILARH, como argumento matriz1, es la funcion FILTRAR, como argumento matriz2, usamos ENCOL, como argumento matriz, usamos el condicional SI, como argumento prueba lógica, preguntamos si la variable “b” es igual a VERDADERO, en ese caso, (Valor si verdadero) que nos devuelva la variable “a”, y, multiplicamos por 1, como argumento valor si falso, ponemos un error, como argumento ignorar de ENCOL, seleccionamos 3.
=LET(a;EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1);b;ESNUMERO(a*1);c;APILARH(FILTRAR(a;b=FALSO);ENCOL(SI(b;a*1;NOD());3));c)
Tenemos una matriz desbordada de dos columnas, en la primera columna tenemos las asignaturas, y, en la segunda columna las calificaciones.
Usamos el argumento cálculo de LET, usamos la funcion AGRUPARPOR, como argumento row fields, vamos a tomar la primera columna de la variable “c”, para ello, usamos la funcion TOMAR, como argumento matriz, ponemos la variable “c”, omitimos el argumento filas, como argumento columnas, ponemos 1.
=LET(a;EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1);b;ESNUMERO(a*1);c;APILARH(FILTRAR(a;b=FALSO);ENCOL(SI(b;a*1;NOD());3));AGRUPARPOR(TOMAR(c;;1)
Como argumento values, vamos a tomar la segunda columna de la variable “c”, para ello, volvemos a usar la funcion TOMAR, como argumento matriz ponemos la variable “c”, omitimos el argumento filas, como argumento columnas, ponemos -1.
=LET(a;EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1);b;ESNUMERO(a*1);c;APILARH(FILTRAR(a;b=FALSO);ENCOL(SI(b;a*1;NOD());3));AGRUPARPOR(TOMAR(c;;1);TOMAR(c;;-1)
Como argumento funcion, ponemos SUMA, omitimos el argumento field headers, como argumento total depth, seleccionamos 0, es decir, no mostrar totales.
=LET(a;EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1);b;ESNUMERO(a*1);c;APILARH(FILTRAR(a;b=FALSO);ENCOL(SI(b;a*1;NOD());3));AGRUPARPOR(TOMAR(c;;1);TOMAR(c;;-1);SUMA;;0))
Aceptamos, y, ya lo tenemos.
Nos falta ordenar, para ello, antes de AGRUPARPOR, ponemos la funcion ORDENAR, como argumento matriz es la funcion AGRUPARPOR, como argumento ordenar índice, ponemos 1, es decir, ordenar por materias.
=LET(a;EXCLUIR(ENCOL(REDUCE("";B3:B7;LAMBDA(x;y;APILARV(x;REGEXEXTRACT(y;"[A-Z][a-z]+";1);REGEXEXTRACT(y;"[0-9]+";1))));3);1);b;ESNUMERO(a*1);c;APILARH(FILTRAR(a;b=FALSO);ENCOL(SI(b;a*1;NOD());3));ORDENAR(AGRUPARPOR(TOMAR(c;;1);TOMAR(c;;-1);SUMA;;0);1))
Ahora, si lo tenemos.
Miguel Angel Franco Garcia
Comments