ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何遍历文件夹内所有文件寻找符合条件的sheet表并汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-6-23 13:28 | 显示全部楼层 |阅读模式
本帖最后由 霏霏妈 于 2015-6-23 14:10 编辑

建设公司下面有很多项目经理(workbook),每个项目经理下面又有很多项目(sheet表),每个项目的数据格式都是一致的。现在根据汇总表里B1-R1的项目代码,遍历其他所有的文件sheet页,找出对应项目代码页里面自开工以来的累计数(即E8-E41 )   填入汇总表内。。具体数字详见附件。,估计得用VBA了 谢谢大家!!

成本汇总表.zip

173.55 KB, 下载次数: 53

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-23 14:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
已上传文件  坐等大神帮忙!!

TA的精华主题

TA的得分主题

发表于 2015-6-23 16:15 | 显示全部楼层
请参考:
  1. Sub ADO加字典法()
  2.     Dim Fso As Object, File As Object, cnn As Object, rs As Object, SQL$, c, s$, arr, brr(), i&, d As Object
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Range("A1").CurrentRegion
  5.     For i = 2 To UBound(arr, 2)
  6.         d("" & arr(1, i)) = i
  7.     Next
  8.     ReDim brr(0 To 33, 2 To i - 1)
  9.     Set Fso = CreateObject("Scripting.FileSystemObject")
  10.     For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
  11.         If LCase(File.Name) Like "*.xls" And LCase(File.Name) <> ThisWorkbook.Name Then
  12.             Set cnn = CreateObject("adodb.connection")
  13.             cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;hdr=no';data source=" & File
  14.             Set rs = cnn.OpenSchema(20)
  15.             Do Until rs.EOF
  16.                 If rs.Fields("TABLE_TYPE") = "TABLE" Then
  17.                     s = Replace(rs("TABLE_NAME").Value, "'", "")
  18.                     If Right(s, 1) = "$" Then
  19.                         c = d(Left$(s, 7))
  20.                         If c <> "" Then
  21.                             SQL = "select * from [" & s & "E8:E41]"
  22.                             arr = cnn.Execute(SQL).GetRows
  23.                             For i = 0 To 33
  24.                                 If Not IsNull(arr(0, i)) Then brr(i, c) = arr(0, i)
  25.                             Next
  26.                         End If
  27.                     End If
  28.                 End If
  29.                 rs.MoveNext
  30.             Loop
  31.         End If
  32.     Next
  33.     Range("b2").Resize(34, UBound(brr, 2) - 1) = brr
  34.     rs.Close
  35.     cnn.Close
  36.     Set rs = Nothing
  37.     Set cnn = Nothing
  38.     Set File = Nothing
  39.     Set Fso = Nothing
  40. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-6-23 16:17 | 显示全部楼层
请测试附件
成本汇总表.rar (114.93 KB, 下载次数: 172)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-23 18:46 | 显示全部楼层
版主好棒!~初步测试无误,明天拿去单位再试验 万分感谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-24 08:36 | 显示全部楼层
公司软件导出的格式如下,并不是标准格式的XLS

227陈国干.zip

101.78 KB, 下载次数: 14

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-6-24 08:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

版主老师,运行到13行报错。报错提示: 不是外部预期的格式。  我看了下公司实际导出的文件的确格式是不一样的,具体看6楼附件   13行代码应该要改改。但是我不会改 帮忙一下 呵呵 谢谢

TA的精华主题

TA的得分主题

发表于 2015-6-24 10:15 | 显示全部楼层
霏霏妈 发表于 2015-6-24 08:38
版主老师,运行到13行报错。报错提示: 不是外部预期的格式。  我看了下公司实际导出的文件的确格式是不 ...

你导出的是2007格式工作簿,在2003中打不开,请在2007中使用:

  1. Sub ADO加字典法() '在2007中使用
  2.     Dim Fso As Object, File As Object, cnn As Object, rs As Object, SQL$, c, s$, arr, brr(), i&, d As Object
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Range("A1").CurrentRegion
  5.     For i = 2 To UBound(arr, 2)
  6.         d("" & arr(1, i)) = i
  7.     Next
  8.     ReDim brr(0 To 33, 2 To i - 1)
  9.     Set Fso = CreateObject("Scripting.FileSystemObject")
  10.     For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
  11.         If LCase(File.Name) Like "*.xls" Then
  12.             Set cnn = CreateObject("adodb.connection")
  13.             cnn.Open "provider=microsoft.ace.oledb.12.0;extended properties='excel 12.0;hdr=no';data source=" & File
  14.             Set rs = cnn.OpenSchema(20)
  15.             Do Until rs.EOF
  16.                 If rs.Fields("TABLE_TYPE") = "TABLE" Then
  17.                     s = Replace(rs("TABLE_NAME").Value, "'", "")
  18.                     If Right(s, 1) = "$" Then
  19.                         c = d(Left$(s, 7))
  20.                         If c <> "" Then
  21.                             SQL = "select * from [" & s & "E8:E41]"
  22.                             arr = cnn.Execute(SQL).GetRows
  23.                             For i = 0 To 33
  24.                                 If Not IsNull(arr(0, i)) Then brr(i, c) = arr(0, i)
  25.                             Next
  26.                         End If
  27.                     End If
  28.                 End If
  29.                 rs.MoveNext
  30.             Loop
  31.         End If
  32.     Next
  33.     Range("b2").Resize(34, UBound(brr, 2) - 1) = brr
  34.     rs.Close
  35.     cnn.Close
  36.     Set rs = Nothing
  37.     Set cnn = Nothing
  38.     Set File = Nothing
  39.     Set Fso = Nothing
  40. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-6-24 10:16 | 显示全部楼层
也可以使用常规法:
  1. Sub 常规法() '在2007中使用
  2.     Dim Fso As Object, File As Object, c, s$, arr, brr(), i&, d As Object, sh As Worksheet
  3.     Application.ScreenUpdating = False
  4.     Application.DisplayAlerts = False
  5.     Set d = CreateObject("scripting.dictionary")
  6.     arr = Range("A1").CurrentRegion
  7.     For i = 2 To UBound(arr, 2)
  8.         d("" & arr(1, i)) = i
  9.     Next
  10.     ReDim brr(1 To 34, 2 To i - 1)
  11.     Set Fso = CreateObject("Scripting.FileSystemObject")
  12.     For Each File In Fso.GetFolder(ThisWorkbook.Path).Files
  13.         If LCase(File.Name) Like "*.xls" Then
  14.             With GetObject(File)
  15.                 For Each sh In .Worksheets
  16.                     c = d(Left$(sh.Name, 7))
  17.                     If c <> "" Then
  18.                         arr = sh.Range("E8:E41")
  19.                         For i = 1 To UBound(arr)
  20.                             brr(i, c) = arr(i, 1)
  21.                         Next
  22.                     End If
  23.                 Next
  24.                 .Close 0
  25.             End With
  26.         End If
  27.     Next
  28.     Range("b2").Resize(34, UBound(brr, 2) - 1) = brr
  29.     Set File = Nothing
  30.     Set Fso = Nothing
  31.     Application.ScreenUpdating = True
  32. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-6-24 10:17 | 显示全部楼层
下面附件中有这两种方法:
成本汇总表.rar (116.22 KB, 下载次数: 173)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 13:01 , Processed in 0.038428 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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