Tengo un modelo que produce una matriz de valores que pueden tener varios cientos de columnas de ancho. Cada columna 25 contiene un número que necesito agregar al total.
Pensé que la solución más limpia sería crear una función LAMBDA que tomaría la celda inicial de la entrada del usuario y luego la compensaría en las celdas de la fila 25, agregaría el valor allí a un total acumulado y continuaría con la compensación hasta llegar a una celda vacía. .
¿Es posible? ¿Cómo hacerlo?
No creo que sea posible hacer un bucle como desee en Excel con funciones normales (puede hacerlo con VBA resistente). Pero puede beneficiarse de DESREF y SUMPRODUCT para resumir valores cada n-ésima columna.
Como ejemplo, hice un conjunto de datos falso:
Obtuvo valores de las columnas 1 a 30 (A a AD). Quiero sumar valores cada 5 columnas (1, 5, 10, 15,... y así sucesivamente). Las celdas bordeadas son los resultados calculados manualmente para comprender la lógica, pero puede hacerlo en una sola fórmula:
=SUMPRODUCT(--(COLUMN(OFFSET(A4;0;0;1;COUNTA(A4:AD4)+COUNTBLANK(A4:AD4)))/5=INT(COLUMN(OFFSET(A4;0;0;1;COUNTA(A4:AD4)+COUNTBLANK(A4:AD4)))/5))*A4:AD4)+A4Así es como funciona:
COUNTA(A4:AD4)+COUNTBLANK(A4:AD4) esto devolverá cuántas columnas, incluidos los espacios en blanco, obtuvieron sus datosOFFSET creará un rango desde la primera hasta la enésima columna (resultado del paso anterior)SUMPRODUCT sumará cada enésimo valor de esa fila (en mi ejemplo, cada 5 columnas) Si desea cada 25 columnas, simplemente reemplace /5 con /25
Debería poder hacer esto con un LAMBDA recursivo.
StridingSum = LAMBDA(cell, step, [start], LET( colOffset, IF(ISOMITTED(start), -1, start) + step, value, OFFSET(cell, 0, colOffset), IF( value = "", 0, value + StridingSum(cell, step, colOffset) ) ) ); Que llamas como =StridingSum(A2, 25) (asumiendo que tus datos comenzaron en A1)
Esto podría funcionar un poco mejor que el de Paul al permitirle seleccionar la primera celda de datos en lugar de la segunda.
StridingSum = LAMBDA(cell, step, [start], LET( colOffset, IF(ISOMITTED(start), 0, start + step), value, OFFSET(cell, 0, colOffset), IF( value = "", 0, value + StridingSum(cell, step, colOffset) ) )