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
相关推荐
Non-existent9875 天前
WPS批量清理单元格空白字符的4种方法-异常数字格式处理-实战
excel·wps
Channing Lewis5 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel
jarreyer5 天前
【数据分析绘图】excel绘图和bi工具区别
数据挖掘·数据分析·excel
chatexcel5 天前
ChatExcel Max使用教程:图片、PDF、网页与复杂Excel的一站式数据分析
数据分析·pdf·excel
cngkqy5 天前
excel从某一列中用match筛选匹配的数据
excel
qq_546937275 天前
Excel批量转PDF_Word_图片,支持自动合并报表,效率翻倍。
pdf·word·excel
ai_coder_ai5 天前
在自动化脚本中操作excel文件
运维·自动化·excel
三千花灯5 天前
【Playwright】 自动化测试之参数化登录(Excel/CSV 数据源)
人工智能·机器学习·excel
罗政5 天前
AI工作流实现Excel全自动化(支持SQL)-案例:医院门诊排班表
人工智能·自动化·excel
小妖6665 天前
excel 怎么在单元格内容自动加上一段文字不能用公式
excel·vba