Saldo acumulado por mes: tres enfoques (REDUCE+BYROW, PIVOTARPOR+acumulado, MMULT)

Juan plantea una pregunta que parece sencilla y se acaba convirtiendo en tres clases magistrales sobre cómo recorrer una matriz mes a mes.

Tiene una tabla de tesorería con conceptos en filas (Entradas, Clientes, Salidas, Proveedores…) y meses en columnas (2026-05, 2026-06, … 2028-12). Lo que quiere: que cada celda muestre el saldo acumulado hasta ese mes (enero solo enero; febrero enero+febrero; marzo enero+febrero+marzo…). Y la pregunta exacta: ¿se puede hacer aprovechando el propio PIVOTARPOR?

Solución 1 — Gerson: REDUCE + BYROW(TOMAR(...);SUMA)

Sin PIVOTARPOR. La idea es recorrer cada columna del rango y, en cada paso, tomar las primeras n columnas y sumarlas fila a fila:

``
=REDUCE(B2:B14; COLUMNA(C1:AH1)-2;
LAMBDA(j; x;
APILARH(j; BYROW(TOMAR(C2:AH14;;x); SUMA))
)
)
`

TOMAR(rango;;x) con tercer argumento positivo se queda con las primeras x columnas. BYROW(...;SUMA) las suma fila a fila, devolviendo una columna acumulada. REDUCE apila ese resultado columna a columna y genera la tabla derramada completa en una sola celda.

Solución 2 — Miki: AGRUPARPOR + columna acumulado + PIVOTARPOR

Más cercano al enfoque que pedía Juan, aunque sí usa una columna auxiliar:

1. Primero AGRUPARPOR por Concepto y mes-Año para tener los importes resumidos.
2. Añade una columna calculada con el acumulado dentro de cada concepto.
3. Aplica PIVOTARPOR sobre la matriz resultante para volver al formato tabla.

Miki avisó después que su versión daba error si se añadía una línea con valor negativo, y lo corrigió en un mensaje siguiente.

Solución 3 — Oscar: MMULT con matriz booleana

La más compacta y la que mejor responde a "una sola fórmula derramada":

`
=LET(
a; H8:H11;
u; UNICOS(a);
m; MES(J8:J11);
v; ENFILA(UNICOS(m));
APILARV(
APILARH(""; v & "-" & AÑO(J8));
APILARH(u; MMULT(N(u=ENFILA(a)); I8:I11*(m<=v)))
)
)
`

u=ENFILA(a) construye una matriz booleana de coincidencias por categoría. m<=v actúa como filtro "acumulado hasta este mes" en cada columna. El MMULT cruza ambas y produce, en una pasada, una matriz categorías × meses con los acumulados — sin SUMAR.SI.CONJUNTO ni columnas auxiliares.

---

Tres formas muy distintas de pensar el mismo problema: una con REDUCE/TOMAR direccional, otra con PIVOTARPOR y columna auxiliar, y otra con álgebra matricial pura vía MMULT`. El archivo adjunto incluye el planteamiento original de Juan y la solución corregida de Gerson.

El problema: saldo acumulado mes a mes en tesorería

Juan tenía una tabla de tesorería con conceptos en filas (Entradas, Clientes, Salidas, Proveedores…) y meses en columnas. Quería que cada celda mostrara el saldo acumulado hasta ese mes: enero solo enero, febrero enero más febrero, marzo los tres primeros… Y una duda concreta: ¿se puede aprovechar el propio PIVOTARPOR?

La comunidad respondió con tres enfoques muy distintos, y la comparativa es una pequeña clase magistral sobre cómo recorrer una matriz.

Enfoque 1: REDUCE + BYROW (Gerson)

Sin PIVOTARPOR. La idea es recorrer cada columna del rango y, en cada paso, tomar las primeras n columnas y sumarlas fila a fila:

=REDUCE(B2:B14; COLUMNA(C1:AH1)-2;
   LAMBDA(j; x;
     APILARH(j; BYROW(TOMAR(C2:AH14;;x); SUMA))
   )
)

TOMAR(rango;;x) con tercer argumento positivo se queda con las primeras x columnas. BYROW(...;SUMA) las suma fila a fila y devuelve una columna acumulada. REDUCE va apilando cada resultado columna a columna y genera la tabla derramada completa en una sola celda.

Enfoque 2: AGRUPARPOR + PIVOTARPOR (Miki)

El más cercano a lo que pedía Juan, aunque usa una columna auxiliar:

  1. AGRUPARPOR por concepto y mes para resumir los importes.
  2. Una columna calculada con el acumulado dentro de cada concepto.
  3. PIVOTARPOR sobre la matriz resultante para volver al formato tabla.

Miki avisó después de que su versión fallaba al añadir una línea con importe negativo, y lo corrigió en un mensaje posterior. Buen recordatorio de probar siempre con datos límite.

Enfoque 3: MMULT con matriz booleana (Oscar)

La versión más compacta, y la que mejor responde a "una sola fórmula derramada":

=LET(
    a; H8:H11;
    u; UNICOS(a);
    m; MES(J8:J11);
    v; ENFILA(UNICOS(m));
    APILARV(
        APILARH(""; v & "-" & AÑO(J8));
        APILARH(u; MMULT(N(u=ENFILA(a)); I8:I11*(m<=v)))
    )
)

u=ENFILA(a) construye una matriz booleana de coincidencias por categoría. El término m<=v actúa como filtro "acumulado hasta este mes" en cada columna. MMULT cruza ambas y produce, en una sola pasada, una matriz de categorías por meses con los acumulados, sin SUMAR.SI.CONJUNTO ni columnas auxiliares.

Funciones clave

  • REDUCE — recorre una secuencia acumulando un resultado.
  • TOMAR — se queda con las primeras o últimas filas/columnas de un rango.
  • BYROW — aplica una función fila a fila.
  • AGRUPARPOR / PIVOTARPOR — resumen y pivotado dinámico.
  • MMULT + N — multiplicación matricial sobre una matriz booleana para agrupar y sumar de golpe.
  • LET — nombra subexpresiones para no repetirlas.

Conclusión

Tres formas de pensar el mismo problema: REDUCE y TOMAR en dirección columna, PIVOTARPOR con columna auxiliar, y álgebra matricial pura con MMULT. Ninguna es "la correcta": la primera es directa, la segunda la más parecida a lo que se pedía, y la tercera la más elegante cuando quieres todo en una celda. Casos así salen cada semana en la comunidad de InflueXcel, donde un problema aparentemente simple destapa varias técnicas. Puedes descargar el fichero con el planteamiento original y las soluciones.

Más casos con estas funciones

Más contenido de Excel en InflueXcel