Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4634|回复: 5

[已解决]如何写代码可以抓取同一文件夹下的指定列数据并进行汇总?

[复制链接]
发表于 2017-7-10 11:15 | 显示全部楼层 |阅读模式
本帖最后由 czl103 于 2017-7-10 14:49 编辑

如何写代码可以抓取同一文件夹下的指定列数据并进行汇总,结果只显示汇总 。

如附件所示,每个文件都有各个员工的姓名、年龄、部门、金额,需要得到的结果为:
财务部:15003;
人事部:xxx;
销售部:yyy

谢谢大虾!

最佳答案
2017-7-10 14:16
czl103 发表于 2017-7-10 13:48
太牛了! 能麻烦高手大概解释下每行代码的意思么? 不胜感激!
  1. Private Sub CommandButton1_Click()
  2. Dim MyPath$, MyName$, sh As Workbook, i&, Arr, Brr(1 To 100, 1 To 2) ' 定义变量
  3. Set d = CreateObject("Scripting.Dictionary") '定义字典
  4. On Error Resume Next '忽略错误
  5. Application.ScreenUpdating = False '关闭屏幕刷新,提高速度
  6. MyPath = ThisWorkbook.Path & "" '获得当前工作簿所在的地址
  7. MyName = Dir(MyPath & "*.*") '获得文件夹内的文件名
  8. Do While MyName <> "" '开始在文件夹内的文件中开始循环
  9.     If MyName <> ThisWorkbook.Name Then '文件名不等于当前工作簿时进行以下操作
  10.         Set sh = GetObject(MyPath & MyName) '打开工作簿
  11.         Arr = sh.ActiveSheet.Range("A1").CurrentRegion '将打开的工作簿A1单元格所在的区域放入数组
  12.         For i = 2 To UBound(Arr) '从数组的第二项开始循环,因为第一项为标题
  13.             If d.exists(Arr(i, 3)) Then '判断在不在字典内,如果在进行以下操作
  14.                 k = d(Arr(i, 3)) '返回字典内的关键字所在的位置,也就是返回二维数组的行号
  15.                 Brr(k, 2) = Brr(k, 2) + Arr(i, 4) '将关键字对应的项目求和
  16.             Else '如果字典内没有进行以下操作
  17.                 m = m + 1 '定义一个新位置
  18.                 d(Arr(i, 3)) = m '将这个关键放入新位置,可以理解为放入一个新的二维数组,m为数组的行号
  19.                 Brr(m, 1) = Arr(i, 3) & "部:" '数组第一列为名称
  20.                 Brr(m, 2) = Arr(i, 4) '数组第二列为对应的数据
  21.             End If
  22.             Workbooks(MyName).Close True '关闭打开的工作簿
  23.         Next
  24.     End If
  25.     MyName = Dir '获得下一个文件名
  26. Loop
  27. ThisWorkbook.ActiveSheet.Range("A1").Resize(UBound(Brr), 2) = Brr '将刚才的统计数据放在单元格内
  28. End Sub
复制代码
字典数组不懂得话,估计也看不懂

汇总数据.rar

6.06 KB, 下载次数: 24

 楼主| 发表于 2017-7-10 12:20 | 显示全部楼层
回复

使用道具 举报

发表于 2017-7-10 12:52 | 显示全部楼层
  1. Private Sub CommandButton1_Click()
  2. Dim MyPath$, MyName$, sh As Workbook, i&, Arr, Brr(1 To 100, 1 To 2)
  3. Set d = CreateObject("Scripting.Dictionary")
  4. On Error Resume Next
  5. Application.ScreenUpdating = False
  6. MyPath = ThisWorkbook.Path & ""
  7. MyName = Dir(MyPath & "*.*")
  8. Application.ScreenUpdating = False
  9. Do While MyName <> ""
  10.     If MyName <> ThisWorkbook.Name Then
  11.         Set sh = GetObject(MyPath & MyName)
  12.         Arr = sh.ActiveSheet.Range("A1").CurrentRegion
  13.         For i = 2 To UBound(Arr)
  14.             If d.exists(Arr(i, 3)) Then
  15.                 k = d(Arr(i, 3))
  16.                 Brr(k, 2) = Brr(k, 2) + Arr(i, 4)
  17.             Else
  18.                 m = m + 1
  19.                 d(Arr(i, 3)) = m
  20.                 Brr(m, 1) = Arr(i, 3) & "部:"
  21.                 Brr(m, 2) = Arr(i, 4)
  22.             End If
  23.             Workbooks(MyName).Close True
  24.         Next
  25.     End If
  26.     MyName = Dir
  27. Loop
  28. ThisWorkbook.ActiveSheet.Range("A1").Resize(UBound(Brr), 2) = Brr
  29. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-7-10 13:48 | 显示全部楼层

太牛了! 能麻烦高手大概解释下每行代码的意思么? 不胜感激!
回复

使用道具 举报

发表于 2017-7-10 14:16 | 显示全部楼层    本楼为最佳答案   
czl103 发表于 2017-7-10 13:48
太牛了! 能麻烦高手大概解释下每行代码的意思么? 不胜感激!
  1. Private Sub CommandButton1_Click()
  2. Dim MyPath$, MyName$, sh As Workbook, i&, Arr, Brr(1 To 100, 1 To 2) ' 定义变量
  3. Set d = CreateObject("Scripting.Dictionary") '定义字典
  4. On Error Resume Next '忽略错误
  5. Application.ScreenUpdating = False '关闭屏幕刷新,提高速度
  6. MyPath = ThisWorkbook.Path & "" '获得当前工作簿所在的地址
  7. MyName = Dir(MyPath & "*.*") '获得文件夹内的文件名
  8. Do While MyName <> "" '开始在文件夹内的文件中开始循环
  9.     If MyName <> ThisWorkbook.Name Then '文件名不等于当前工作簿时进行以下操作
  10.         Set sh = GetObject(MyPath & MyName) '打开工作簿
  11.         Arr = sh.ActiveSheet.Range("A1").CurrentRegion '将打开的工作簿A1单元格所在的区域放入数组
  12.         For i = 2 To UBound(Arr) '从数组的第二项开始循环,因为第一项为标题
  13.             If d.exists(Arr(i, 3)) Then '判断在不在字典内,如果在进行以下操作
  14.                 k = d(Arr(i, 3)) '返回字典内的关键字所在的位置,也就是返回二维数组的行号
  15.                 Brr(k, 2) = Brr(k, 2) + Arr(i, 4) '将关键字对应的项目求和
  16.             Else '如果字典内没有进行以下操作
  17.                 m = m + 1 '定义一个新位置
  18.                 d(Arr(i, 3)) = m '将这个关键放入新位置,可以理解为放入一个新的二维数组,m为数组的行号
  19.                 Brr(m, 1) = Arr(i, 3) & "部:" '数组第一列为名称
  20.                 Brr(m, 2) = Arr(i, 4) '数组第二列为对应的数据
  21.             End If
  22.             Workbooks(MyName).Close True '关闭打开的工作簿
  23.         Next
  24.     End If
  25.     MyName = Dir '获得下一个文件名
  26. Loop
  27. ThisWorkbook.ActiveSheet.Range("A1").Resize(UBound(Brr), 2) = Brr '将刚才的统计数据放在单元格内
  28. End Sub
复制代码
字典数组不懂得话,估计也看不懂
回复

使用道具 举报

 楼主| 发表于 2017-7-10 14:49 | 显示全部楼层
chart888 发表于 2017-7-10 14:16
字典数组不懂得话,估计也看不懂

太感谢了 大虾!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 10:27 , Processed in 0.285915 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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