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

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.dtcms.com/a/284547.html

相关文章:

  • 切比雪夫不等式的理解以及推导【超详细笔记】
  • C语言---动态内存管理
  • 李宏毅《生成式人工智能导论》 | 第15讲-第18讲:生成的策略-影像有关的生成式AI
  • Google(谷歌)搜索引擎蜘蛛IP地址段
  • ubuntu--curl
  • 《Java Web 核心:Servlet、会话与过滤器笔记》
  • AndroidStudio环境搭建
  • vue svg实现一个环形进度条组件
  • 石子入水波纹效果:顶点扰动着色器实现
  • 【44】MFC入门到精通——MFC 通过Button按钮添加控件变量实现:按下 按钮变色 (比如开关 打开关闭状态) MFC更改button控颜色
  • Git简介与特点:从Linux到分布式版本控制的革命
  • 找不到或无法加载主类 org.gradle.wrapper.GradleWrapperMain
  • Linux Swap区深度解析:为何禁用?何时需要?
  • 【Java EE初阶 --- 网络原理】网络编程
  • Vue3 + WebSocket
  • 基于现代R语言【Tidyverse、Tidymodel】的机器学习方法
  • 3.2 函数参数与返回值
  • .vscode 扩展配置
  • 浅析网络安全面临的主要威胁类型及对应防护措施
  • 【C++指南】C++ list容器完全解读(四):反向迭代器的巧妙实现
  • 如何做好DNA-SIP?
  • 【41】MFC入门到精通——MFC中 GetLBText()、GetWindowText()、SetWindowText区别
  • 扭蛋机小程序开发:开启线上娱乐新风尚
  • 分布式光伏发电系统中的“四可”指的是什么?
  • 教资科三【信息技术】— 学科知识: 第一章(信息技术基础)
  • 基于springboot+vue+mysql技术的实验室管理系统(源码+论文)
  • 044_设计模式入门(创建型 / 结构型 / 行为型)
  • 【解决方案】鸿蒙 / 矿鸿系统 Shell 无故退出问题(息屏导致)详解
  • Spatial Frequency Modulation for Semantic Segmentation。针对图像下采样造成信息丢失问题的解决思路
  • 深入理解 Spring Boot Starter 的生成机制