ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 不同文件夹下相同类型工作表数据汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-12-29 21:24 | 显示全部楼层 |阅读模式
不同文件夹数据汇总.JPG

我的问题如图所示,附件在此,大神们可否帮忙写段代码!谢谢!

产量统计.rar (24.81 KB, 下载次数: 26)

TA的精华主题

TA的得分主题

发表于 2013-12-29 21:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zhaogang1960 于 2013-12-29 23:32 编辑

请测试:
  1. Sub 宏1()
  2.     Dim cnn As Object, SQL$, Mypath$, MyFile$, m&, n&, t$
  3.     Dim Fso As Object, arrf$(), mf&, sFileType$, j&
  4.     Application.ScreenUpdating = False
  5.     sFileType = "*.xlsx"
  6.     Set Fso = CreateObject("Scripting.FileSystemObject")
  7.     Call GetFiles(ThisWorkbook.Path, sFileType, Fso, arrf, mf)
  8.     ActiveSheet.UsedRange.Offset(1).ClearContents
  9.     Set cnn = CreateObject("ADODB.Connection")
  10.     cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & arrf(1)
  11.    
  12.     For j = 1 To mf
  13.         m = m + 1
  14.         If m > 49 Then
  15.             Range("a" & Rows.Count).End(xlUp).Offset(1).CopyFromRecordset cnn.Execute(SQL)
  16.             m = 1
  17.             SQL = ""
  18.         End If
  19.         If Len(SQL) Then SQL = SQL & " union all "
  20.         SQL = SQL & "select * from [Excel 12.0;Database=" & arrf(j) & "].[Sheet1$]"
  21.     Next
  22.     If Len(SQL) Then Range("a" & Rows.Count).End(xlUp).Offset(1).CopyFromRecordset cnn.Execute(SQL)
  23.     cnn.Close
  24.     Set cnn = Nothing
  25.     Set Fso = Nothing
  26.     Application.ScreenUpdating = True
  27. End Sub

  28. Private Sub GetFiles(ByVal sPath$, ByVal sFileType$, ByRef Fso As Object, ByRef arrf$(), ByRef mf&)
  29.     Dim Folder As Object
  30.     Dim SubFolder As Object
  31.     Dim File As Object
  32.     Set Folder = Fso.GetFolder(sPath)
  33.     If sPath <> ThisWorkbook.Path Then
  34.         For Each File In Folder.Files
  35.             If File.Name Like sFileType Then
  36.                 mf = mf + 1
  37.                 ReDim Preserve arrf(1 To mf)
  38.                 arrf(mf) = sPath & "" & File.Name
  39.             End If
  40.         Next
  41.     End If
  42.     If Folder.SubFolders.Count > 0 Then
  43.         For Each SubFolder In Folder.SubFolders
  44.             Call GetFiles(SubFolder.Path, sFileType, Fso, arrf, mf)
  45.         Next
  46.     End If
  47.     Set Folder = Nothing
  48.     Set File = Nothing
  49.     Set SubFolder = Nothing
  50. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2013-12-29 21:45 | 显示全部楼层
本帖最后由 zhaogang1960 于 2013-12-29 23:33 编辑

请看附件
产量统计.rar (38.9 KB, 下载次数: 52)

TA的精华主题

TA的得分主题

发表于 2013-12-29 22:24 | 显示全部楼层
我做了一个,你看行吗?是用excel2003做的,在2007下应该也能行。你试试吧。订单工作薄的名称无所谓,但要保证数据都在订单工作薄的sheet1表中。

产量统计.rar

18.11 KB, 下载次数: 18

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-29 22:29 | 显示全部楼层
zhaogang1960 发表于 2013-12-29 21:45
请看附件


哇,先感谢大版主的悉心解答!!!但是我测试了一下,发现只有:

产品号        高度        长度
770        2        34
771        23        1
773        45        23
774        34        23
777        12        54
770        2        34
771        23        1
773        45        23
774        34        23
777        12        54
770        2        34
771        23        1
773        45        23
774        34        23
777        12        54

而不是想要得到的:

产品号        高度        长度
110        10        34
111        23        12
112        32        45
200        10        23
770        2        34
771        23        1
773        45        23
774        34        23
777        12        54

请问哪里出错了?多谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-29 22:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBAliker 发表于 2013-12-29 22:24
我做了一个,你看行吗?是用excel2003做的,在2007下应该也能行。你试试吧。订单工作薄的名称无所谓,但要保 ...

先谢谢高手花时间帮助我,但是我想得到产品号/高度/长度的统计数据,就像我写在5楼那样的,请问有什么办法吗?

TA的精华主题

TA的得分主题

发表于 2013-12-29 22:52 | 显示全部楼层
beleqing 发表于 2013-12-29 22:35
先谢谢高手花时间帮助我,但是我想得到产品号/高度/长度的统计数据,就像我写在5楼那样的,请问有什么办法 ...

我是把所有的全部复制过来了,请说明哪一个不要了

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-29 23:24 | 显示全部楼层
110        10        34
111        23        12
112        32        45
这些数据来源于产量统计\产品种类1\订单1.xlsx

200        10        23
这些数据来源于产量统计\产品种类1\订单02.xlsx

770        2        34
771        23        1
773        45        23
774        34        23
777        12        54

这些数据来源于产量统计\产品种类02\订单号码01.xlsx

也就是遍历产品统计文件夹下所有子文件夹内的所有excel表格。把这些excel表格内的数据统计到汇总表里!谢谢!!

大版主你做的是把产量统计\产品种类02\订单号码01.xlsx这个表格统计了三遍{:soso_e112:}









点评

3楼附件已更新请测试  发表于 2013-12-29 23:33

TA的精华主题

TA的得分主题

发表于 2013-12-29 23:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
beleqing 发表于 2013-12-29 23:24
110        10        34
111        23        12
112        32        45

修改如下:
  1. Sub 宏1()
  2.     Dim cnn As Object, SQL$, Mypath$, MyFile$, m&, n&, t$
  3.     Dim Fso As Object, arrf$(), mf&, sFileType$, j&
  4.     Application.ScreenUpdating = False
  5.     sFileType = "*.xlsx"
  6.     Set Fso = CreateObject("Scripting.FileSystemObject")
  7.     Call GetFiles(ThisWorkbook.Path, sFileType, Fso, arrf, mf)
  8.     ActiveSheet.UsedRange.Offset(1).ClearContents
  9.     Set cnn = CreateObject("ADODB.Connection")
  10.     cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & arrf(1)
  11.    
  12.     For j = 1 To mf
  13.         m = m + 1
  14.         If m > 49 Then
  15.             Range("a" & Rows.Count).End(xlUp).Offset(1).CopyFromRecordset cnn.Execute(SQL)
  16.             m = 1
  17.             SQL = ""
  18.         End If
  19.         If Len(SQL) Then SQL = SQL & " union all "
  20.         SQL = SQL & "select * from [Excel 12.0;Database=" & arrf(j) & "].[Sheet1$]"
  21.     Next
  22.     If Len(SQL) Then Range("a" & Rows.Count).End(xlUp).Offset(1).CopyFromRecordset cnn.Execute(SQL)
  23.     cnn.Close
  24.     Set cnn = Nothing
  25.     Set Fso = Nothing
  26.     Application.ScreenUpdating = True
  27. End Sub

  28. Private Sub GetFiles(ByVal sPath$, ByVal sFileType$, ByRef Fso As Object, ByRef arrf$(), ByRef mf&)
  29.     Dim Folder As Object
  30.     Dim SubFolder As Object
  31.     Dim File As Object
  32.     Set Folder = Fso.GetFolder(sPath)
  33.     If sPath <> ThisWorkbook.Path Then
  34.         For Each File In Folder.Files
  35.             If File.Name Like sFileType Then
  36.                 mf = mf + 1
  37.                 ReDim Preserve arrf(1 To mf)
  38.                 arrf(mf) = sPath & "" & File.Name
  39.             End If
  40.         Next
  41.     End If
  42.     If Folder.SubFolders.Count > 0 Then
  43.         For Each SubFolder In Folder.SubFolders
  44.             Call GetFiles(SubFolder.Path, sFileType, Fso, arrf, mf)
  45.         Next
  46.     End If
  47.     Set Folder = Nothing
  48.     Set File = Nothing
  49.     Set SubFolder = Nothing
  50. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-12-29 23:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhaogang1960 发表于 2013-12-29 21:44
请测试:

zhaogang版主你好:
帮我看看帖子好吗。
谢谢!
http://club.excelhome.net/forum. ... =1084490&extra=
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 19:06 , Processed in 0.031587 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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