ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3333|回复: 11

[求助] 按表头汇总数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-3-30 16:30 | 显示全部楼层 |阅读模式
本帖最后由 czl103 于 2018-3-30 16:45 编辑

如附件所示,想达到的效果是,将1-4月的话费都汇总到汇总表中,结果却是只汇总了文件夹下第一个工作表的数据,烦请哪位高手修改一下代码,谢谢
最好简单解释一下,哪儿写的不对,不胜感激!

按表头汇总数据.rar

41.21 KB, 下载次数: 40

TA的精华主题

TA的得分主题

发表于 2018-3-30 17:31 | 显示全部楼层
本帖最后由 liucf 于 2018-3-30 17:32 编辑

加一个循环就行
Sub 按表头汇总()
  Dim MyPath$, MyName$, sh As Workbook, i&, Arr, Brr(1 To 100, 1 To 2) ' 定义变量
  Dim c1, c2, k, sr As String, S As Worksheet
  Set d = CreateObject("Scripting.Dictionary") '定义字典
  Application.ScreenUpdating = False '关闭屏幕刷新,提高速度
  Application.DisplayAlerts = False
  MyPath = ThisWorkbook.Path & "\" '获得当前工作簿所在的地址
  MyName = Dir(MyPath & "*.xls*") '获得文件夹内的文件名
  Do While MyName <> "" '开始在文件夹内的文件中开始循环
    If MyName <> ThisWorkbook.Name Then '文件名不等于当前工作簿时进行以下操作
      Set sh = GetObject(MyPath & MyName) '打开工作簿
      For Each S In sh.Sheets
        Arr = S.Range("A1").CurrentRegion '将打开的工作簿A1单元格所在的区域放入数组
        For j = 1 To UBound(Arr, 2)
          If Arr(1, j) = "对方号码" Then c1 = j '"分期数" ------需更新
          If Arr(1, j) = "实收通信费" Then c2 = j '"综合费用合计"------需更新
        Next
        For i = 2 To UBound(Arr) '从数组的第二项开始循环,因为第一项为标题
          If Arr(i, c1) <> "" Then
            If d.exists(Arr(i, c1)) Then '判断在不在字典内,如果在进行以下操作
              k = d(Arr(i, c1)) '返回字典内的关键字所在的位置,也就是返回二维数组的行号
              Brr(k, 2) = Brr(k, 2) + Arr(i, c2) '将关键字对应的项目求和'
            Else '如果字典内没有进行以下操作
              m = m + 1 '定义一个新位置
              d(Arr(i, c1)) = m '将这个关键放入新位置,可以理解为放入一个新的二维数组,m为数组的行号
              Brr(m, 1) = Arr(i, c1) '数组第一列为名称                                         "期"------需更新
              Brr(m, 2) = Arr(i, c2) '数组第二列为对应的数据
            End If
          End If
        Next
      Next
      Windows(MyName).Visible = True
      Workbooks(MyName).Close True '关闭打开的工作簿
    End If
    MyName = Dir '获得下一个文件名
  Loop
  With ThisWorkbook.ActiveSheet
    .Range("A1") = "对方号码:": .Range("B1") = "实收通信费" '"分期数:"------需更新
    .Range("A2").Resize(UBound(Brr), 2) = Brr '将刚才的统计数据放在单元格内
    k = .Range("A1048576").End(xlUp).Row + 1
    .Cells(k, 1) = "合计:"
    .Cells(k, 2) = WorksheetFunction.Sum(.Range(Cells(2, 2).Address, Cells(k, 2).Address))
  End With
  Application.ScreenUpdating = True
  Application.DisplayAlerts = True
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-3-30 17:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
没有遍历每个工作簿中的工作表,默认只汇总第一个工作表的数据。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-30 17:06 | 显示全部楼层
lsc900707 发表于 2018-3-30 17:03
没有遍历每个工作簿中的工作表,默认只汇总第一个工作表的数据。

如何遍历所有工作表,还请指教一二

TA的精华主题

TA的得分主题

发表于 2018-3-30 17:36 | 显示全部楼层
czl103 发表于 2018-3-30 17:06
如何遍历所有工作表,还请指教一二

代码已修改,详见附件:


按表头汇总数据.rar

41.22 KB, 下载次数: 66

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-3-30 19:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub test()
    Dim Dic, Mp$, Fs$, Wb As Workbook, x%, c%, C1%, C2%, R&, k&, arr1, arr2(1 To 100, 1 To 2), kk%, kkk%, T#
    T = Timer
    Application.ScreenUpdating = False
    Set Dic = CreateObject("scripting.dictionary")
    Mp = ThisWorkbook.Path & "\"
    Fs = Dir(Mp & "*.xlsx")
    Do
        Set Wb = Workbooks.Open(Mp & Fs)
        With Wb
            kk = kk + 1
            For x = 1 To .Sheets.Count
                kkk = kkk + 1
                arr1 = .Sheets(x).Range("A1").CurrentRegion
                For c = 1 To UBound(arr1, 2)
                    If arr1(1, c) = "对方号码" Then C1 = c
                    If arr1(1, c) = "实收通信费" Then C2 = c
                Next c
                For R = 2 To UBound(arr1)
                    If VBA.IsNumeric(arr1(R, C1)) = True Then
                        If Not Dic.exists(arr1(R, C1)) Then
                            k = k + 1
                            Dic(arr1(R, C1)) = k
                            arr2(k, 1) = arr1(R, C1)
                            arr2(k, 2) = arr1(R, C2)
                        Else
                            arr2(Dic(arr1(R, C1)), 2) = arr2(Dic(arr1(R, C1)), 2) + arr1(R, C2)
                        End If
                    End If
                Next R
            Next x
            .Close False
        End With
        Set Wb = Nothing
        
        Fs = Dir
    Loop While Fs <> ""
    With ThisWorkbook.Sheets(1)
        .UsedRange.Offset(1).Clear
        .[a2].Resize(UBound(arr2), 2) = arr2
    End With
    Application.ScreenUpdating = True
    Cells(k + 1, 1) = "总计"
    Cells(k + 1, 2) = Application.WorksheetFunction.Sum(Application.Index(arr2, 0, 2))
    VBA.MsgBox "亲,已经汇总了 " & kk & " 个工作簿,计 " & kkk & " 张工作表," & Chr(10) & "累计用时" & Format(Timer - T, "0.000秒"), 16 * 4, "友情提醒"
End Sub

TA的精华主题

TA的得分主题

发表于 2018-3-30 19:22 | 显示全部楼层
代码详见附件

555.rar

45.05 KB, 下载次数: 43

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-3 10:32 | 显示全部楼层
liucf 发表于 2018-3-30 17:31
加一个循环就行
Sub 按表头汇总()
  Dim MyPath$, MyName$, sh As Workbook, i&, Arr, Brr(1 To 100, 1 T ...

可以了 谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-3 10:34 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-3 10:44 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-6-17 14:05 , Processed in 0.036271 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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