跨多工作表按月份汇总每日总成本的方法求助
汇总Excel月度日报表「每日总成本」的高效方案
一、无需VBA的公式自动求和法
如果你的日报表工作表名称是数字格式的日期天数(如1、2...31),或者是标准日期格式(如2024-05-01),可以用以下公式自动求和,无需手动逐个引用:
情况1:工作表名为天数数字(1/2/3...)
使用SUMPRODUCT+IFERROR处理不存在的工作表(比如4月只有30天,31日的工作表不存在时自动返回0):
=SUMPRODUCT(IFERROR(INDIRECT("'"&ROW(1:31)&"'!A2"),0))
- 替换
A2为你存储「每日总成本」的单元格位置 - 公式会自动遍历1-31天的工作表,跳过不存在的表,累计求和
情况2:工作表名为标准日期格式(如2024-05-01)
自动匹配当月所有日期格式的工作表,无需手动指定天数:
=SUMPRODUCT(IFERROR(INDIRECT("'"&TEXT(DATE(YEAR(TODAY()),MONTH(TODAY()),ROW(1:31)),"yyyy-mm-dd")&"'!A2"),0))
YEAR(TODAY())和MONTH(TODAY())会自动获取当前年月,也可以手动替换为固定值(如DATE(2024,5,ROW(1:31)))- 同样替换
A2为实际存储总成本的单元格
二、VBA宏批量汇总法
如果工作表名称格式不统一,或者需要更灵活的汇总逻辑,用VBA宏可以彻底解放手动操作:
宏代码示例
Sub 月度总成本自动汇总() Dim ws As Worksheet Dim totalCost As Double Dim targetMonth As Integer Dim resultCell As Range ' 1. 设置参数:可根据需求修改 targetMonth = Month(Date) ' 自动获取当前月份,可手动改为固定值(如5代表5月) Set resultCell = ThisWorkbook.Worksheets("汇总").Range("B2") ' 结果存放位置:汇总表的B2单元格 Dim costCell As String: costCell = "A2" ' 每日总成本所在的单元格 ' 2. 遍历所有工作表求和 totalCost = 0 For Each ws In ThisWorkbook.Worksheets ' 跳过汇总表本身 If ws.Name <> "汇总" Then ' 尝试解析工作表名称为日期,判断是否属于目标月份 On Error Resume Next Dim wsDate As Date wsDate = DateValue(ws.Name) ' 如果是目标月份的工作表,累加成本 If Err.Number = 0 And Month(wsDate) = targetMonth Then totalCost = totalCost + ws.Range(costCell).Value ' 如果工作表名是天数数字(如1/2),默认归为目标月份 ElseIf IsNumeric(ws.Name) And Val(ws.Name) >= 1 And Val(ws.Name) <= 31 Then totalCost = totalCost + ws.Range(costCell).Value End If On Error GoTo 0 End If Next ws ' 3. 输出结果 resultCell.Value = totalCost MsgBox "月度总成本汇总完成:" & totalCost End Sub
使用步骤
- 打开你的日报表工作簿,按
Alt + F11打开VBA编辑器 - 右键点击左侧的工作簿名称 → 插入 → 模块
- 将上述代码粘贴到模块窗口中,根据你的实际情况修改参数(目标月份、结果位置、成本单元格)
- 按
F5运行宏,或者回到Excel界面,通过「开发工具」→「宏」选择运行
注意事项
- 确保所有日报表的「每日总成本」都在同一个固定单元格位置,否则需要调整公式或代码中的单元格引用
- 如果工作表名称有特殊符号(如空格、中文),公式中的
INDIRECT需要保留单引号('),代码无需额外处理 - VBA宏需要启用宏功能(Excel会提示,选择启用即可)
内容的提问来源于stack exchange,提问作者Brian Hamilton
相关产品推荐
相关产品推荐

