ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用vba代码实现跨工作簿Consolidate汇总数据?

如何利用vba代码实现跨工作簿Consolidate汇总数据?

作者:绿色风 分类: 时间:2022-08-17 浏览:95
楼主
kevinchengcw
Q: 如何利用vba代码实现跨工作簿Consolidate汇总数据?
A: 示例代码如下:
  1. Sub test()
  2. Dim Dic As Object, Dic2 As Object, Arr, N&, WB As Workbook, Ws As Worksheet, Rng As Range, FN$
  3. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目,字典1用来存放各工作簿要汇总的数据区域,字典2用来存放打开的文件列表(因用consolidate汇总的工作簿要打开才能正常工作)
  4. Set Dic2 = CreateObject("scripting.dictionary")
  5. FN = Dir(ThisWorkbook.Path & "\*.xls?")  '枚举当前目录下的excel工作簿
  6. Do While FN <> ""  '当获取到的不为空值时继续循环
  7.     If FN <> ThisWorkbook.Name Then  '如果当前文件名不是当前工作簿的文件名,则
  8.         Set WB = GetObject(ThisWorkbook.Path & "\" & FN)  '通过getobject隐藏打开指定文件
  9.         Dic2.Add FN, ""  '把文件名添加到打开文件列表
  10.         For Each Ws In WB.Worksheets  '循环各个工作表
  11.             If WorksheetFunction.CountA(Ws.UsedRange) > 0 Then  '确定是否是有效的工作表
  12.                 With Ws
  13.                     Set Rng = .UsedRange.Find("W")  '查找关键字所在位置
  14.                     If Not Rng Is Nothing Then  '如果找到关键字位置,则根据关键字位置生成数据区位置的R1C1格式地址(含文件名及工作表名)作为key值存入字典1中
  15.                         Dic.Add "[" & WB.Name & "]" & Ws.Name & "!" & .Range(Rng.Offset(2), .Cells(.Cells(.Rows.Count, Rng.Column).End(3).Row, .Cells(Rng.Row, .Columns.Count).End(1).Column)).Address(ReferenceStyle:=xlR1C1), ""
  16.                     End If
  17.                     Set Rng = Nothing  '防止再次使用变量时带入上次数据,使用结束后清空项目
  18.                 End With
  19.             End If
  20.         Next
  21.         Set WB = Nothing  '清空工作簿项目
  22.     End If
  23.     FN = Dir  '循环到下一个文件
  24. Loop
  25. With [a3]  '指定汇总表汇总数据区的第一个单元格位置
  26.     Rows(.Row & ":" & Rows.Count).ClearContents  '清空原有数据
  27.     .Consolidate Sources:=Dic.keys, leftcolumn:=True, Function:=xlSum  '所有找到的数据区域根据左侧数据标识进行汇总,并写入指定位置开始的汇总区域
  28. End With
  29. Arr = Dic2.keys  '将字典2的key值赋值给数组
  30. For N = LBound(Arr) To UBound(Arr)  '循环数组各项(即已打开的文件列表)
  31.     Workbooks(Arr(N)).Close False  '关闭循环到的文件
  32. Next N
  33. Set Dic = Nothing  '清空字典项目
  34. Set Dic2 = Nothing
  35. End Sub

详见附件及素材源帖.
lx.rar
2楼
xyf2210
下载收藏学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap