目录

  • 1,合并文件夹下所有工作簿
    • 1.1,合并且建立超链接目录
      • 举例
  • 2,合并工作簿中所有工作表
    • 2.1,纵向合并
      • 举例
    • 2.2,横向合并
      • 举例
  • 3,合并文件夹下所有工作簿中所有工作表
    • 举例
    • 3.1,合并且显示原工作簿名称、原工作表名称
  • 4,合并文件夹下所有工作簿中同名工作表
    • 4.1,合并且显示原工作簿名称

1,合并文件夹下所有工作簿

适用将所有工作簿中所有工作表复制到1个新建工作簿中,不修改数据,原本一共有多少个工作表,合并后就有多少个工作表
如果存在同名工作表,复制后工作表名称会自动添加序号,如Sheet1 (2)

Sub 合并文件夹下所有工作簿()'文件夹下所有工作簿wb所有工作表ws合并为一个新工作簿(但不含子文件夹),不修改数据Dim write_wb As Workbook, wb As Workbook, sht As Worksheet, file_path$, file_name$file_path = "E:\测试\拆分表\"  '待合并工作簿所在的文件夹file_name = Dir(file_path & "*.xlsx")Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行Application.DisplayAlerts = False   '不显示警告信息Set write_wb = Workbooks.Add    '新建工作簿,合并文件Do While file_name <> ""Set wb = Workbooks.Open(file_path & file_name)For Each sht In wb.Worksheetssht.Copy After:=write_wb.Sheets(write_wb.Sheets.Count)Nextwb.Close (False)file_name = Dir  '下一个文件名Loop'保存文件save_file = file_path & "合并表.xlsx"write_wb.SaveAs filename:=save_filewrite_wb.Close (False)Application.ScreenUpdating = TrueApplication.DisplayAlerts = True
End Sub

1.1,合并且建立超链接目录

Sub 合并文件夹下所有工作簿并建立目录()'文件夹下所有工作簿wb所有工作表ws合并为一个新工作簿(但不含子文件夹),不修改数据,并建立目录超链接Dim write_wb As Workbook, wb As Workbook, list_ws As Worksheet, sht As WorksheetDim fso As Object, file_path$, file_name$, full_name$, newname$, w&file_path = "E:\测试\拆分表\"  '待合并工作簿所在的文件夹file_name = Dir(file_path & "*.xlsx")Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行Application.DisplayAlerts = False   '不显示警告信息Set write_wb = Workbooks.Add    '新建工作簿,合并文件Set list_ws = write_wb.Worksheets(1): list_ws.Name = "目录"list_ws.Cells(1, 1) = "目录(原工作簿名-工作表名)": list_ws.Cells(1, 2) = "超链接": w = 1Set fso = CreateObject("Scripting.FileSystemObject")Do While file_name <> ""Set wb = Workbooks.Open(file_path & file_name)For Each sht In wb.Worksheetssht.Copy After:=write_wb.Sheets(write_wb.Sheets.Count)full_name = fso.GetBaseName(file_name) & "-" & sht.Name  '原工作簿名-工作表名'write_wb.Sheets(write_wb.Sheets.Count).Name = full_name  '可对复制的ws重命名w = w + 1: list_ws.Cells(w, 1) = full_name: newname = write_wb.Sheets(write_wb.Sheets.Count).Namelist_ws.Hyperlinks.Add anchor:=list_ws.Cells(w, 2), Address:="", SubAddress:="'" & newname & "'!a1", TextToDisplay:=newnameNextwb.Close (False)file_name = Dir  '下一个文件名Loop'保存文件list_ws.Columns(1).AutoFit  '列宽自适应save_file = file_path & "合并表.xlsx"write_wb.SaveAs filename:=save_filewrite_wb.Close (False)Application.ScreenUpdating = TrueApplication.DisplayAlerts = True
End Sub

举例

合并《Excel·VBA按列拆分工作表》,sub2拆分后的工作表

并且每个工作簿中的工作表复制1个副本(1个地名表1个Sheet1表),这样就有5个工作簿各含2个工作表
工作簿合并且建立超链接目录结果

2,合并工作簿中所有工作表

对工作簿中相同格式的工作表进行合并,汇总所有工作表,保存在工作簿最前

2.1,纵向合并

Sub 合并工作簿中所有工作表_纵向()'当前工作簿wb所有工作表ws合并保存至新建工作表(插入最前),但之前ws不修改(工作表格式相同)Dim wb, ws, title_row, end_row, copy_title, i
'--------------------参数填写:title_row,数字,第1行为1向下递增;end_row,数字title_row = 1  '表头行数,仅复制1次;如果为0,则表示没有表头或表头每次都复制end_row = 0    '表尾行数,不参与合并Set wb = Application.ActiveWorkbook  '当前工作簿即为待合并工作簿Set ws = wb.Worksheets.Add(before:=Sheets(1))  '最前添加新sheet,即为合并工作表ws.Name = "合并表"If title_row > 0 Then copy_title = True Else copy_title = False  '是否复制表头If title_row < 0 Then Debug.Print "title_row参数错误,必须为>=0的整数": Exit SubApplication.ScreenUpdating = False  '关闭屏幕更新,加快程序运行Application.DisplayAlerts = False   '不显示警告信息'遍历,复制表体For i = 1 To Worksheets.count:If Worksheets(i).Name <> ws.Name ThenIf copy_title = True Then  '复制表头,仅执行1次Worksheets(i).Rows(1 & ":" & title_row).Copy ws.Range("A1")copy_title = FalseEnd If'首行为空,会导致后续数据被覆盖If WorksheetFunction.CountA(ws.Rows(1)) = 0 Then ws.Rows(1).Deletewrite_row = ws.UsedRange.Rows.count + 1  '合并工作表的第一个空行写入sheet_row = Worksheets(i).UsedRange.Rows.countWorksheets(i).Rows(title_row + 1 & ":" & sheet_row - end_row).Copy ws.Range("A" & write_row)End IfNextApplication.ScreenUpdating = TrueApplication.DisplayAlerts = True
End Sub

举例

合并《Excel·VBA按列拆分工作表》,sub1拆分后的工作表


合并参数:title_row = 1,end_row = 0

2.2,横向合并

Sub 合并工作簿中所有工作表_横向()'当前工作簿wb所有工作表ws合并保存至新建工作表(插入最前),但之前ws不修改(工作表格式相同)Dim ws As Worksheet, sht As Worksheet, write_col&Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行Application.DisplayAlerts = False   '不显示警告信息With ActiveWorkbookSet ws = .Worksheets.Add(before:=Sheets(1))  '最前添加新sheet,即为合并工作表ws.Name = "合并表"For Each sht In .WorksheetsIf sht.Name <> ws.Name Then'首列为空时,会导致后续数据被覆盖If WorksheetFunction.CountA(ws.Columns(1)) = 0 Then ws.Columns(1).Deletewrite_col = ws.UsedRange.Columns.Count + 1sht.UsedRange.Copy ws.Cells(1, write_col)End IfNextEnd WithApplication.ScreenUpdating = TrueApplication.DisplayAlerts = True
End Sub

举例

合并前

合并后

3,合并文件夹下所有工作簿中所有工作表

对相同格式的工作簿进行合并,汇总所有工作表,保存为单独工作簿

Sub 合并文件夹下所有工作簿中所有工作表()'文件夹下所有工作簿wb所有工作表ws合并保存至新建工作表(但不含子文件夹),但不修改原数据(工作表格式相同)Dim wb, ws, title_row, end_row, copy_title, file_path, file_name, save_file, i
'--------------------参数填写:title_row,数字,第1行为1向下递增;end_row,数字;file_path,合并文件夹title_row = 1  '表头行数,仅复制1次;如果为0,则表示没有表头或表头每次都复制end_row = 0    '表尾行数,不参与合并file_path = "E:\测试\拆分表\"  '待合并工作簿所在的文件夹file_name = Dir(file_path & "*.xlsx") If title_row > 0 Then copy_title = True Else copy_title = False  '是否复制表头If title_row < 0 Then Debug.Print "title_row参数错误,必须为>=0的整数": Exit SubApplication.ScreenUpdating = False  '关闭屏幕更新,加快程序运行Application.DisplayAlerts = False   '不显示警告信息Workbooks.Add    '新建工作表Set ws = ActiveSheetws.Name = "合并表"Do While file_name <> ""Set wb = Workbooks.Open(file_path & file_name)For i = 1 To Worksheets.count:If copy_title = True Then  '复制表头,仅执行1次wb.Worksheets(i).Rows(1 & ":" & title_row).Copy ws.Range("A1")copy_title = FalseEnd If'首行为空,会导致后续数据被覆盖If WorksheetFunction.CountA(ws.Rows(1)) = 0 Then ws.Rows(1).Deletewrite_row = ws.UsedRange.Rows.count + 1  '合并工作表的第一个空行写入sheet_row = wb.Worksheets(i).UsedRange.Rows.countwb.Worksheets(i).Rows(title_row + 1 & ":" & sheet_row - end_row).Copy ws.Range("A" & write_row)Nextwb.Close (False)file_name = Dir  '下一个文件名Loop'保存文件save_file = file_path & "合并表.xlsx"ws.Parent.SaveAs filename:=save_filews.Parent.Close (False)Application.ScreenUpdating = TrueApplication.DisplayAlerts = True
End Sub

举例

合并《Excel·VBA按列拆分工作表》,sub2拆分后的工作表

合并参数:title_row = 0,end_row = 0

3.1,合并且显示原工作簿名称、原工作表名称

应评论建议,增加在A列显示原工作簿名称,B列显示原工作表名称

Sub 合并文件夹下所有工作簿中所有工作表1()'文件夹下所有工作簿wb所有工作表ws合并保存至新建工作表(但不含子文件夹),但不修改原数据(工作表格式相同)Dim wb, ws, title_row, end_row, copy_title, file_path, file_name, save_file, fso As Object
'--------------------参数填写:title_row,数字,第1行为1向下递增;end_row,数字;file_path,合并文件夹title_row = 1  '表头行数,仅复制1次;如果为0,则表示没有表头或表头每次都复制end_row = 0    '表尾行数,不参与合并file_path = "E:\测试\拆分表\"  '待合并工作簿所在的文件夹file_name = Dir(file_path & "*.xlsx")If title_row > 0 Then copy_title = True Else copy_title = False  '是否复制表头If title_row < 0 Then Debug.Print "title_row参数错误,必须为>=0的整数": Exit SubApplication.ScreenUpdating = False  '关闭屏幕更新,加快程序运行Application.DisplayAlerts = False   '不显示警告信息Set fso = CreateObject("Scripting.FileSystemObject")Workbooks.Add    '新建工作表Set ws = ActiveSheet: ws.Name = "合并表": ws.Cells(1, "a").Resize(1, 2) = Array("原工作簿名称", "原工作表名称")Do While file_name <> ""Set wb = Workbooks.Open(file_path & file_name)For Each sht In wb.WorksheetsIf copy_title = True Then  '复制表头,仅执行1次sheet_col = sht.UsedRange.Columns.countsht.Range(Cells(1, "a"), Cells(title_row, sheet_col)).Copy ws.Cells(1, "c")copy_title = FalseEnd IfIf WorksheetFunction.CountA(ws.Rows(1)) = 0 Then ws.Rows(1).Deletewrite_row = ws.UsedRange.Rows.count + 1  '合并工作表的第一个空行写入sheet_row = sht.UsedRange.Rows.count: sheet_col = sht.UsedRange.Columns.countsht.Range(Cells(title_row + 1, "a"), Cells(sheet_row - end_row, sheet_col)).Copy ws.Cells(write_row, "c")ws.Cells(write_row, "a").Resize(sheet_row - title_row - end_row, 2) = Array(fso.GetBaseName(file_name), sht.Name)Nextwb.Close (False)file_name = Dir  '下一个文件名Loop'保存文件save_file = file_path & "合并表.xlsx"ws.Parent.SaveAs filename:=save_filews.Parent.Close (False)Application.ScreenUpdating = TrueApplication.DisplayAlerts = True
End Sub

4,合并文件夹下所有工作簿中同名工作表

对工作簿按工作表名称进行合并,汇总所有同名工作表,保存为单独工作簿

Sub 合并文件夹下所有工作簿中同名工作表()'文件夹下所有工作簿wb所有工作表ws按名称合并保存至新建工作表(但不含子文件夹),但不修改原数据(工作表格式相同)Dim dict As Object, sht As Worksheet, file_path$, file_name$, title_row, end_row, save_file$
'--------------------参数填写:title_row,数字,第1行为1向下递增;end_row,数字;file_path,合并文件夹title_row = 1  '表头行数,不参与合并end_row = 0    '表尾行数,不参与合并file_path = "E:\测试\拆分表\"  '待合并工作簿所在的文件夹file_name = Dir(file_path & "*.xlsx")Application.ScreenUpdating = FalseApplication.DisplayAlerts = FalseSet dict = CreateObject("scripting.dictionary")Set write_wb = Workbooks.Add    '新建工作簿,合并文件'新建工作簿默认工作表,防止有同名被合并表,导致整表复制后名称改变;但会缺少表头For Each sht In write_wb.Worksheetsdict(sht.Name) = ""NextDo While file_name <> ""Set wb = Workbooks.Open(file_path & file_name)For Each sht In wb.WorksheetsIf Not dict.Exists(sht.Name) Then  '不存在的,直接复制整表dict(sht.Name) = ""sht.Copy After:=write_wb.Sheets(write_wb.Sheets.count)ElseSet write_ws = write_wb.Worksheets(sht.Name)'首行为空,会导致后续数据被覆盖If WorksheetFunction.CountA(write_ws.Rows(1)) = 0 Then write_ws.Rows(1).Deletewrite_row = write_ws.UsedRange.Rows.count + 1  '合并工作表的第一个空行写入sheet_row = sht.UsedRange.Rows.countsht.Rows(title_row + 1 & ":" & sheet_row - end_row).Copy write_ws.Range("A" & write_row)End If'Exit DoNextwb.Close (False)file_name = Dir  '下一个文件名Loop'保存文件save_file = file_path & "合并表.xlsx"write_wb.SaveAs filename:=save_filewrite_wb.Close (False)Application.ScreenUpdating = TrueApplication.DisplayAlerts = True
End Sub

4.1,合并且显示原工作簿名称

应评论建议,增加在A列显示原工作簿名称;因按同名工作表合并,故没有显示原工作表名称的必要

Sub 合并文件夹下所有工作簿中同名工作表1()'文件夹下所有工作簿wb所有工作表ws按名称合并保存至新建工作表(但不含子文件夹),但不修改原数据(工作表格式相同)Dim dict As Object, sht As Worksheet, fso As ObjectDim file_path$, file_name$, title_row, end_row, save_file$
'--------------------参数填写:title_row,数字,第1行为1向下递增;end_row,数字;file_path,合并文件夹title_row = 1  '表头行数,不参与合并end_row = 0    '表尾行数,不参与合并file_path = "E:\测试\拆分表\"  '待合并工作簿所在的文件夹file_name = Dir(file_path & "*.xlsx")Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行Application.DisplayAlerts = False   '不显示警告信息Set fso = CreateObject("Scripting.FileSystemObject")Set dict = CreateObject("scripting.dictionary")Set write_wb = Workbooks.Add    '新建工作簿,合并文件'新建工作簿默认工作表,防止有同名被合并表,导致整表复制后名称改变;但会缺少表头For Each sht In write_wb.Worksheetsdict(sht.Name) = "": [a1] = "原工作簿名称"NextDo While file_name <> ""Set wb = Workbooks.Open(file_path & file_name)For Each sht In wb.WorksheetsIf Not dict.Exists(sht.Name) Then  '不存在的,直接复制整表dict(sht.Name) = ""sht.Copy After:=write_wb.Sheets(write_wb.Sheets.count)ActiveSheet.Columns(1).Insert: [a1] = "原工作簿名称"  '插入列Range("a2:a" & ActiveSheet.UsedRange.Rows.count).Value = fso.GetBaseName(file_name)  '需要扩展名可直接赋值file_nameElseSet write_ws = write_wb.Worksheets(sht.Name)If WorksheetFunction.CountA(write_ws.Rows(1)) = 0 Then write_ws.Rows(1).Deletewrite_row = write_ws.UsedRange.Rows.count + 1  '合并工作表的第一个空行写入sheet_row = sht.UsedRange.Rows.count: sheet_col = sht.UsedRange.Columns.countsht.Range(Cells(title_row + 1, "a"), Cells(sheet_row - end_row, sheet_col)).Copy write_ws.Range("B" & write_row)write_ws.Cells(write_row, "a").Resize(sheet_row - title_row - end_row) = fso.GetBaseName(file_name)End IfNextwb.Close (False)file_name = Dir  '下一个文件名Loop'保存文件save_file = file_path & "合并表.xlsx"write_wb.SaveAs filename:=save_filewrite_wb.Close (False)Application.ScreenUpdating = TrueApplication.DisplayAlerts = True
End Sub

Excel·VBA合并工作簿相关推荐

  1. excel合并工作簿VBA

    主要内容如下: Sub 合并工作簿()Dim p As Integer Dim s As Integer Dim i As Integer Dim hao As String Dim fd As Fi ...

  2. 写一段vba代码,把excel中所有工作簿中的图片删除

    以下是 VBA 代码,可用于删除 Excel 中所有工作簿中的图片: Sub DeleteAllImages()Dim ws As WorksheetDim shp As ShapeFor Each ...

  3. 拆分工作簿为多个文件_刻意地练习Excel快速拆分工作簿「例07-4」

    上一篇:例07-3-合并多个工作簿 本篇为Excel工作簿高级操作实例之一: 本篇在章节中的位置 拆分工作簿指的是将工作簿中的多个工作表单独拆分为工作簿文件. 在工作中,若我们需要将工作簿中的工作表以 ...

  4. 合并工作簿包含工作表名称

    Sub 合并工作簿包含工作表名称() '定义对话框变量 Dim fd As FileDialog Set fd = Application.FileDialog(msoFileDialogFilePi ...

  5. 合并工作簿——《超级处理器》应用

    怎么将下面的所有工作簿,合并到一起,并需要区分合并后的数据来自哪一个工作簿,怎么做?不需要复杂的操作,点点鼠标就可完成. 需要汇总的工作簿 操作步骤: 第一步.新建一个空白的工作簿,打开超级处理器菜单 ...

  6. Excel不用打开工作簿就能直接在里面输入文字!

    今天要和大家分享的是:Excel不用打开工作簿就可以直接在里面输入文字! 月度的销售报表已经出来了,现在有几百分报表,需要在工作簿指定位置签署审核员 刘大柱 的名字,如何在不打开工作表的情况下,完成这 ...

  7. Excel一键删除工作簿中所有表格中的条件格式

    今天要和大家分享的是,Excel一键删除工作簿中所有表格中的条件格式的操作,注意是所有表格的,而不是一个表格一个表格的去删除 (方方格子插件) 1.先看动图演示吧 2.打开工作簿后,我们看到有3个表格 ...

  8. excel代码将工作簿的多个工作表分成单独的工作簿

    excel代码将工作簿的多个工作表分成单独的工作簿 注:要存储为excel格式xlsx.xls,而不是xml Private Sub 分拆工作表()Dim sht As WorksheetDim My ...

  9. 关于Excel下通过VBA实现工作簿文件下工作表的合并

    对于普通使用者而言,Excel是一个比较强大的数据处理工具.一般公司的普通职员常使用它来完成数据的录入分析,但是当面对处理经由多人按统一模板统计完成的录入数据分析时,数据将分散存放在多个.xlsx文件 ...

  10. Excel VBA 合并不同工作簿的工作表到一个工作簿的不同工作表

    命令从下面第一个Sub开始: Sub 合并不同工作簿的工作表到一个工作簿的不同工作表() Excel.Application.ScreenUpdating = False Dim ARR() Dim ...

最新文章

  1. WorldWind学习系列一:顺利起航篇
  2. VC++ ATL 学习总结
  3. Git多个commit合并成一个【中间提交合并 尾部提交合并】
  4. python 股票指标库talib_TaLib在股票技术分析中的应用
  5. IOS之学习笔记十五(协议和委托的使用)
  6. javafx canvas_JavaFX技巧2:使用Canvas API进行清晰绘图
  7. js 获取 当天凌晨时间
  8. Android实现EditText插入表情、超链接等格式
  9. php和python_c语言,python和c语言的主要区别
  10. HCIE Security 防火墙NAT技术 备考笔记(幕布)
  11. 字符识别,口算题识别论文小梗概
  12. 生成1-100随机数并进行猜测
  13. 今日分享:自用的2款markdown在线编辑器推荐给你,快码住
  14. Bundle-Adjustment并行求解器
  15. 用百度大脑EasyDL平台轻松玩转AI
  16. 黑苹果系统的优化与问题解决(一)
  17. LabVIEW辨识颜色小游戏
  18. 微喜帖,微信喜帖,电子喜帖,电子请柬 - 一生一世微信电子喜帖 卡美美
  19. android gravity 属性解析
  20. 软件测试硬件培训,软件测试和硬件测试的技巧

热门文章

  1. 2-2 Aruba控制器 无线漫游优化 2020
  2. u盘启动linux出现grub,开机出现grub rescue报错如何解决 通用pe工具箱u盘启动盘制作工具教你...
  3. Redis基础--Redis 4.0 常用配置
  4. MySQL InnoDB引擎如何保证事务特性
  5. 论文写作之参考文献格式
  6. java 3des解密_Java进行3DES加密解密详解
  7. 阿里高效沟通的秘密:向上沟通,跨部门沟通,PREP汇报...这5招绝了!
  8. fei 正则表达式_正则表达式 匹配 中文/日文/韩文
  9. 冯 • 诺依曼体系结构
  10. JAVA长连接与短连接