打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Excel VBA ADO SQL入门教程008:条件查询(下)

啪!扔手机……书接上回……


1.

上节我们分享了Where子句的单条件和多条件查询,今天就把当时未讲的模糊匹配查询说一下。

我们知道,在Excel中有两个很重要的通配符:星号(*)和问号(?);在字符串中,星号可以代替0到多个字符,而问号(一个)则只能代表一个字符。在SQL in Excel中也有两个与之类似的通配符;一个是%,类似星号,可代替任意数量字符。一个是_,类似问号,一个_只能代替一个字符。

……在SQL查询语句中使用通配符,必须借助LIKE运算符。

举个例子,依然使用上一节的荔枝。

倘若我们需要获取姓名中包含“光”字的学生名单,SQL代码如下:

SELECT 姓名 FROM [学生表$] WHERE 姓名 LIKE '%光%'

倘若我们需要获取姓名长度为2个字符的学生名单,SQL代码如下:

SELECT 姓名 FROM [学生表$] WHERE 姓名 LIKE '__'

倘若我们需要获取姓名以“美女”开头(啧啧,好自恋的人啊,居然以美女为姓,此处必须手动@芬子@空空),同时年龄小于18岁的学生名单,SQL代码如下:

SELECT 姓名,年龄 FROM [学生表$] WHERE 姓名 LIKE '美女%' AND 年龄<18

……

……

当Excel单元格存在星号(*),而我们又需要批量查找或替换星号时,通常使用“~”进行强制转义。

那么在SQL中,又使用什么符号可以取消%和_的通配符能力,归为普通字符呢?

不知你是否还记得当字段名出现特殊字符(例如空格)时,我们是怎么处理的——使用中括号[]将字段名包括起来,这里同样如此。

还是举个栗子。

如上图所示,是一份名为学生表的Excel工作表,倘若我们需要查询“备注”字段包含特殊字符(_)的学生名单,代码如下:

SELECT 姓名,备注 FROM [学生表$] WHERE 备注 LIKE '%[_]%'

小贴士:

在SQL IN Excel中,不支持使用通配符*和?,只能使用通配符%和_,但在ACCESS数据库中,不支持使用通配符%和_,只支持*和?。



2.

举一个对新手而言可能稍微复杂的VBA ADO SQL的实例(示例文件可以点击文末的【阅读原文】下载)。

该实例在工作中是较为常见也较为实用的。

在一个工作簿里,有两个工作表,一个是学生表,一个是查询表。

上图是学生表,记录了学生信息的明细。

上图是查询表。第一行是标题栏,有四个字段名,分别是班级、姓名、性别、爱好。

要求:

在查询表字段名对应的第二行的单元格输入关键值后,点击【查询】按钮,从“学生表”获取符合查询条件的学生信息。

效果动画示意:

VBA代码如下:


Sub SqlFindData()

    Dim cnn As Object, rst As Object

    Dim Mypath As String, Str_cnn As String, Sql As String

    Dim i As Long, j As Long

    Set cnn = CreateObject('adodb.connection')

    Mypath = ThisWorkbook.FullName

    If Application.Version < 12 Then

        Str_cnn = 'Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=' & Mypath

    Else

        Str_cnn = 'Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=' & Mypath

    End If

    cnn.Open Str_cnn

    '以上后期绑定ADO并建立当前文件链接

    For j = 1 To 4

        If Len(Cells(2, j).Value) Then

        '当查询关键值不为空时,使用and运算符和like链接在一起

            Sql = Sql & ' AND ' & Cells(1, j).Value & ' LIKE '%' & Cells(2, j).Value & '%''

        End If

    Next

    If Len(Sql) = 0 Then MsgBox '尚未输入任一查询关键值。': Exit Sub

    '当没有输入任何查询关键值时退出程序

    Sql = 'SELECT * FROM [学生表$] WHERE ' & Mid(Sql, 5)

    Set rst = cnn.Execute(Sql)

    'cnn.Execute()执行SQL语句

    ActiveSheet.UsedRange.Offset(3).ClearContents

    For i = 0 To rst.Fields.Count - 1

    '遍历记录集中的字段名

        Cells(4, i 1) = rst.Fields(i).Name

    Next

    Range('a5').CopyFromRecordset rst

    '将记录复制到单元格区域

    ActiveSheet.ListObjects.Add xlSrcRange, ActiveSheet.UsedRange.Offset(3), , xlYes

    '数据区域转换为【表】

    cnn.Close '关闭链接

    Set cnn = Nothing '释放内存

End Sub


小贴士:

1.VBA ADO方法执行SQL语句的最大优势之一便是VBA对象、变量和循环的使用,它们使SQL语句的组合非常灵活,可以极有层次感的表述复杂的SQL语句。上述示例中,通过遍历单元格对象A1:D2,搭配SQL查询语句中AND和LIKE运算符,用较少的VBA代码完成了多条件的模糊匹配查询,这比VBA自身的INSTR函数要高效的多。

2. 没有VBA基础的朋友可以对该实例先飘过。学一下常用的SQL查询语句,按第1章OLE DB法,结合透视表或表功能使用SQL语句,也是极其实用的。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Excel VBA ADO SQL入门教程012:多表数据合并汇总
Excel VBA ADO SQL入门教程002:简单认识ADO
VBA连接Mysql数据库
在VBA中使用SQL必须要知道的几点
VBA ADO SQL语句,小试牛刀。
VBA
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服