ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] 【83期】VBA多工作簿多工作表数据查询[已小结]

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2015-1-22 20:44 | 显示全部楼层
本帖已被收录到知识树中,索引项:工作表和工作簿
跟帖详细学习                        

TA的精华主题

TA的得分主题

发表于 2015-2-8 23:25 | 显示全部楼层
今天学习了下,改进了下某老师的代码,不再循环各字段写入数据!
  1. Public Sub BBBBBBBBBBB()
  2. 'On Error Resume Next
  3. Application.DisplayAlerts = False
  4. Application.ScreenUpdating = False
  5. Dim t As Date, ne$, rs%, i%, ii%, Name$, FName$, pa, sql, n%, m%, n2%, x%
  6. Dim arr(1 To 9999)
  7. Dim rst As ADODB.Recordset
  8. Dim cnn As ADODB.Connection
  9. ne = [c2]: i = 0: rs = 3
  10. t = Timer
  11. Name = ThisWorkbook.Name
  12. Range("a4:h" & [h65536].End(3).Row + 1).ClearContents
  13. FName = Dir(ThisWorkbook.Path & "\*.xls")
  14. Do Until FName = "" ' ThisWorkbook.Name
  15. If FName <> Name Then
  16. i = i + 1
  17. arr(i) = FName
  18. End If
  19. FName = Dir
  20. Loop
  21. For ii = 1 To i
  22. n = 0: m = 0
  23.     Set cnn = New ADODB.Connection
  24.     pa = ThisWorkbook.Path & "" & arr(ii)
  25.     cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;HDR=YES';data source=" & pa
  26.     For x = 1 To 3
  27.     Set rst = New ADODB.Recordset
  28.         sql = "select * from [" & x & "部门$A3:F] where 姓名 like '%" & ne & "%'"
  29.         Err.Clear
  30.         rst.Open sql, cnn, 1, 3
  31.                 With Sheet1
  32.                      n = .Cells(65536, 1).End(xlUp).Row + 1
  33.                      m = .UsedRange.Columns.Count
  34.                     .Cells(n, 1).CopyFromRecordset rst
  35.                      n2 = .Cells(65536, 1).End(xlUp).Row + 1
  36.                      If n <> n2 Then
  37.                     .Range(.Cells(n, m - 1), .Cells(n2 - 1, m - 1)) = Left(arr(ii), Len(arr(ii)) - 4)
  38.                     .Range(.Cells(n, m), .Cells(n2 - 1, m)) = x & "部门"
  39.                     End If
  40.                 End With
  41.     Next
  42. Next
  43. Application.DisplayAlerts = True
  44. Application.ScreenUpdating = True
  45. MsgBox "耗时:" & Format(Timer - t, "0.00") & "秒!" & Chr(10) & "共有“" & [a65536].End(3).Row - 3 & "”条记录!", vbInformation, "完工"
  46. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-2-10 00:29 | 显示全部楼层
jpj123 发表于 2015-2-8 23:25
今天学习了下,改进了下某老师的代码,不再循环各字段写入数据!

效果很好,60多个数据源共计180多个工作表都要复制一次数据,违反了本题目”复制数据次数不超过5次“的规则,本题本身很简单,出题目的在于测试当多于49个工作表时,处理SQL联合查询的方法

TA的精华主题

TA的得分主题

发表于 2015-2-10 00:39 | 显示全部楼层
zhaogang1960 发表于 2015-2-10 00:29
效果很好,60多个数据源共计180多个工作表都要复制一次数据,违反了本题目”复制数据次数不超过5次“的规 ...

首选感谢赵版的点评,昨天看了一老师的代码,只是觉得各字段循环赋值太麻烦了,也很费时间,(从帖子中间看的,没注意要求)所以就动手改了下。时限早过了,赵版还给我点评,再次感谢,呵呵!

TA的精华主题

TA的得分主题

发表于 2015-11-3 14:54 | 显示全部楼层
帖子过去好久了啊,刚接触ADO,上传答案仅供同是菜鸟的朋友参考下,运行速度比数组法快,比高手的代码慢3秒左右,若是赵老师看到了,希望可以解释下SQL1、SQL2两句代码合并成1句如何实现相同的效果,同样欢迎高手解答。
  1. Sub 查询()
  2.   Dim SQL1, SQL2, i, T
  3.   Dim Rg As Range
  4.   Dim Conn As Object
  5.   Dim MyPath$, MyName$
  6.   T = Timer
  7.   Range("a4:H10000") = ""
  8.   Set Conn = CreateObject("adodb.connection")
  9.   MyPath = ThisWorkbook.Path
  10.   MyName = Dir(MyPath & "\*.xls")
  11.   Application.ScreenUpdating = False
  12.   Do While MyName <> ""
  13.         If MyName <> ThisWorkbook.Name Then
  14.                 Conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & MyPath & "" & MyName
  15.             For i = 1 To 3
  16.                 SQL1 = "select * from [Excel 8.0;DATABASE=" & MyPath & "" & MyName & "].[" & i & "部门$A3:F200] where 姓名 = '" & Range("c2").Value & "'"
  17.                 SQL2 = "select """ & Left(MyName, 6) & """,""" & i & "部门"" from [Excel 8.0;DATABASE=" & MyPath & "" & MyName & "].[" & i & "部门$A3:F200] where 姓名 = '" & Range("c2").Value & "'"
  18.                 Debug.Print Sql
  19.                 Set Rg = Range("a65535").End(xlUp).Offset(1)
  20.                 Rg.CopyFromRecordset Conn.Execute(SQL1)   '[" & i & "部门$A3:F200] 引用的工作表数据从第三行开始,所以要加上数据区域
  21.                 Rg.Offset(, 6).CopyFromRecordset Conn.Execute(SQL2)
  22.             Next
  23.                 Conn.Close   '关闭当前对象
  24.         End If
  25.         MyName = Dir
  26.     Loop
  27.     Set Conn = Nothing  '程序运行结束后清空Conn对象
  28.     Application.ScreenUpdating = True
  29.     MsgBox "耗时" & Timer - T & "秒"
  30. End Sub
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2015-12-5 09:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-5-13 22:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-7-1 17:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-9-14 15:02 | 显示全部楼层
这样的学习式研讨,比武式的展示,直叫我们这样菜鸟傻眼,让我们感受到思想的活力,才智的美妙

TA的精华主题

TA的得分主题

发表于 2017-1-8 16:28 | 显示全部楼层
赵老师 你好 我下载了代码 但是现在的格式都是xlsx格式的,我借用了代码,运行错误。不知道怎么修改。可以帮忙指点下吗
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 02:15 , Processed in 0.031733 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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