jueves, 4 de marzo de 2021

Suma Acumulada excluyente según lista

Hoy toca compartir algo más sencillo, pero igual de práctico. ;-)
Se planteaba en un grupo de Facebook, por un miembro de éste, la forma en la que obtener una suma acumulada excluyendo aquellos elementos listados en otra lista
Suma Acumulada excluyente según lista

La idea por tanto es acumular todos aquellos artículos de la TblDATOS que NO estén en la tabla de elementos 'TblFILTRADO'... lo que se consigue introduciendo en la celda G2 la fórmula:
=SUMAPRODUCTO(ESERROR(COINCIDIR(TblDATOS[Art];TblFILTRADO[filtrado];0))*(TblDATOS[Uds]))
Donde el parámetro clave es la función COINCIDIR:
COINCIDIR(TblDATOS[Art];TblFILTRADO[filtrado];0)
que para el ejemplo de la imagen devuelve una matriz:
{#N/D;1;#N/D;2;3;#N/D;#N/D;#N/D}
que identifica las posiciones de los elementos a excluir!! (que aparecen en nuestra segunda tabla TblFILTRADO).
Ya que en realidad estos son los que queremos apartar, y los que necesitamos acumular son precisamente los que han devuelto un error (esto es, los no encontrados), aplicamos la función ESERROR que transforma nuestra matriz previa en:
{VERDADERO;FALSO;VERDADERO;FALSO;FALSO;VERDADERO;VERDADERO;VERDADERO}
justo lo que requerimos para multiplicar uno-a-uno por el campo de unidades de la tabla 'TblDATOS'.
Aquí SUMAPRODUCTO hace su trabajo correctamente... operando matricialmente primero, para finalmente acumular los elementos resultantes...

De forma similar podemos obtener la suma acumulada de aquellos elementos listados; es decir, sumar solo aquellos elementos de nuestra lista...
Una primera forma, aprovechando la anterior fórmula, sería en I2:
=SUMAPRODUCTO(NO(ESERROR(COINCIDIR(TblDATOS[Art];TblFILTRADO[filtrado];0)))*(TblDATOS[Uds]))
misma explicación que para el caso anterior... pero añadiendo la función NO que invierte el sentido de la respuesta, y en consecuencia nuestra matriz de verdaderos y falsos, que ahora quedaría:
{FALSO;VERDADERO;FALSO;VERDADERO;VERDADERO;FALSO;FALSO;FALSO}
y al multiplicar por las 'unidades' de nuevo SUMAPRODUCTO devuelve el dato correcto.

Alternativamente podríamos haber aplicado otra forma clásica, en I3:
=SUMA(SUMAR.SI.CONJUNTO(TblDATOS[Uds];TblDATOS[Art];TblFILTRADO[filtrado]))
en este caso obligatoria ejecutar matricialmente (presionando Ctrl+Mayusc+Enter).
Con igual resultado...

No hay comentarios:

Publicar un comentario

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