ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用VBA SQL统计筛选文件夹下多个文档的数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-4-6 10:54 | 显示全部楼层 |阅读模式
用VBA SQL统计筛选文件夹下多个文档的数据

数据汇总.rar

16.76 KB, 下载次数: 85

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-6 12:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
太感谢了,学习

TA的精华主题

TA的得分主题

发表于 2011-4-6 11:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
每个工作表加上标题,否则会造成第一行数据丢失
请参考:
Sub Macro1()
    Dim cnn As Object, rs As Object, SQL$, Mypath$, MyFile$, n%, f$
    Set cnn = CreateObject("adodb.connection")
    Mypath = ThisWorkbook.Path & "\DD-0\"
    MyFile = Dir(Mypath & "*.xls")
    Do While MyFile <> ""
        n = n + 1
        If n = 1 Then
            cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & Mypath & MyFile
            Set rs = cnn.Execute("[" & Split(MyFile, ".")(0) & "$]")
            f = rs.Fields(1).Name
            SQL = "select * from [" & Split(MyFile, ".")(0) & "$] where " & f & ">=100"
        Else
            SQL = SQL & " union all select * from [Excel 8.0;Database=" & Mypath & MyFile & "].[" & Split(MyFile, ".")(0) & "$] where  " & f & ">=100"
        End If
        MyFile = Dir()
    Loop
    [a2].CurrentRegion.ClearContents
    [a2].CopyFromRecordset cnn.Execute(SQL)
    cnn.Close
    Set cnn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2011-4-6 11:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-4-6 12:31 | 显示全部楼层

回复 3楼 zhaogang1960 的帖子

向老师学习了.这种用法还是第一次看到,直接execute表名:cnn.Execute("[" & Split(MyFile, ".")(0) & "$]"
它返回的是什么呢?等价于"select * from 表名"?

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-6 12:40 | 显示全部楼层
第二行B列的值大于等于100,为何汇总不出来,请zhaogang1960老师看看

TA的精华主题

TA的得分主题

发表于 2011-4-6 12:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 onthetrip 于 2011-4-6 12:31 发表
向老师学习了.这种用法还是第一次看到,直接execute表名:cnn.Execute("[" & Split(MyFile, ".")(0) & "$]"
它返回的是什么呢?等价于"select * from 表名"?

应该是吧,这种用法来自于创建(access)数据表记录集:
rs.Open 数据表名,cnn

Set rs=cnn.Execute(数据表名)
但好像对于非连接数据源不能使用,还得用"select * from ……"

TA的精华主题

TA的得分主题

发表于 2011-4-6 12:43 | 显示全部楼层
原帖由 hhaa999 于 2011-4-6 12:40 发表
第二行B列的值大于等于100,为何汇总不出来,请zhaogang1960老师看看

2楼已经注明:
“每个工作表加上标题,否则会造成第一行数据丢失”

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-6 12:56 | 显示全部楼层
工作表名一改变,就出现错误,是不是以工作表名的第一个字符为选择,如果改变了又如何呢,请老师解惑

数据汇总.rar

17.49 KB, 下载次数: 20

TA的精华主题

TA的得分主题

发表于 2011-4-6 15:55 | 显示全部楼层
原帖由 hhaa999 于 2011-4-6 12:56 发表
工作表名一改变,就出现错误,是不是以工作表名的第一个字符为选择,如果改变了又如何呢,请老师解惑

这个附件不同于上面的,工作表名没有规律了,上面的工作表名就是工作簿名
还有就是表头(或字段)不能是空的
Sub Macro1() '引用Microsoft AD0 Ext 2.8 for DDL and Security
    Dim cnn As Object, rs As Object, SQL$, Mypath$, MyFile$, n%, f$, s$
    Dim cat  As New ADOX.Catalog, tb1 As Table
    Set cnn = CreateObject("adodb.connection")
    Mypath = ThisWorkbook.Path & "\DD-0\"
    MyFile = Dir(Mypath & "*.xls")
    Do While MyFile <> ""
        n = n + 1
        cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=No';Data Source=" & Mypath & MyFile
        For Each tb1 In cat.Tables
            If tb1.Type = "TABLE" Then
                s = Replace(tb1.Name, "'", "")
                If Right(s, 1) = "$" Then
                    If n = 1 Then
                        cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & Mypath & MyFile
                        Set rs = cnn.Execute("[" & s & "]")
                        f = rs.Fields(1).Name
                        SQL = "select * from [" & s & "] where " & f & ">=100"
                    Else
                        SQL = SQL & " union all select * from [Excel 8.0;Database=" & Mypath & MyFile & "].[" & s & "] where  " & f & ">=100"
                    End If
                End If
            End If
        Next
        MyFile = Dir()
    Loop
    [a2].CurrentRegion.ClearContents
    [a2].CopyFromRecordset cnn.Execute(SQL)
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
End Sub

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-28 05:30 , Processed in 0.047232 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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