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:
AGRUPARPORpor concepto y mes para resumir los importes.- Una columna calculada con el acumulado dentro de cada concepto.
PIVOTARPORsobre 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
- Sustituir SUMAR.SI.CONJUNTO lento por MMULT y BYCOL en análisis de inventario CasoUn miembro desde Ecuador tiene un modelo de inventario con SUMAR.SI.CONJUNTO dentro de una fórmula LET con ELEGIRCOLS y FILTRAR. El problema
- Error #CALC con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección CasoAlejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícu
- Generar la serie de Fibonacci con REDUCE, APILARV y LAMBDA CasoInteresante ejercicio compartido en la comunidad: generar los primeros N números de la serie de Fibonacci usando exclusivamente fórmulas de
- Consolidar datos repetidos con REDUCE, APILARV y PIVOTARPOR CasoLa comunidad aborda un caso de consolidación de datos donde hay tareas con encabezados repetidos que necesitan combinarse dinámicamente. El
- SUMAR.SI.CONJUNTO en acción con El Señor de los Anillos 🃏 El 21 de La Comarca TutorialLo que practicamos en este caso: • Contar cartas por palo con CONTAR.SI • Sumar valores con condiciones (SUMAR.SI / SUMAR.SI.CONJUNTO) • Apl
- SUMAR.SI.CONJUNTO con referencias de celda en los criterios de fecha CasoUn miembro de la comunidad tiene una fórmula SUMAR.SI.CONJUNTO que funciona perfectamente con fechas escritas directamente, pero no consigue
- SI.ERROR falla con textos de más de 255 caracteres: alternativa con ESERROR CasoUn caso que pilló desprevenida a la comunidad: al usar FILTRAR sobre una columna que contiene textos largos (más de 255 caracteres), las fil
- Grado de avance por proyecto: despivotar y volver a pivotar por fecha CasoNuevo caso de la comunidad con mucho jugo para los que trabajan con reporting de proyectos. Juan plantea un problema habitual en oficinas té