打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VBA常用小代码202:汇总指定文件夹下工作簿数据到总表



诸君晚上好,今天我们聊如何汇总指定文件夹下多个工作簿的数据到总表。

这事儿常用的方法有三种,一种是SQL语句,一种是Power Query,还有一种就是VBA了。

相比前两种方法,VBA有更好的灵活性。

举栗,它可以允许标题行存在合并单元格,可以允许标题行存在多行,甚至可以允许数据明细区域有乱七八糟的合并单元格……等等。

不过,面对过于复杂的问题需要对代码细节作对应的调整……这也就需要小伙伴们不但有代码阅读能力,也要有一定的代码调整能力……

相比之下Power Query就是傻瓜式操作了……

……打住,星光俺扯远了,俺们这是VBA编程学习与实践公众号……


照例动画操作:


代码如下:


Sub Collectwk()

    'ExcelHome VBA编程学习与实践

    Dim Trow&, k&, arr, brr, i&, j&, book&, a&

    Dim p$, f$

    Application.ScreenUpdating = False '关闭屏幕更新

    On Error Resume Next '忽略代码运行中可能出现的错误继续运行

    '

    With Application.FileDialog(msoFileDialogFolderPicker)

    '取得用户选择的文件夹路径

        .AllowMultiSelect = False

        If .Show Then

            p = .SelectedItems(1)

        Else

            Exit Sub

        End If

    End With

    If Right(p, 1) <> '\' Then p = p & '\'

    '

    Trow = Val(InputBox('请输入标题的行数', '提醒'))

    If Trow < 0 Then MsgBox '标题行数不能为负数。', 64, '警告': Exit Sub

    Cells.ClearContents

    Cells.NumberFormat = '@'

    '清空当前表数据并设置单元格格式为文本

    '

    f = Dir(p & '*.xls') '开始遍历工作簿,并将每个工作簿的第一张工作表数据汇总

    Do While f <> ''

        If f <> ThisWorkbook.Name Then '避免同名文件重复打开出错

            With GetObject(p & f)

            '以'只读'形式读取文件时,使用getobject方法会比workbooks.open稍快

                arr = .Sheets(1).UsedRange '数据区域读入数组arr

                book = book 1 '标记一下是否首个Sheet

                If book = 1 Then

                    ReDim brr(1 To 200000, 1 To UBound(arr, 2))

                    '如果是首个表格,则声明一个结果数组,20万行

                    a = 1

                Else

                    a = Trow 1 '遍历读取arr数组时扣掉标题行

                End If

                For i = a To UBound(arr) '遍历行

                    k = k 1 '累加记录条数

                    For j = 1 To UBound(brr, 2) '遍历列

                        brr(k, j) = arr(i, j)

                    Next

                Next

                .Close False '关闭工作簿

            End With

        End If

        f = Dir '下一个表格

    Loop

    If k > 0 Then

        [a1].Resize(k, UBound(brr, 2)) = brr

        MsgBox '汇总完成。'

    End If

    Application.ScreenUpdating = True '恢复屏幕更新

End Sub


绕口令:

该段代码只是汇总指定文件夹下每个工作簿的第一张工作表的数据,下期我们再分享如何汇总指定文件夹下每个工作簿多个工作表表名包含某个关键词数据的代码——能一口气读完这段话我服~

一码不扫,
可以扫天下?

ExcelHome

VBA编程学习与实践

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
完全手册Excel VBA典型实例大全:通过368个例子掌握
Excel VBA 多条件多次筛选
Excel VBA小程序
Excel|VBA不打开的情况下获取其它工作簿中的值,指定文件夹下工作簿名字模糊搜索定位|文件夹
excel拆分合并技巧:将总表拆分成工作表的方法
VBA数组声明及赋值后的回填方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服