ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 合并所有文件夹中的EXCEL文件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-11-24 21:42 | 显示全部楼层 |阅读模式
合并所有文件夹中的EXCEL文件(包括子文件夹):

    With Application.FileDialog(msoFileDialogFolderPicker)
        .InitialFileName = ThisWorkbook.Path & "\"
        If .Show = False Then Exit Sub
        MyPath = .SelectedItems(1) & "\"
    End With


只可以合并当前文件夹的EXCEL ,但对于子文件夹如附件中的《1》文件夹,《2》文件夹中的,EXCEL 文件怎么无法合并?

data.rar

38.85 KB, 下载次数: 29

TA的精华主题

TA的得分主题

发表于 2014-11-24 21:57 | 显示全部楼层
http://club.excelhome.net/thread-1165866-1-1.html
参考下这个帖子吧

点评

不知一下子怎么调用。如附件。  发表于 2014-11-24 22:11

TA的精华主题

TA的得分主题

发表于 2014-11-24 23:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请参考:
  1. Sub 多表合并() '怎么不可以合并多个文件夹的?
  2.     Dim Fso As Object, Folder As Object, arrf$(), mf&
  3.     Dim sh As Worksheet, arr, brr(0 To 100000, 0 To 50), w As WorksheetFunction
  4.     Dim d As Object, i&, j&, m&, n&, c As Range, MyPath$
  5.     With Application.FileDialog(msoFileDialogFolderPicker)
  6.         .InitialFileName = ThisWorkbook.Path & ""
  7.         If .Show = False Then Exit Sub
  8.         MyPath = .SelectedItems(1)
  9.     End With
  10.     Application.ScreenUpdating = False
  11.     Set d = CreateObject("scripting.dictionary")
  12.     Set w = Application.WorksheetFunction
  13.     Set Fso = CreateObject("Scripting.FileSystemObject")
  14.     Set Folder = Fso.GetFolder(MyPath)
  15.     Call GetFiles(Folder, arrf, mf)
  16.     For l = 1 To mf
  17.         With GetObject(arrf(l))
  18.             For Each sh In .Worksheets
  19.                 If w.CountA(sh.UsedRange) Then
  20.                     Set c = sh.UsedRange
  21.                     arr = c.Value
  22.                     For j = 1 To UBound(arr, 2)
  23.                         If Len(arr(1, j)) Then
  24.                             If Not d.Exists(arr(1, j)) Then
  25.                                 n = n + 1
  26.                                 d(arr(1, j)) = n
  27.                                 brr(0, n) = arr(1, j)
  28.                             End If
  29.                         End If
  30.                     Next
  31.                     For i = 2 To UBound(arr)
  32.                         m = m + 1
  33.                         If m > 1048575 Then
  34.                             MsgBox "超出最大行数1048576,无法合并"
  35.                             Exit Sub
  36.                         End If
  37.                         brr(m, d(arr(1, 1))) = arr(i, 1)
  38.                         brr(m, 0) = sh.Name
  39.                         For j = 2 To UBound(arr, 2)
  40.                             If Len(arr(1, j)) Then brr(m, d(arr(1, j))) = arr(i, j)
  41.                         Next
  42.                     Next
  43.                 End If
  44.             Next
  45.             .Close False
  46.         End With
  47.     Next
  48.     Cells.ClearContents
  49.     brr(0, 0) = "表名"
  50.     If m Then [a1].Resize(m + 1, n + 1) = brr
  51.     Application.ScreenUpdating = True
  52. End Sub

  53. Sub GetFiles(ByVal Folder As Object, ByRef arrf$(), ByRef mf&)
  54.     Dim SubFolder As Object
  55.     Dim File As Object
  56.     For Each File In Folder.Files
  57.         If File.Name Like "*.xlsx" Then
  58.             mf = mf + 1
  59.             ReDim Preserve arrf(1 To mf)
  60.             arrf(mf) = File
  61.         End If
  62.     Next
  63.     For Each SubFolder In Folder.SubFolders
  64.         Call GetFiles(SubFolder, arrf, mf)
  65.     Next
  66. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-11-24 23:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请测试附件
data.rar (38.78 KB, 下载次数: 50)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-11-25 10:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhaogang1960 发表于 2014-11-24 23:06
请测试附件

zhaogang1960版主你好:
能在汇总表的前面添加文件夹和工作簿名称吗

TA的精华主题

TA的得分主题

发表于 2014-11-25 18:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jjmysjg 发表于 2014-11-25 10:36
zhaogang1960版主你好:
能在汇总表的前面添加文件夹和工作簿名称吗
  1. Sub 多表合并()
  2.     Dim Fso As Object, Folder As Object, arrf$(), mf&
  3.     Dim sh As Worksheet, arr, brr(0 To 100000, -2 To 50), w As WorksheetFunction
  4.     Dim d As Object, i&, j&, m&, n&, c As Range, MyPath$
  5.     With Application.FileDialog(msoFileDialogFolderPicker)
  6.         .InitialFileName = ThisWorkbook.Path & ""
  7.         If .Show = False Then Exit Sub
  8.         MyPath = .SelectedItems(1)
  9.     End With
  10.     Application.ScreenUpdating = False
  11.     Set d = CreateObject("scripting.dictionary")
  12.     Set w = Application.WorksheetFunction
  13.     Set Fso = CreateObject("Scripting.FileSystemObject")
  14.     Set Folder = Fso.GetFolder(MyPath)
  15.     Call GetFiles(Folder, arrf, mf)
  16.     For l = 1 To mf
  17.         With GetObject(arrf(2, l) & "" & arrf(1, l))
  18.             For Each sh In .Worksheets
  19.                 If w.CountA(sh.UsedRange) Then
  20.                     Set c = sh.UsedRange
  21.                     arr = c.Value
  22.                     For j = 1 To UBound(arr, 2)
  23.                         If Len(arr(1, j)) Then
  24.                             If Not d.Exists(arr(1, j)) Then
  25.                                 n = n + 1
  26.                                 d(arr(1, j)) = n
  27.                                 brr(0, n) = arr(1, j)
  28.                             End If
  29.                         End If
  30.                     Next
  31.                     For i = 2 To UBound(arr)
  32.                         m = m + 1
  33.                         If m > 1048575 Then
  34.                             MsgBox "超出最大行数1048576,无法合并"
  35.                             Exit Sub
  36.                         End If
  37.                         brr(m, d(arr(1, 1))) = arr(i, 1)
  38.                         brr(m, -2) = Split(arrf(2, l), "")(UBound(Split(arrf(2, l), "")))
  39.                         brr(m, -1) = arrf(1, l)
  40.                         brr(m, 0) = sh.Name
  41.                         For j = 2 To UBound(arr, 2)
  42.                             If Len(arr(1, j)) Then brr(m, d(arr(1, j))) = arr(i, j)
  43.                         Next
  44.                     Next
  45.                 End If
  46.             Next
  47.             .Close False
  48.         End With
  49.     Next
  50.     Cells.ClearContents
  51.     brr(0, -2) = "文件夹名"
  52.     brr(0, -1) = "工作簿名"
  53.     brr(0, 0) = "表名"
  54.     If m Then [a1].Resize(m + 1, n + 3) = brr
  55.     Set Folder = Nothing
  56.     Set Fso = Nothing
  57.     Application.ScreenUpdating = True
  58. End Sub

  59. Sub GetFiles(ByVal Folder As Object, ByRef arrf$(), ByRef mf&)
  60.     Dim SubFolder As Object
  61.     Dim File As Object
  62.     For Each File In Folder.Files
  63.         If File.Name Like "*.xlsx" Then
  64.             mf = mf + 1
  65.             ReDim Preserve arrf(1 To 2, 1 To mf)
  66.             arrf(1, mf) = File.Name
  67.             arrf(2, mf) = Folder.Path
  68.         End If
  69.     Next
  70.     For Each SubFolder In Folder.SubFolders
  71.         Call GetFiles(SubFolder, arrf, mf)
  72.     Next
  73. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2014-11-25 18:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请测试附件
data.rar (38.16 KB, 下载次数: 42)

点评

If File.Name Like "*.xlsx" or If File.Name Like "*.xls" Then可能会好些。  发表于 2014-11-25 18:45

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-11-25 18:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhaogang1960 发表于 2014-11-25 18:39
请测试附件
  1. Sub GetFiles(ByVal Folder As Object, ByRef arrf$(), ByRef mf&)
  2.     Dim SubFolder As Object
  3.     Dim File As Object
  4.     For Each File In Folder.Files
  5.         If File.Name Like "*.xls*" And InStr(File.Name, ThisWorkbook.Name) = 0 Then
  6.             mf = mf + 1
  7.             ReDim Preserve arrf(1 To 2, 1 To mf)
  8.             arrf(1, mf) = File.Name
  9.             arrf(2, mf) = Folder.Path
  10.         End If
  11.     Next
  12.     For Each SubFolder In Folder.SubFolders
  13.         Call GetFiles(SubFolder, arrf, mf)
  14.     Next
  15. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-11-25 18:50 | 显示全部楼层
下面附件中有一个文件是xls类型
data.rar (39.1 KB, 下载次数: 51)

点评

文件夹名不能有小数点的,如果文件夹名有小数点,《1.0》,则提取后的文件夹名变成了 《1》,.0不见了。  发表于 2014-11-25 19:15

TA的精华主题

TA的得分主题

发表于 2014-11-25 19:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhaogang1960 发表于 2014-11-25 18:50
下面附件中有一个文件是xls类型
张雄友  文件夹名不能有小数点的,如果文件夹名有小数点,《1.0》,则提取后的文件夹名变成了 《1》,.0不见了。

这可不是程序引起的,不信你可以往单元格中输入2.0试试看,把该列格式设置为文本即可
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-29 07:15 , Processed in 0.039785 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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