You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写无需指定表名、遍历工作簿所有工作表的Excel宏?

自动合并所有工作表数据的Excel宏实现

直接用VBA遍历工作簿内所有工作表即可解决,不用手动指定表名,新增工作表后也能自动识别。下面是完整代码和关键说明:

完整宏代码

Sub 合并所有工作表数据()
    Dim ws As Worksheet
    Dim 汇总表 As Worksheet
    Dim 源数据最后行 As Long
    Dim 汇总表最后行 As Long
    
    ' 创建或定位汇总表(这里命名为"汇总数据",可自行修改)
    On Error Resume Next
    Set 汇总表 = ThisWorkbook.Worksheets("汇总数据")
    On Error GoTo 0
    If 汇总表 Is Nothing Then
        Set 汇总表 = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
        汇总表.Name = "汇总数据"
        ' 复制第一个工作表的表头到汇总表(如果需要保留表头)
        ThisWorkbook.Worksheets(1).Rows(1).Copy 汇总表.Rows(1)
    End If
    
    ' 遍历所有工作表
    For Each ws In ThisWorkbook.Worksheets
        ' 跳过汇总表本身,避免重复合并
        If ws.Name <> 汇总表.Name Then
            ' 获取当前工作表的有效数据最后一行
            源数据最后行 = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
            ' 如果当前表有数据(表头不算的话,这里判断最后行>1)
            If 源数据最后行 > 1 Then
                ' 获取汇总表的最后空行
                汇总表最后行 = 汇总表.Cells(汇总表.Rows.Count, "A").End(xlUp).Row + 1
                ' 复制当前表的数据(从第2行开始,跳过表头)
                ws.Range("A2:" & ws.Cells(源数据最后行, ws.Columns.Count).End(xlToLeft).Address).Copy _
                    汇总表.Cells(汇总表最后行, "A")
            End If
        End If
    Next ws
    
    MsgBox "数据合并完成!", vbInformation
End Sub

关键说明

  • 自动识别所有工作表:通过For Each ws In ThisWorkbook.Worksheets循环遍历工作簿内每一个工作表,新增的工作表会被自动包含
  • 汇总表自动创建:如果没有名为"汇总数据"的工作表,宏会自动新建;如果已有,则直接在已有表上追加数据
  • 跳过表头重复:默认只复制第一个工作表的表头,后续工作表从第2行开始复制数据,避免表头重复(如果不需要表头,可删除复制表头的代码段)
  • 仅复制有效数据:通过End(xlUp)和End(xlToLeft)定位到实际有数据的区域,不会复制空行空列

使用注意

  1. 运行宏前建议先保存工作簿
  2. 如果部分工作表结构不一致(比如列数不同),合并后可能出现数据错位,需确保所有待合并工作表的列结构一致
  3. 可根据需求修改汇总表的名称(代码里的"汇总数据")

内容的提问来源于stack exchange,提问作者Marissa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:52:14