1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎样用VBA构造SQL的where子句,实现任意多条件组合查询?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-3-12 23:07 | 显示全部楼层 |阅读模式
本帖最后由 whggwu 于 2015-3-12 23:11 编辑

图1.jpg
如图
当条件字段的值都为空,则返回查询所有记录;
当条件字段的值不为空,按非空单元格的对应的字段,生成查询where子句的语句,只要不为空,多个条件之间为并列的关系。
如上面的条件语句为:where 摘要 like '%张三%' and 金额 between 700 and 2000

请问如何用VBA构造这种动态多条件查询的where的语句?因为用的是SQL数据库,无法上传实例,简单粗略地做了个表,烦请论坛大侠帮看看。
构造SQL查询.zip (4.42 KB, 下载次数: 131)


TA的精华主题

TA的得分主题

发表于 2015-3-13 09:10 | 显示全部楼层
用if判断语句来实现,当条件实现就执行一个语句,你就写4个SQL语句呗

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-13 09:52 | 显示全部楼层
tanchuncheng 发表于 2015-3-13 09:10
用if判断语句来实现,当条件实现就执行一个语句,你就写4个SQL语句呗

有四个字段,哪怕用select case ,嵌套都会很多,如果遇到字段较多的表,又该如何设计?

TA的精华主题

TA的得分主题

发表于 2015-3-13 10:08 | 显示全部楼层
  1. Sub test()
  2.   Dim cnn As New ADODB.Connection
  3.   Dim rs As New ADODB.Recordset
  4.   Dim sql As String
  5.   Dim mybook As String
  6.   mybook = ThisWorkbook.FullName
  7.   With cnn
  8.     If Application.Version = "11.0" Then
  9.       .Provider = "microsoft.jet.oledb.4.0"
  10.       .ConnectionString = "extended properties=""excel 8.0;HDR=YES;"";data source=" & mybook
  11.     Else
  12.       .Provider = "microsoft.ACE.oledb.12.0"
  13.       .ConnectionString = "extended properties=""excel 12.0;HDR=YES;"";data source=" & mybook
  14.     End If
  15.     .Open
  16.   End With
  17.   With Worksheets("sheet2")
  18.     arr = .Range("b14:e17")
  19.   End With
  20.   tj = ""
  21.   For i = 1 To UBound(arr)
  22.     If Len(arr(i, 2)) <> 0 Then
  23.       Select Case i
  24.         Case 1
  25.           tj = tj & " And " & arr(i, 1) & "='" & arr(i, 2) & "'"
  26.         Case 2
  27.           tj = tj & " And " & arr(i, 1) & " Like '" & arr(i, 2) & "'"
  28.         Case 3
  29.           tj = tj & " And (" & arr(i, 1) & " Between " & arr(i, 2) & " and " & arr(i, 4) & ")"
  30.         Case 4
  31.           tj = tj & " and (" & arr(i, 1) & " Between #" & arr(i, 2) & "# And #" & arr(i, 4) & "#)"
  32.       End Select
  33.     End If
  34.   Next
  35.   If tj = "" Then
  36.     tj = True
  37.   Else
  38.     tj = Mid(tj, 6)
  39.   End If
  40.   sql = "select * from [sheet2$" & Worksheets("sheet2").Range("a1").CurrentRegion.Address(0, 0) & "] where " & tj
  41.   rs.Open sql, cnn, adOpenKeyset, adLockOptimistic
  42.   With Worksheets("sheet3")
  43.     .Cells.Delete
  44.     For j = 0 To rs.Fields.Count - 1
  45.       .Cells(1, j + 1) = rs.Fields(j).Name
  46.     Next
  47.     .Range("a2").CopyFromRecordset rs
  48.   End With
  49. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-3-13 10:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
详见附件。

构造SQL查询.rar

12.94 KB, 下载次数: 683

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-13 20:18 | 显示全部楼层
chxw68 发表于 2015-3-13 10:08
详见附件。

非常感谢辛苦答复!
原来关窍在循环和where true
尝试关键之处改成如下代码,也是可以,之前思路一直不通,现在清除了,万分感谢。
  1.   tj = ""
  2.   For i = 1 To 4
  3.     If Len(arr(i, 2)) <> 0 Then
  4.       Select Case i
  5.         Case 1
  6.           tj = tj & " And " & arr(i, 1) & "='" & arr(i, 2) & "'"
  7.         Case 2
  8.           tj = tj & " And " & arr(i, 1) & " Like '%" & arr(i, 2) & "%'"
  9.         Case 3
  10.           tj = tj & " And (" & arr(i, 1) & " Between " & arr(i, 2) & " and " & arr(i, 4) & ")"
  11.         Case 4
  12.           tj = tj & " and (" & arr(i, 1) & " Between #" & arr(i, 2) & "# And #" & arr(i, 4) & "#)"
  13.       End Select
  14.     End If
  15.   Next
  16.   sql = "select * from [sheet2$" & Worksheets("sheet2").Range("a1").CurrentRegion.Address(0, 0) & "] where 1=1 " & tj
复制代码

TA的精华主题

TA的得分主题

发表于 2015-3-13 20:27 | 显示全部楼层
whggwu 发表于 2015-3-13 20:18
非常感谢辛苦答复!
原来关窍在循环和where true
尝试关键之处改成如下代码,也是可以,之前思路一直不 ...

也可以将SQL语句改成下面形式:
sql = "select * from [sheet2$" & Worksheets("sheet2").Range("a1").CurrentRegion.Address(0, 0) & "]“ & iif(tj="","","  where "  &  tj)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-13 20:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
chxw68 发表于 2015-3-13 20:27
也可以将SQL语句改成下面形式:
sql = "select * from [sheet2$" & Worksheets("sheet2").Range("a1").C ...

嗯,是的,where 1=1 有些人说会影响性能,有些则说不会,不太了解,用IIF判断则省却此问题

TA的精华主题

TA的得分主题

发表于 2016-3-4 08:51 | 显示全部楼层
学习了,最近也是在烦恼这个问题,多条件查询有条件为空值的时候如何处理,非常棒!

TA的精华主题

TA的得分主题

发表于 2016-3-4 10:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
怎么做一个简单的题库抽取程序请高手支招
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-2-17 20:49 , Processed in 0.028064 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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