问题很多,解决的方法很多,对于合并当前文件夹下的所有Excel文件,我之前分享是使用Python的第三方库Pandas来解决的。

“人生苦短,我用Python”说的就是Python简洁高效的特点。当然即便是每天跟数据打交道的人,也不一定人人都会Python,这里我再分享一种通用一点的方法,使用Excel自带的VBA。

还拿上次需要合并的各班级成绩Excel表为例,在需要合并Excel工作表的文件夹中新建一个Excel文件,命名为“合并.xlsx”,打开该文件,在Visual Basic编辑器中插入模块,将下面的VBA代码粘贴进去。

Sub 合并()
    Dim MyPath, MyName, AWbName
    Dim Wb As Workbook, WbN As String
    Dim i As Long
    Dim Num As Long
    Dim BOX As String

    Application.ScreenUpdating = False '关闭屏幕更新
    MyPath = ActiveWorkbook.Path '获取当前工作簿的文件位置

    '获取文件夹下的所有以“.xls”结尾的文件,根据实际情况可改成“.xlsx”
    MyName = Dir(MyPath & "\" & "*.xls")
    AWbName = ActiveWorkbook.Name '获取当前工作簿的名称
    Num = 0

    Do While MyName <> ""
        If MyName <> AWbName Then
            Set Wb = Workbooks.Open(MyPath & "\" & MyName)
            Num = Num + 1
            With Workbooks(1).ActiveSheet
                '写入Excel文件名,如果文件为“.xlsx”格式,这里的“减 4”改为“减 5”
                .Cells(.Range("A65536").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
                
                '写入Excel文件内容
                For i = 1 To Wb.Sheets.Count
                    Wb.Sheets(i).UsedRange.Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
                Next
                WbN = WbN & Chr(13) & Wb.Name
                Wb.Close False
            End With
        End If
        MyName = Dir
    Loop

    Range("A1").Select
    Application.ScreenUpdating = True '恢复屏幕更新
    MsgBox "共合并了" & Num & "个工作簿。如下:" & Chr(13) & WbN, vbInformation, "提示"
End Sub

运行宏,即可得到合并后的结果:

vba合并excel

标签: Excel, VBA

已有 3 条评论

  1. 宋楠 宋楠

    文件夹下的表都被打开了复制了,但是没有粘贴到当前工作簿中,这是为什么 :shock:

  2. 0.0 0.0

    大佬vba代码非常实用,不过如果想把文件名称放在A2怎么操作,
    如图中的A5和A18(不含标题的数据开始的地方)。

  3. 0.0 0.0

    大佬代码很实用,非常适用目前工作,找了很久了
    自学了一段时间,但离自己写出代码还差很多。
    1.如果想把文件名称放在数据到A2的位置,也就是图中A5:A14和A18:看不见了 :???: 的位置
    (不含标题的数据开头的相对位置),2.还有想用图标点击一下实现这个功能,并且只生效一次,生效过后图标自动销毁。

添加新评论