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