夜雨聆风学习资料网

ARTICLE · 1030499

Excel VBA|多个文件,批量合并数据导入到当前表

Excel VBA|多个文件,批量合并数据导入到当前表
工作当中,避免不了进行数据导入,人工操作复制粘贴作业繁琐,VBA可以帮你快速实现自动化数据处理。
本次分享功能:运行代码,弹出文件选择框,按住 Ctrl 多选Excel文件;第一个文件复制表头,其余文件只追加数据行,不再重复带表头;只读打开源文件,带错误捕获,出错不中断、提示哪个文件异常;合并到当前激活工作表。
vba    
Sub 多选文件批量合并数据()
    Dim fd As FileDialog
    Dim selectedItem As Variant
    Dim wbSource As Workbook
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim lastR_Src As Long, lastC_Src As Long
    Dim lastR_Dest As Long
    Dim blnFirst As Boolean
    Dim cntFile As Long, cntRow As Long
    Dim errMsg As String
    '===== 配置区,按需修改 =====
    Const SourceSheetName As String = "Sheet1" '源文件读取哪个工作表
    '===========================
    On Error GoTo ErrHandle
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.EnableEvents = False
    Set wsDest = ActiveSheet '合并到当前激活工作表
    blnFirst = True
    cntFile = 0
    cntRow = 0
    '文件选择弹窗,支持多选
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Title = "多选需要合并的Excel文件(按住Ctrl多选)"
        .AllowMultiSelect = True
        .Filters.Clear
        .Filters.Add "Excel文件", "*.xls;*.xlsx;*.xlsm"
        If .Show <> -1 Then
            MsgBox "未选择任何文件,退出", vbInformation
            GoTo CleanUp
        End If
    End With
    '循环遍历选中的每一个文件
    For Each selectedItem In fd.SelectedItems
        cntFile = cntFile + 1
        Set wbSource = Workbooks.Open(Filename:=selectedItem, ReadOnly:=True)
        Set wsSource = wbSource.Worksheets(SourceSheetName)
        '获取源数据范围
        lastR_Src = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
        lastC_Src = wsSource.Cells(1, wsSource.Columns.Count).End(xlToLeft).Column
        If lastR_Src >= 1 Then
            '目标表最后一行
            lastR_Dest = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row
            If blnFirst Then
                '第一个文件:复制表头+全部数据
                wsSource.Range(wsSource.Cells(1, 1), wsSource.Cells(lastR_Src, lastC_Src)).Copy _
                    wsDest.Cells(lastR_Dest, 1)
                blnFirst = False
                cntRow = cntRow + lastR_Src
            Else
                '后面文件:跳过第1行表头,只复制数据行
                If lastR_Src >= 2 Then
                    wsSource.Range(wsSource.Cells(2, 1), wsSource.Cells(lastR_Src, lastC_Src)).Copy _
                        wsDest.Cells(lastR_Dest + 1, 1)
                    cntRow = cntRow + (lastR_Src - 1)
                End If
            End If
        End If
        wbSource.Close SaveChanges:=False '关闭源文件,不保存
    Next selectedItem
    MsgBox "合并完成!" & vbCrLf & "一共处理:" & cntFile & " 个文件" & vbCrLf & "导入总行数:" & cntRow, vbInformation
CleanUp:
    Set fd = Nothing
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.EnableEvents = True
    Exit Sub
ErrHandle:
    errMsg = errMsg & "【文件" & cntFile & "】" & selectedItem & vbCrLf & "错误:" & Err.Description & vbCrLf
    Resume Next '跳过出错文件,继续下一个
    Resume CleanUp
End Sub
使用步骤
1. 打开你的汇总Excel,按  Alt+F11  打开VBA编辑器
2. 菜单【插入】→【模块】,粘贴全部代码
3. 回到Excel, Alt+F8 ,选中 多选文件批量合并数据  → 执行
4. 在弹窗按住 Ctrl 点选多个需要合并的文件,确定
修改说明(按需调整)
1.  SourceSheetName = "Sheet1" :如果源文件数据在别的工作表名,改成对应的名字,例如  "数据" 
2. 如果想要粘贴为数值(不带格式):把 .Copy 那一行改成
vba    
.Copy
wsDest.Cells(lastR_Dest, 1).PasteSpecial Paste:=xlPasteValues
限制&注意事项
- 所有源文件列结构必须一致(表头顺序相同),否则数据错位
- 密码保护的文件无法打开,会跳过并记录错误
- 合并前建议清空汇总表原有数据,避免新旧数据叠加
(如果你需要其他方式的代码)
🌹专业制作VBA解决工作中的实际问题。
关注留言备注可以发给你:
✅ 数组版(超大文件,不用Copy,速度更快)
✅ 自动增加【来源文件名】一列,标记每条数据来自哪个文件
✅ 合并完成自动去除重复行
一键导入外部Excel!VBA文件选择器,自动提取数据到当前表
别再只用RANK!Excel多条件排名,业绩产量排序直接套用
做数据汇总必用!最大/最小/排序全套公式,告别手动拉表格

相关学习资料