当前位置: 首页 > ai >正文

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

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

分为2个vba脚本 ,

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

VBA代码通过KIMI生成

1 不包含表头(标题行)

Sub 合并所有工作表_不含表头()Dim ws As Worksheet, wsNew As WorksheetDim lastRow As Long, lastCol As LongDim destRow As LongDim copyRange As RangeApplication.ScreenUpdating = FalseApplication.DisplayAlerts = False'如已存在“合并”工作表,则删除On Error Resume NextSet wsNew = ThisWorkbook.Worksheets("合并")If Not wsNew Is Nothing Then wsNew.DeleteOn Error GoTo 0'新建“合并”工作表Set wsNew = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))wsNew.Name = "合并"destRow = 1   '目标行指针'遍历所有工作表For Each ws In ThisWorkbook.WorksheetsIf ws.Name <> "合并" ThenIf Application.WorksheetFunction.CountA(ws.Cells) > 0 Then'=== 关键修复:用 Find 取真正的最后一行/列 ===lastRow = ws.Cells.Find(What:="*", _After:=ws.Cells(1, 1), _SearchOrder:=xlByRows, _SearchDirection:=xlPrevious).RowlastCol = ws.Cells.Find(What:="*", _After:=ws.Cells(1, 1), _SearchOrder:=xlByColumns, _SearchDirection:=xlPrevious).Column'标题行:只在第一张工作表出现时复制If destRow = 1 ThenwsNew.Cells(destRow, 1).Value = "来源工作表"ws.Range(ws.Cells(1, 1), ws.Cells(1, lastCol)).Copy _Destination:=wsNew.Cells(destRow, 2)destRow = destRow + 1End 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.CountEnd IfEnd IfNext wsApplication.DisplayAlerts = TrueApplication.ScreenUpdating = TrueMsgBox "已完成合并,请查看“合并”工作表!", vbInformation
End Sub

2 包含表头(标题行)

Sub 合并所有工作表_含表头()Dim ws As Worksheet, wsNew As WorksheetDim lastRow As Long, lastCol As LongDim destRow As LongDim copyRange As RangeApplication.ScreenUpdating = FalseApplication.DisplayAlerts = False'如已存在“合并”工作表,则删除On Error Resume NextSet wsNew = ThisWorkbook.Worksheets("合并")If Not wsNew Is Nothing Then wsNew.DeleteOn Error GoTo 0'新建“合并”工作表Set wsNew = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))wsNew.Name = "合并"destRow = 1   '目标行指针'遍历所有工作表For Each ws In ThisWorkbook.WorksheetsIf ws.Name <> "合并" ThenIf Application.WorksheetFunction.CountA(ws.Cells) > 0 Then'=== 用 Find 取真正的最后一行/列 ===lastRow = ws.Cells.Find(What:="*", _After:=ws.Cells(1, 1), _SearchOrder:=xlByRows, _SearchDirection:=xlPrevious).RowlastCol = 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.CountEnd IfEnd IfNext wsApplication.DisplayAlerts = TrueApplication.ScreenUpdating = TrueMsgBox "已完成合并(含表头),请查看“合并”工作表!", vbInformation
End Sub
http://www.xdnf.cn/news/15537.html

相关文章:

  • Java全栈面试实录:从电商支付到AIGC的深度技术挑战
  • 机器学习:数据清洗与预处理 | Python
  • 控制台输出的JAVA格斗小游戏-面向对象
  • CMake综合学习1: Cmake的模块化设计
  • 我爱学算法之—— 前缀和(下)
  • 【yaml文件格式说明】
  • 18001.QGroundControl操作文档(一)
  • 【测试100问】为什么要做接口测试?
  • 让K线说话!用形态匹配功能透视通达信数据黑洞
  • 【带权的并集查找】 P9235 [蓝桥杯 2023 省 A] 网络稳定性|省选-
  • 小程序性能优化全攻略:提升用户体验的关键策略
  • 每天一个前端小知识 Day 33 - 虚拟列表与长列表性能优化实践(Virtual Scroll)
  • Oracle 关于一些连接故障的总结
  • NumPy 详解
  • 职业发展:把工作“玩”成一场“自我升级”的游戏
  • Web前端性能优化原理与方法
  • 【kubernetes】--安全认证机制
  • xss-labs通关
  • 微服务架构升级:从Dubbo到SpringCloud的技术演进
  • PandaWiki与GitBook深度对比:AI时代的知识管理工具,选谁好?
  • 数据库(five day)——物物而不物于物,念念而不念于念。
  • 自适应哈希索引 和 日志缓冲区
  • 将Android Studio创建的一个apk工程放到Android15源码中构建
  • Jmeter+ant+jenkins接口自动化测试框架
  • docker run elasticsearch 报错
  • Spring之核心容器(IoC,DI,基本操作)详解
  • LeetCode|Day15|125. 验证回文串|Python刷题笔记
  • 912. 排序数组
  • 基于docker的redis集群
  • web前端用MVP模式搭建项目