ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA SQL 多表查询

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-22 17:41 | 显示全部楼层 |阅读模式
情况描述如下: 需要用四个关键词 用户名 用户地址 开始时间 结束时间 进行查询。
查询的表格在同一文件夹下 20个左右工作簿 每个工作簿5-7个工作表,每个表的数据大概在 6000条

每个工作表的四个关键字所在列数不一样,而且不相邻,我试过数组和字典,查询速度很慢,请问SQL语句应该怎么写?但是我对SQL实在不擅长,查了一下午没有方向,希望大家可以帮助我。附上自己写的用字典查询的代码。
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
p = ThisWorkbook.Path & "\"
f = Dir(p & "*.xls")
nm = ThisWorkbook.Name
Set d = CreateObject("Scripting.Dictionary")
Dim targetWB(1 To 15)
    R = 1
    f = Dir(p & "*.xls")
    Do
        If Split(f, ".")(0) <> Split(nm, ".")(0) Then
        targetWB(R) = p & f
            Workbooks.Open (targetWB(R)), UpdateLinks:=0
            Set wbtarget = Workbooks.Open(targetWB(R))
            targetWB(R) = Split(wbtarget.Name, ".")(0)
            R = R + 1
        End If
    f = Dir
    Loop Until f = ""
ThisWorkbook.Sheets("汇总1").Columns("A:AZ").Delete
For tarWB = 1 To R - 1

For i = 2 To ThisWorkbook.Sheets("汇总").Range("a65536").End(xlUp).Row
                      ThisWorkbook.Sheets("汇总").Rows(i).Copy ThisWorkbook.Sheets("汇总1").[A65536].End(xlUp).Offset(1, 0)
                    ThisWorkbook.Sheets("汇总1").[A65536].End(xlUp).Interior.ColorIndex = 40



myAddress = ThisWorkbook.Sheets("汇总").Cells(i, "D")
myAddressName = ThisWorkbook.Sheets("汇总").Cells(i, "E")
myStartTime = CLng(ThisWorkbook.Sheets("汇总").Cells(i, "F"))
myEndTime = CLng(ThisWorkbook.Sheets("汇总").Cells(i, "G"))

searchlocal = Join(Array(myAddress, myAddressName, myStartTime, myEndTime), "#")


For Each sh In Workbooks(targetWB(tarWB)).Worksheets

     '   For k = Workbooks(targetWB(tarWB)).Sheets.Count To 1 Step -1 ' 搜索文件的所有sheet
          '  With Workbooks(targetWB(tarWB)).Sheets(k)
          With sh
                Set f1 = .Rows(1).Find("站点编码", LookAt:=xlWhole)
                Set f2 = .Rows(1).Find("站点名称", LookAt:=xlWhole)
                Set f3 = .Rows(1).Find("起始日期", LookAt:=xlWhole)
                Set f4 = .Rows(1).Find("截止日期", LookAt:=xlWhole)



                If f1 Is Nothing Or f2 Is Nothing Or f3 Is Nothing Or f4 Is Nothing Then
                    ThisWorkbook.Sheets("汇总1").[A65536].End(xlUp).Offset(1, 0).Resize(1, 4) = Array("△", wbtarget.Name, .Name, "表格式不符")
                Else
                    ColumnsAddress = f1.Column
                    ColumnsAddressName = f2.Column
                    ColumnsStartTime = f3.Column
                    ColumnsEndTime = f4.Column

                    ReDim arrtarget(2 To .Range("a65536").End(xlUp).Row)
                    Erase arrtarget
                    For m = 2 To .Range("a65536").End(xlUp).Row 'sheet中所有行


                        If .Cells(m, ColumnsAddress) = "" Or _
                            .Cells(m, ColumnsAddressName) = "" Or _
                            .Cells(m, ColumnsStartTime) = "" Or _
                            .Cells(m, ColumnsEndTime) = "" Then

                        Else
                        target = Array(.Cells(m, ColumnsAddress), .Cells(m, ColumnsAddressName), CLng(CDate(.Cells(m, ColumnsStartTime))), CLng(CDate(.Cells(m, ColumnsEndTime))))
                        target = Join(target, "#")
                            d(target) = m

                        End If

                        If d.exists(searchlocal) Then
                            .Rows(d.Item(searchlocal)).Copy
                            ThisWorkbook.Sheets("汇总1").[A65536].End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
                            ThisWorkbook.Sheets("汇总1").[A65536].End(xlUp).PasteSpecial Paste:=xlPasteFormats


                            ThisWorkbook.Sheets("汇总1").[A65536].End(xlUp).Resize(1, 4) = Array("●", targetWB(tarWB), .Name, d.Item(searchlocal))

                            ThisWorkbook.Sheets("汇总1").[A65536].End(xlUp).Interior.ColorIndex = 3


                        Else ' 数据不符
                            ThisWorkbook.Sheets("汇总1").[A65536].End(xlUp).Resize(1, 4) = Array("×", targetWB(tarWB), .Name, "无数据")
                        End If

                    Next m
                End If
            End With
        Next


Application.CutCopyMode = False
Next i
Next tarWB

For tarWB = 1 To R

Workbooks(targetWB(tarWB)).Close
Next tarWB

Application.ScreenUpdating = True
MsgBox "finished"
End Sub


TA的精华主题

TA的得分主题

发表于 2019-1-22 19:15 来自手机 | 显示全部楼层
上传个附件吧,我的通用查询应该能帮助你。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-22 19:43 来自手机 | 显示全部楼层
lilyhcn1 发表于 2019-1-22 19:15
上传个附件吧,我的通用查询应该能帮助你。

稍等 正在整理

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-22 20:11 | 显示全部楼层
附件,请大家帮忙修改一下

汇总.rar

58.92 KB, 下载次数: 55

TA的精华主题

TA的得分主题

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

附件添加到楼下了 谢谢

TA的精华主题

TA的得分主题

发表于 2019-1-22 21:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你的代码全是在访问对象,肯定慢。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-22 21:24 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
chentonny 发表于 2019-1-22 21:18
你的代码全是在访问对象,肯定慢。

不访问对象怎么改进?是用SQL吗?

TA的精华主题

TA的得分主题

发表于 2019-1-22 21:33 | 显示全部楼层
daya1dai 发表于 2019-1-22 21:24
不访问对象怎么改进?是用SQL吗?

如果你非要用EXCEL处理这些数据,建议还是用EXCEL做前台,ACCESS做后台,通过ADO连结。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 08:58 , Processed in 0.034521 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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