jueves, 8 de abril de 2021

Vectores de Subtotales sobre rango dinámico

En un artículo de hace un par de semanas tuve la necesidad de verificar, para datos de una tabla y por cada registro, si se verificaban una serie de criterios (múltiples) leer aquí.
Descubrir si se cumplian esos ciertoso criterios fue relativamente simple empleando ciertos condicionales SI, con lo que se obtenía una matriz de 1 y 0.
Posteriormente tuve la necesidad de, a partir de dicha matriz de 1 y 0, simplificarla en un Vector de VERDADERO y FALSO, que sencillamente reconociera si existe en cada fila al menos un cumplimiento... o dicho de otro modo, si la suma de cada fila es mayor a cero.
Empezaremos con una matriz aleatoria dinámica de 0 y 1 (de dimensión 12 filas x 3 columnas).
=MATRIZALEAT(12;3;0;1;VERDADERO)

Cada columna simula el cumplimiento (=1) o no (=0) de los tres supuesto criterios existentes...
Vectores de Subtotales sobre rango dinámico

Nuestro primer paso es obtener el vector vertical para cada fila que sume las tres columnas de cada registro...
Entonces en F2 escribimos:
=MMULT(B2#;SECUENCIA(COLUMNAS(B2#);1;1;0))
donde multiplicamos dos matrices, una de (12 x 3) y otra de (3 x 1), lo que obviamente devolverá como resultado un vector de dimensión (12 filas x 1 columna).
Recuerda la regla matemática del producto de matrices:
A(m x n) x B(n x z) = C(m x z)
En nuestro caso nos hemos apoyado en la función SECUENCIA para montar una matriz de unos con dimensión (3x1) = {1;1;1} como necesitábamos...

Lo que vemos es un vector vertical que suma fila por fila los tres elementos de la matriz principal.
Si no tuvieras disponible la función SECUENCIA podrías replicarla matricialmente de la siguiente manera:
=MMULT(B2#;FILA(INDIRECTO("1:"&COLUMNAS(B2#)))^0)

En cualquiera de las dos formas, en un paso posterior, habría que convertirlo en prueba lógica, comparando con '>0' para obtener VERDADEROS y FALSOS, y así poder operar con el vector más facilmente.
=MMULT(B2#;SECUENCIA(COLUMNAS(B2#);1;1;0))>0
Vectores de Subtotales sobre rango dinámico


Adicionalmente, sin utilidad para el caso planteado (pero sí para otros), mostraré como lograr el vector horizontal de suma por columnas.
En este caso necesitaremos generar un vector de unos, de dimensión 1 fila x 12 columnas, de tal forma que el producto de matrices quede: (1x12) x (12x3) = (1x3).

Para ello podemos escribir en B15:
=MMULT(SECUENCIA(1;FILAS(B2#);1;0);B2#)
o, matricialmente, para otras versiones de Excel:
=MMULT(TRANSPONER(FILA(INDIRECTO("1:"&FILAS(B2#))))^0;B2#)
Vectores de Subtotales sobre rango dinámico


Fórmulas muy potentes por si mismas para obtener esos parciales por filas y/o columnas, pero también como vectores auxiliares de apoyo para construir fórmulas más elaboradas...

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.