EXCEL VBA合并当前工作簿的所有工作表sheet

将当前工作簿 的所有工作表合并到到1个新的sheet,

新的sheet名称为 合并

分为2个vba脚本 ,

  1. 不包含表头: 每个sheet的表头都是相同的,所以合并时不需要表头
  2. 包含表头

VBA代码通过KIMI生成

1 不包含表头(标题行)

复制代码
Sub 合并所有工作表_不含表头()
    Dim ws As Worksheet, wsNew As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim destRow As Long
    Dim copyRange As Range
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    '如已存在"合并"工作表,则删除
    On Error Resume Next
    Set wsNew = ThisWorkbook.Worksheets("合并")
    If Not wsNew Is Nothing Then wsNew.Delete
    On Error GoTo 0
    
    '新建"合并"工作表
    Set wsNew = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    wsNew.Name = "合并"
    
    destRow = 1   '目标行指针
    
    '遍历所有工作表
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "合并" Then
            If Application.WorksheetFunction.CountA(ws.Cells) > 0 Then
                '=== 关键修复:用 Find 取真正的最后一行/列 ===
                lastRow = ws.Cells.Find(What:="*", _
                                        After:=ws.Cells(1, 1), _
                                        SearchOrder:=xlByRows, _
                                        SearchDirection:=xlPrevious).Row
                lastCol = ws.Cells.Find(What:="*", _
                                        After:=ws.Cells(1, 1), _
                                        SearchOrder:=xlByColumns, _
                                        SearchDirection:=xlPrevious).Column
                
                '标题行:只在第一张工作表出现时复制
                If destRow = 1 Then
                    wsNew.Cells(destRow, 1).Value = "来源工作表"
                    ws.Range(ws.Cells(1, 1), ws.Cells(1, lastCol)).Copy _
                        Destination:=wsNew.Cells(destRow, 2)
                    destRow = destRow + 1
                End If
                
                '复制数据区(不含标题)
                Set copyRange = ws.Range(ws.Cells(2, 1), ws.Cells(lastRow, lastCol))
                copyRange.Copy wsNew.Cells(destRow, 2)
                
                '在A列写入来源工作表名称
                wsNew.Range(wsNew.Cells(destRow, 1), _
                            wsNew.Cells(destRow + copyRange.Rows.Count - 1, 1)).Value = ws.Name
                
                '移动目标行指针
                destRow = destRow + copyRange.Rows.Count
            End If
        End If
    Next ws
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "已完成合并,请查看"合并"工作表!", vbInformation
End Sub

2 包含表头(标题行)

复制代码
Sub 合并所有工作表_含表头()
    Dim ws As Worksheet, wsNew As Worksheet
    Dim lastRow As Long, lastCol As Long
    Dim destRow As Long
    Dim copyRange As Range
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    '如已存在"合并"工作表,则删除
    On Error Resume Next
    Set wsNew = ThisWorkbook.Worksheets("合并")
    If Not wsNew Is Nothing Then wsNew.Delete
    On Error GoTo 0
    
    '新建"合并"工作表
    Set wsNew = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    wsNew.Name = "合并"
    
    destRow = 1   '目标行指针
    
    '遍历所有工作表
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "合并" Then
            If Application.WorksheetFunction.CountA(ws.Cells) > 0 Then
                '=== 用 Find 取真正的最后一行/列 ===
                lastRow = ws.Cells.Find(What:="*", _
                                        After:=ws.Cells(1, 1), _
                                        SearchOrder:=xlByRows, _
                                        SearchDirection:=xlPrevious).Row
                lastCol = ws.Cells.Find(What:="*", _
                                        After:=ws.Cells(1, 1), _
                                        SearchOrder:=xlByColumns, _
                                        SearchDirection:=xlPrevious).Column
                
                '复制当前工作表全部内容(含表头)
                Set copyRange = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))
                copyRange.Copy wsNew.Cells(destRow, 2)   '从 B 列开始粘贴
                
                '在 A 列写入来源工作表名称
                wsNew.Range(wsNew.Cells(destRow, 1), _
                            wsNew.Cells(destRow + copyRange.Rows.Count - 1, 1)).Value = ws.Name
                
                '移动目标行指针
                destRow = destRow + copyRange.Rows.Count
            End If
        End If
    Next ws
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "已完成合并(含表头),请查看"合并"工作表!", vbInformation
End Sub
相关推荐
SunnyDays101120 小时前
Python 将 Excel(XLS/XLSX)转换为 JSON:导出工作簿、工作表、单元格区域与自定义 JSON 结构
python·json·excel·excel 转 json·导出 excel 到 json·xlsx 转 json·xls 转 json
chatexcel21 小时前
ChatExcel AI Word 升级:多模态读资料、按模板生成、智能排版配图,还能批注修订和联动Excel 复核
人工智能·ai·word·excel·ai写作
北极糊的狐1 天前
Excel快速拆分一列数据为两列(领养例子)该摘要描述了如何将包含姓名和电话的混合数据列拆分为单独的两列
excel
搭贝低代码1 天前
财务管控系统架构设计:从Excel到数字化管控平台的技术跃迁
低代码·系统架构·excel
ms365copilot2 天前
Excel 新模型Claude Opus 5
人工智能·excel
CodexDave2 天前
Python 自动化接单实战(二):Excel 批量清洗如何把规则与异常分开
python·自动化·excel·python自动化·数据处理·excel清洗·异常报告
蓝创工坊Blue Foundry2 天前
发票、凭证和对账单怎么整理成 Excel?先定义字段,再逐项复核
pdf·ocr·excel·文心一言·paddlepaddle
ms365copilot2 天前
Copilot直接读取Excel,一键生成完整数据汇报PPT
powerpoint·excel·copilot
石马马户3 天前
excel中使用宏绘制折线图
excel
tedcloud1233 天前
Orca 部署指南:开源 AI 推理服务的 Linux 部署实践
linux·运维·服务器·人工智能·开源·自动化·excel