ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3539|回复: 11

[求助] 请教,多个工作簿的制定表格合并到新建工作簿

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-8-16 09:43 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如附件中,每家机构都有BB01、BB02、BB03等表(为了便于举例我只设定了三张表格,且数据格式基本相同,实际使用时同一机构不同报表的格式是不同的,不同机构同一报表的数据内容是不同的),每家机构的同一报表格式相同数据不同,用VBA程序是否能够实现将每家机构的同一报表合并在一个工作簿中,工作簿中工作表的名字为第五位到第八位的代码。
换一个描述
将GFAB4301-2016007到GFAB4335-2016007(各机构报表)以及GFHZ0043-2016007(各机构汇总报表)中的BB01表合并为工作簿BB01,BB01中的工作表数据为各机构的BB01表,表名为4301-4335以及0043
将GFAB4301-2016007到GFAB4335-2016007(各机构报表)以及GFHZ0043-2016007(各机构汇总报表)中的BB01表合并为工作簿BB02,BB01中的工作表数据为各机构的BB02表,表名为4301-4335以及0043
将GFAB4301-2016007到GFAB4335-2016007(各机构报表)以及GFHZ0043-2016007(各机构汇总报表)中的BB01表合并为工作簿BB03,BB01中的工作表数据为各机构的BB03表,表名为4301-4335以及0043
以此类推,GFAB、GFHZ表为基础表,BB01、BB02、BB03为要实现的结果
我只会用比较笨拙的办法就是设定好BB01工作簿,然后每张工作簿引用相应工作表的数据
请论坛里的大师帮忙做个小程序,描述不准确的地方请包涵,非常感谢您的帮忙!

2016年7月报表.rar

221.77 KB, 下载次数: 14

TA的精华主题

TA的得分主题

发表于 2016-8-16 14:41 | 显示全部楼层
  1. Sub Opiona()

  2. '禁止系统刷屏?触发其他事件等
  3. 'On Error Resume Next    '// 发生错误,自动执行下一句,就是忽略错误
  4. Application.ScreenUpdating = False '//关闭屏幕刷新
  5. Application.DisplayAlerts = False '//关闭系统提示
  6. Application.EnableEvents = False  '//禁止触发其他事件
  7. t = Timer   '//开始时间

  8.     Path原始 = ThisWorkbook.Path & "\原始数据"
  9.     Path结果 = ThisWorkbook.Path & "\结果"
  10.    
  11.     Set FSO = CreateObject("Scripting.FileSystemObject")
  12.     If FSO.FolderExists(Path结果) = True Then
  13.         FSO.GetFolder(Path结果).Delete   '//删除文件夹
  14.     Else
  15.         
  16.     End If
  17.    
  18.     FileArr = FileAllArr(Path原始, "*.xls?", ThisWorkbook.Name, True, False)
  19.     MkDir Path结果    '//创建文件夹
  20.    
  21.     For I = 0 To UBound(FileArr)
  22.         Set WB = Workbooks.Open(FileArr(I))   '//打开原始数据的每个文件
  23.         
  24.         For Each SHW In WB.Worksheets   '//遍历所有工作表
  25.         
  26.             PATH当前 = Path结果 & "" & SHW.Name & ".XLSX"   '//保存到哪个工作簿
  27.             If InStr(Str工作表名, "|" & SHW.Name & "|") = 0 Then  '//没有就创建此工作簿
  28.                 Str工作表名 = Str工作表名 & SHW.Name & "|"
  29.                 Set WBX = Workbooks.Add
  30.                 WBX.SaveAs Filename:=PATH当前
  31.                 WBX.Close True
  32.             End If
  33.             
  34.             Rem 打开已经创建的表
  35.             Set WBX = Workbooks.Open(PATH当前)
  36.             Rem 创建新的工作表
  37.             WBX.Worksheets.Add(Before:=WBX.Worksheets(1)).Name = Mid(GetPathFromFileName(FileArr(I)), 5, 4)
  38.             Set SHX = WBX.Worksheets(Mid(GetPathFromFileName(FileArr(I)), 5, 4))
  39.             SHW.Cells.Copy SHX.Range("A1")
  40.             WBX.Close True
  41.         Next SHW
  42.         
  43.         WB.Close True  '//保存
  44.     Next I

  45. Application.EnableEvents = True  '//  '//恢复触发其他事件
  46. Application.ScreenUpdating = True '//恢复屏幕刷新
  47. Application.DisplayAlerts = True '//恢复系统提示
  48. MsgBox "一共用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!"  '//提示所用时间
  49. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-8-16 14:42 | 显示全部楼层
可能要几分钟等待

2016年7月报表.rar (258.54 KB, 下载次数: 34)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-16 16:24 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-16 16:32 | 显示全部楼层
e别来无恙 发表于 2016-8-16 16:24
非常感谢,我试试看

已经试过了,可以使用,太感谢了,如果只想针对几个工作簿中的其中一个工作表进行拆分合并,是否可以在汇总表中增加一个表名的输入,只针对特定工作表拆分合并?

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-16 16:53 | 显示全部楼层
opiona 发表于 2016-8-16 14:42
可能要几分钟等待

已经试过了,可以使用,太感谢了,如果只想针对几个工作簿中的其中一个或几个工作表进行拆分合并,是否可以在汇总表中增加一个表名的输入,只针对特定工作表拆分合并?

TA的精华主题

TA的得分主题

发表于 2016-8-17 08:13 | 显示全部楼层

  1. Sub Opiona()

  2. '禁止系统刷屏?触发其他事件等
  3. 'On Error Resume Next    '// 发生错误,自动执行下一句,就是忽略错误
  4. Application.ScreenUpdating = False '//关闭屏幕刷新
  5. Application.DisplayAlerts = False '//关闭系统提示
  6. Application.EnableEvents = False  '//禁止触发其他事件
  7. t = Timer   '//开始时间

  8.     Set SH1 = Worksheets("Sheet1")
  9.    
  10.     Rem ARX工作表名 = Split("BB01,BB02,BB03", ",")  '//指定:工作表
  11.     ARX工作表名 = SH1.Range("A2:A" & SH1.Range("A20").End(3).Row).Value  '//指定:工作表,此处最多19个,可以改

  12.     If SH1.Range("A20").End(3).Row = 2 Then   '//处理仅有一个的情况
  13.         ReDim ARX(1 To 1)
  14.         ARX(1) = ARX工作表名
  15.     Else
  16.         ReDim ARX(1 To UBound(ARX工作表名, 1))
  17.         For X = 1 To UBound(ARX工作表名, 1)
  18.             ARX(X) = ARX工作表名(X, 1)
  19.         Next X
  20.     End If
  21.    
  22.     Path原始 = ThisWorkbook.Path & "\原始数据"
  23.     Path结果 = ThisWorkbook.Path & "\结果"
  24.    
  25.     Set FSO = CreateObject("Scripting.FileSystemObject")
  26.     If FSO.FolderExists(Path结果) = True Then
  27.         FSO.GetFolder(Path结果).Delete   '//删除文件夹
  28.     End If
  29.    
  30.     FileArr = FileAllArr(Path原始, "*.xls?", ThisWorkbook.Name, True, False)
  31.     MkDir Path结果    '//创建文件夹
  32.    
  33.    
  34.     For I = 0 To UBound(FileArr)
  35.         Set WB = Workbooks.Open(FileArr(I))  '//打开原始数据的每个文件
  36.         
  37.         For X = 1 To UBound(ARX) '//遍历所有指定:工作表
  38.         
  39.             Set SHW = WB.Worksheets(ARX(X))
  40.             
  41.             PATH当前 = Path结果 & "" & SHW.Name & ".XLSX"   '//保存到哪个工作簿
  42.             If FSO.FileExists(PATH当前) = False Then   '//没有就创建此工作簿
  43.                 Set WBX = Workbooks.Add
  44.                 WBX.SaveAs Filename:=PATH当前
  45.                 WBX.Close True
  46.             End If

  47.             Rem 打开已经创建的表
  48.             Set WBX = Workbooks.Open(PATH当前)
  49.             Rem 创建新的工作表
  50.             WBX.Worksheets.Add(Before:=WBX.Worksheets(1)).Name = Mid(GetPathFromFileName(FileArr(I)), 5, 4)
  51.             Set SHX = WBX.Worksheets(Mid(GetPathFromFileName(FileArr(I)), 5, 4))
  52.             SHW.Cells.Copy SHX.Range("A1")
  53.             WBX.Close True
  54.             
  55.         Next X
  56.         
  57.         WB.Close True  '//保存
  58.     Next I

  59. Application.EnableEvents = True  '//  '//恢复触发其他事件
  60. Application.ScreenUpdating = True '//恢复屏幕刷新
  61. Application.DisplayAlerts = True '//恢复系统提示
  62. MsgBox "一共用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!"  '//提示所用时间
  63. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2016-8-17 08:24 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-8-17 10:45 | 显示全部楼层
你想汇总哪个表,就在代码里修改一下好了。

2016年7月报表.rar

172.39 KB, 下载次数: 37

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-17 11:24 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-17 14:28 , Processed in 0.041123 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表