【分享成果,随喜正能量】生活没有过不去的坎,没有转不过的弯。路就在脚下,自己的路需要自己去行走,不管前面还要经历多少风雨,我们都要努力地踏踏实实地走下去。放宽心态,顺其自然,不去计较生活中的每一件小事的得与失,才是真的开心。心态好,一切都好!为了自己,努力生活,快乐活着!

《VBA数据库解决方案》教程是我推出第二套教程,目前已经是第一版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,教程第一版的修订内容主要是完成所有程序文件的32位和64位OFFICE系统测试。

这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是第18讲:数据库中记录的查找

第十八讲 数据库中Recordset对象Find方法的利用

大家好,今日讲解VBA数据库解决方案第18讲:Recordset对象Find方法。FIND方法是我极力推崇的一种方法,在VBA代码解决方案中我曾详细地讲过,可以说FIND是VLOOKUP的终结者,当你开始利用FIND的时候就不会再lookup了,那么这个方法在数据库中是否可以利用呢?答案当然是肯定的。

1 Recordset对象的Find 方法

Recordset对象的Find 方法用于搜索 Recordset记录中满足指定标准的记录。如果满足标准,则记录集游标位置设置在找到的记录上,否则位置将设置在记录集的末尾。

语法: Find (criteria, SkipRows, searchDirection, start)

参数

a criteria 字符串,包含指定用于搜索的列名、比较操作符和值的语句。

b SkipRows 可选。Long 值,其默认值为零,它指定当前行或 Start 书签的行偏移量以开始搜索。在默认情况下,搜索将从当前行开始

c searchDirection 可选的 SearchDirectionEnum 值,指定搜索应从当前行还是下一个有效行开始。其值可为 adSearchForward(1) 或 adSearchBackward(-1)。搜索是在记录集的开始还是末尾结束由 searchDirection 值决定。

d start 可选,变体型书签,用作搜索的开始位置。0或者缺省代表搜索从当前位置开始

1 表示搜索从第一条记录开始 2表示搜索从最后一条记录开始

  • 特别注意1:criteria 中的“比较操作符”可以是“>”(大于)、“<”(小于)、“=”(等于)、“>=”(大于或等于)、“<=”(小于或等于)、“<>”(不等于)或“like”(模式匹配)比较操作符”为LIKE则字符串”*”(某字符可以出现一次或多次)或者”_*”,表示某字符只出现一次
  • 特别注意2:criteria 中的值可以是字符串,浮点数或者日期字符串以单引号分割;日期以”#”号分割。

2 Recordset对象Find方法的实例应用

实例讲解:我们要在上一讲的数据中找到姓马的记录,并显示出来。看下面的代码:

Sub mynz_18() ' 第18讲:Recordset对象Find方法

Dim cnADO, rsADO As Object

Dim strPath, strSQL As String

Set cnADO = CreateObject("ADODB.Connection")

Set rsADO = CreateObject("ADODB.RecordSet")

strPath = ThisWorkbook.Path & "mydata2.accdb"

cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath

strSQL = "SELECT * FROM 员工信息 WHERE 部门='一厂'"

rsADO.Open strSQL, cnADO, 1, 3

Sheets("18").Rows("2:30").Select

Selection.ClearContents

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

Sheets("18").Cells(1, i + 1) = rsADO.Fields(i).Name

Next i

i = 0

rsADO.MoveFirst

rsADO.Find "姓名 Like '马*'"

If rsADO.EOF Then

MsgBox ("没有找到查找内容"): GoTo 100

Else

Do While Not rsADO.EOF

For j = 0 To rsADO.Fields.Count - 1

Sheets("18").Cells(2 + i, j + 1) = rsADO.Fields(j)

Next j

rsADO.Find "姓名 Like '马*'", 1, 1

i = i + 1

Loop

End If

100:

rsADO.Close

cnADO.Close

Set rsADO = Nothing

Set cnADO = Nothing

End Sub

代码截图:

代码的解读:

1) rsADO.Find "姓名 Like '马*'"

上述代码查找姓马的职工姓名

2) If rsADO.EOF Then

MsgBox ("没有找到查找内容"): GoTo 100

Else

如果没有找到,也就是说到了记录集的尾部,那么提示用户,没有找到。

3) Do While Not rsADO.EOF

For j = 0 To rsADO.Fields.Count - 1

Sheets("Sheet1").Cells(2 + i, j + 1) = rsADO.Fields(j)

Next j

rsADO.Find "姓名 Like '马*'", 1, 1

i = i + 1

Loop

End If

如果找到,那么显示记录,并查找下一条rsADO.Find "姓名 Like '马*'", 1, 1 是查找下一条,步长为1,向下查找。

好了,我们看下面的代码的运行测试,首先看看我们的数据库的记录:

我们再利用本讲的程序进行FIND查找,结果:

今日内容回向:

1 在Recordset 中如何利用FIND方法查找?

2 criteria 中的“比较操作符”是否理解呢?

本讲内容参考程序文件:VBA与数据库操作(第一册).xlsm

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

第7套教程(共三册):《VBA之EXCEL应用》:是对VBA基本的讲解

第1套教程(共三册):《VBA代码解决方案》:是入门后的提高教程

第4套教程(16G):VBA代码解决方案之视频(第一套的视频讲解)

第3套教程(共两册):《VBA数组与字典解决方案》:是对数组和字典的专题讲解

第2套教程(共两册):《VBA数据库解决方案》:是对数据库的专题讲解

第6套教程(共两册):《VBA信息获取与处理》:讲解VBA的网络及跨程序应用

第5套教程(共两册):VBA中类的解读和利用:类及接口技术的讲解

第8套教程(共三册):VBA之Word应用(最新教程):word中VBA的利用

上述教程的学习顺序:

① 7→1→3→2→6→5或者7→4→3→2→6→5。

② 7→8