设为首页收藏本站

嘻皮客娱乐学习网

 找回密码
 中文注册
搜索
打印 上一主题 下一主题
开启左侧

[OFFICE] Excel|条件汇总文件夹内所有工作簿的所有工作表符合条件的所有行的数据

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-1 22:42:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
合并.zip (44.58 KB, 下载次数: 397)


把文件所在的文件夹内所有工作簿的所有工作表中姓王的记录汇总到一个工作表,代码如下, 针对自己的表格不同,适当修改一下,就可以使用

  1. '***************************************************
  2. '# By gvntw 王建发                                 #
  3. '# 引用 Microsoft Scripting Runtime                #
  4. '# 引用 Microsoft ActiveX Data Objects 2.8 Library #
  5. '# 引用 Microsoft ADO Ext.2.8 For DDL and Security #
  6. '***************************************************
  7. Private Sub CommandButton1_Click()
  8.     Dim d As New Dictionary, arr(), i%, j%  '声明字典、数组、整型变量
  9.     Dim cn As New ADODB.Connection          'ADO对象
  10.     Dim rst As New ADODB.Recordset          '记录集对象
  11.     Dim cat As New Catalog                  'ADOX引用
  12.     Dim sql$, MyPath$, MyFiles$, TWb$       'String 变量
  13.    
  14.     On Error GoTo Err                       '发生错误跳到 Err
  15.     Cells = Empty                           '清空单元格数据
  16.     TWb = ThisWorkbook.Name                 '取本工作簿名
  17.    
  18.     MyPath = ThisWorkbook.Path              '文件路径
  19.     MyFiles = Dir(MyPath & "*.xls")         '取文件名
  20.     Do While MyFiles <> ""                  '循环文件
  21.         If TWb <> MyFiles Then              '如果不是本工作簿文件名
  22.             d.Add MyFiles, 0                '把文件名添加到字典对象
  23.             j = j + 1                       '文件数量计数
  24.         End If
  25.         MyFiles = Dir                       '下一个文件
  26.     Loop                                    '进入下一个循环迭代
  27.    
  28.     If j = 0 Then                           '如果文件数量为0,则弹出对话框
  29.         MsgBox "没有文件可合并", , "gvntw"
  30.         Exit Sub                            '退出过程
  31.     End If
  32.    
  33.     arr = d.Keys: d.RemoveAll               '把字典里的Keys赋值给数组,移除字典所有键值
  34.     For i = 0 To UBound(arr)                '循环工作簿
  35.         cn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties=Excel 8.0;Data Source=" & MyPath & "" & arr(i) '打开ADO联接
  36.         Set cat.ActiveConnection = cn       '设置ADOX引用
  37.         For Each Tabs In cat.Tables         '循环工作表
  38.             sql = "Select """ & Replace(arr(i), ".xls", "") & """ as 单位,""" & Replace(Tabs.Name, "$", "") & _
  39.                            """ as 月份,* From [Excel 8.0;DATABASE=" & MyPath & "" & arr(i) & "].[" & Tabs.Name & "]"  'sql语句
  40.             d.Add sql, 0                    '添加到字典
  41.         Next                                '下一个循环迭代
  42.         cn.Close                            '关闭联接
  43.     Next                                    '下一循环
  44.     sql = Join(d.Keys, " UNION ALL ")       '把字典的Keys用“ UNION ALL ”连接赋值给sql
  45.     sql = "SELECT  * from (" & sql & ") where 姓名 like '王%' order by 姓名,月份"                  
  46.                                 '只汇总姓王的记录,如果要汇总全部记录,请把“where 姓名 like '王%'”删除,在sql语句中用%作用通配符,而不用*号
  47.     cn.Open "Provider=Microsoft.Jet.OleDb.4.0;Extended Properties=Excel 8.0;Data Source=" & arr(0)  '打开联接
  48.     Set rst = cn.Execute(sql)               '记录集
  49.     For i = 1 To rst.Fields.Count           '循环字段
  50.         Cells(1, i) = rst(i - 1).Name       '录入字段名
  51.     Next                                    '下一循环
  52.    
  53.     Range("a2").CopyFromRecordset rst       '复制查询结果
  54.     rst.Close: Set rst = Nothing            '关闭记录集,并在内存中清除
  55.     cn.Close: Set cn = Nothing: Set d = Nothing        '关闭ADO联接,并在内存中清除ADO和字典对象,释放内存
  56.     MsgBox "表格已汇总完成", , "gvntw"        '弹出完成对话框
  57.     Exit Sub                                '退出过程
  58. Err:                                        '错误跳转程序
  59. MsgBox Err.Description, , "错误报告"         '弹出错误原因报告
  60. End Sub                                     '结束过程
复制代码
回复

使用道具 举报

小黑屋|手机版|嘻皮客网 ( 京ICP备10218169号|京公网安备11010802013797  

GMT+8, 2024-5-4 20:16 , Processed in 0.182980 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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