ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 Office知识技巧免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 704|回复: 9

怎么用VBA汇总多个工作簿的第一个工作表,万分感谢

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-4-17 11:17 | 显示全部楼层 |阅读模式
是一个新手,没有接触过VBA,在网上查了很多资料也没有解决,拜托各位了

附件里面有两个工作簿,需要汇总大概100这样的工作簿中的第一个sheet到一个新的excel中

万分感谢

汇总实验.rar

71.3 KB, 下载次数: 14

TA的精华主题

TA的得分主题

发表于 2019-4-17 11:46 | 显示全部楼层
电子表格一键合并与拆分工具箱.zip (91.83 KB, 下载次数: 30)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-17 11:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-4-17 14:15 | 显示全部楼层
楼主是打算怎么个汇总法?模拟一下数据看看啊。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-17 14:52 | 显示全部楼层
kuangben8 发表于 2019-4-17 14:15
楼主是打算怎么个汇总法?模拟一下数据看看啊。

一个工作簿里面有三个sheet,名字分别为签到表,本月汇总,sheet3。多个同类的工作簿放在同一个文件夹内,把每个工作簿中的本月汇总表格内的数据汇总到新的工作表内~

TA的精华主题

TA的得分主题

发表于 2019-4-17 15:13 | 显示全部楼层
小太阳CMJ 发表于 2019-4-17 14:52
一个工作簿里面有三个sheet,名字分别为签到表,本月汇总,sheet3。多个同类的工作簿放在同一个文件夹内 ...

是简单的复制粘贴,还是按照汇总表里的人名进行累加汇总?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-17 15:42 | 显示全部楼层
kuangben8 发表于 2019-4-17 15:13
是简单的复制粘贴,还是按照汇总表里的人名进行累加汇总?

你好,这个回复里面我没办法添加图片,那个表格的附件我上传了,不复制粘贴,直接利用VBA一键汇总多个工作簿内相同表名的数据

TA的精华主题

TA的得分主题

发表于 2019-4-17 21:40 | 显示全部楼层
不知道理解的对不对,仅供参考。
  1. Sub 汇总()
  2.     Dim numb%, fil As String, filename As String, wb As Workbook, sht As Worksheet, t
  3.     Dim n%, m%, k%, j%, arr, brr, crr(), i%, num%
  4.     Dim dic1 As Object, dic2 As Object
  5.     t = Timer
  6.     Set dic1 = CreateObject("Scripting.Dictionary")
  7.     Set dic2 = CreateObject("Scripting.Dictionary")
  8.     With ThisWorkbook.Worksheets("汇总")
  9.         Application.ScreenUpdating = False
  10.         .Cells.Clear    '全部清除
  11. '        .Range("A1") = "http://club.excelhome.net/thread-1472164-1-1.html"     '原帖地址
  12.         filename = Dir(ThisWorkbook.Path & "\*.xls")    '取得代码工作簿所在文件夹下的文件名
  13.         Do While filename <> ""
  14.             If filename <> ThisWorkbook.Name Then
  15.                 '                numb = .Range("A1").CurrentRegion.Rows.Count + 1
  16.                 fil = ThisWorkbook.Path & "" & filename   '获取对应路径下的文件
  17.                 Set wb = GetObject(fil)
  18.                 Set sht = wb.Worksheets("汇总")
  19.                 If .Range("A2") = "" Then
  20.                     arr = sht.Range("A4").CurrentRegion
  21.                     .Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  22.                     Erase arr    '清空数组
  23.                 Else
  24.                     n = .Cells(.Rows.Count, 2).End(3).Row         '获取当前表中最后一行的行号
  25.                     arr = .Range("A4:BB" & n)
  26.                     m = sht.Cells(sht.Rows.Count, 2).End(3).Row    '获取提取数据表中最后一行的行号
  27.                     brr = sht.Range("A4:BB" & m)
  28.                     For k = 1 To UBound(arr, 1)     '先将汇总表人名写入字典中
  29.                         dic1(arr(k, 2)) = k         '将数组元素装入字典中,并将对应条目值取对应序号
  30.                     Next
  31.                     'For j = 1 To UBound(brr, 1)     '再将待汇总表中的人名写入字典中
  32.                     '  dic2(brr(j, 2)) = ""
  33.                     'Next
  34.                     ReDim crr(1 To UBound(brr, 1), 1 To UBound(brr, 2))
  35.                     For j = 1 To UBound(brr, 1)
  36.                         If Not dic1.Exists(brr(j, 2)) Then
  37.                             i = i + 1
  38.                             For k = 1 To UBound(brr, 2)
  39.                                 crr(i, k) = brr(j, k)
  40.                             Next
  41.                         Else
  42.                             num = dic1.Item(brr(j, 2))
  43.                             For k = 4 To UBound(brr, 2)
  44.                                 arr(num, k) = arr(num, k) + brr(j, k)
  45.                             Next
  46.                         End If
  47.                     Next
  48.                     Rem 将数组重新写入单元格
  49.                     .Range("A4").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  50.                     .Range("A4").Offset(UBound(arr, 1)).Resize(UBound(crr, 1), UBound(crr, 2)) = crr
  51.                     Erase brr   '清空数组以备后续使用
  52.                 End If
  53.                 wb.Close False
  54.             End If
  55.             'Else
  56.             '  filename = Dir   '没有Else此句,运行到代码工作簿时进入无限循环而死机!
  57.             'End If  '也可以将end if 写在wb.Close False后面,就可以少一句filename = Dir
  58.             dic1.RemoveAll
  59.             dic2.RemoveAll   '清空字典后续重新使用
  60.             Erase arr
  61.             Erase crr        '清空crr数组后续重新使用
  62.             i = 0            'i恢复0值后续重新使用
  63.             filename = Dir
  64.         Loop
  65.         Application.ScreenUpdating = True
  66.     End With
  67.     MsgBox Format(Timer - t, "0.000 s")
  68. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-18 11:48 | 显示全部楼层
kuangben8 发表于 2019-4-17 21:40
不知道理解的对不对,仅供参考。

您好,非常感谢您分享的代码,能麻烦您帮我再解决一个问题吗?万分感谢,代码在运行过程中出现错误了,运行到Set wb = GetObject(fil) 提示432自动化操作时文件名或类名未找到,我网上百度了也没能找到对应的解决办法,麻烦您了
·
·

TA的精华主题

TA的得分主题

发表于 2019-4-18 11:55 | 显示全部楼层
小太阳CMJ 发表于 2019-4-18 11:48
您好,非常感谢您分享的代码,能麻烦您帮我再解决一个问题吗?万分感谢,代码在运行过程中出现错误了,运 ...

fil = ThisWorkbook.Path & "\" & filename   '获取对应路径下的文件
插入的代码这个符号弄丢了!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,每天学会一个新技能

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2020-4-4 02:16 , Processed in 1.119217 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表