如何用VBA循环将各日期工作簿的MAXIFS结果汇总到主工作簿
批量汇总日期工作簿最晚时间到主工作簿的VBA方案
前置准备
- 确保所有日期命名的工作簿(如
Workbook_20230505.xlsx)和主工作簿放在同一个文件夹中 - 主工作簿设置:A列为日期值(格式与工作簿名称中的日期一致,如
20230505),B列用于存放汇总的最晚时间
VBA实现代码
按下Alt+F11打开VBA编辑器,插入模块后粘贴以下代码:
Sub BatchSummarizeLatestTime() Dim mainWB As Workbook Dim sourceWB As Workbook Dim sourceWS As Worksheet Dim folderPath As String Dim fileName As String Dim targetDate As String Dim targetRow As Long Dim lastRow As Long Dim latestTime As Variant ' 设置主工作簿和文件夹路径 Set mainWB = ThisWorkbook folderPath = mainWB.Path & "\" ' 遍历文件夹中所有符合命名规则的工作簿 fileName = Dir(folderPath & "Workbook_*.xlsx") Do While fileName <> "" ' 提取工作簿名称中的日期(如从Workbook_20230505.xlsx中提取20230505) targetDate = Mid(fileName, 10, 8) ' 从第10位开始取8位,对应日期部分 ' 打开源工作簿 Set sourceWB = Workbooks.Open(folderPath & fileName) ' 假设数据在Sheet1,可根据实际修改工作表名称 Set sourceWS = sourceWB.Worksheets("Sheet1") ' 获取数据区域的最后一行(避免固定范围的局限性) lastRow = sourceWS.Cells(sourceWS.Rows.Count, "B").End(xlUp).Row ' 计算排除SYSTEM和VOID的最晚时间 On Error Resume Next ' 处理无符合条件数据的情况 latestTime = Application.WorksheetFunction.MaxIfs( _ sourceWS.Range("B3:B" & lastRow), _ sourceWS.Range("C3:C" & lastRow), "<>SYSTEM", _ sourceWS.Range("C3:C" & lastRow), "<>VOID" _ ) On Error GoTo 0 ' 在主工作簿中查找对应日期的行 On Error Resume Next targetRow = mainWB.Worksheets("Sheet1").Columns("A").Find( _ What:=targetDate, LookIn:=xlValues, LookAt:=xlWhole _ ).Row On Error GoTo 0 ' 如果找到对应行,写入结果 If targetRow > 0 Then mainWB.Worksheets("Sheet1").Cells(targetRow, "B").Value = latestTime End If ' 关闭源工作簿(不保存) sourceWB.Close SaveChanges:=False ' 获取下一个工作簿 fileName = Dir() Loop MsgBox "汇总完成!" End Sub
关键说明
- 动态数据范围:代码中用
lastRow获取Time列的最后一行,替代固定的B13,适配不同行数的数据源 - 日期提取:
Mid(fileName,10,8)是针对Workbook_YYYYMMDD.xlsx的命名规则,若你的命名格式不同(如20230505_Workbook.xlsx),需调整参数 - 错误处理:加入
On Error Resume Next避免因无符合条件数据或日期不存在导致程序崩溃 - 工作表名称:代码中默认使用
Sheet1,需根据实际工作表名称修改主工作簿和源工作簿的表名
使用方法
- 保存主工作簿为启用宏的工作簿(.xlsm格式)
- 运行上述宏即可自动遍历所有日期工作簿,完成汇总
内容的提问来源于stack exchange,提问作者lhuiying
相关产品推荐
相关产品推荐

