《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,教程第一版的修订内容主要是完成所有程序文件的32位和64位OFFICE系统测试。
这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:VBA数据库解决方案第十讲:Recordset记录集合的动态查询,并显示结果
【分享成果,随喜正能量】一心热枕对待生活,静静的安抚自己内心的急迫和焦虑,你人生的好运,常常在你沉醉于生活时悄悄临门的。。
第十讲 Recordset记录集合的动态查询,并显示结果
大家好,今日继续讲解VBA数据库解决方案的第10讲内容,打开一个指定的数据库记录集,把所得的数据显示到工作表中。今日的内容是和第8讲,第9讲内容是相连续,在第9讲中讲了打开记录集的用的方法是“rsADO.Open strSQL, cnADO, 1, 3”,在第8讲中我们讲了还有一种是“Execute(strSQL)”方法,今日我们就讲利用这种方法达到我们的目的,同时在SQL语句中的我们将查询设置为一个动态的查询。
1 应用场景的具体分析
如下面的工作表文件:我们要根据I2单元格的提示部门信息来查找数据表中的数据并将查询的结果放在左侧的区域:
2 Execute(strSQL)方法实现查询的代码及代码分析
我们看代码:
Sub mynz_10() '第10讲,打开一个指定的数据库记录集,把所得的数据显示到工作表中的方法
Dim cnADO As Object, rsADO As Object
Dim strPath, strSQL As String
Dim i As Integer
strPath = ThisWorkbook.Path & "\mydata.accdb"
Set cnADO = CreateObject("ADODB.Connection")
With cnADO
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Open strPath
End With
strSQL = "SELECT * FROM 职员表 WHERE 部门='" & Cells(2, 9) & " '"
Set rsADO = cnADO.Execute(strSQL)
Sheets("10").Select
Columns("A:E").Select
Selection.ClearContents
Cells(2, 9).Select
For i = 0 To rsADO.Fields.Count - 1
Cells(1, i + 1) = rsADO.Fields(i).Name
Next i
Range("A2").CopyFromRecordset rsADO
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代码截图:
代码解读:
① Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Dim i As Integer
strPath = ThisWorkbook.Path & "\mydata.accdb"
Set cnADO = CreateObject("ADODB.Connection")
上面的代码和第9讲的相同,分别声明了几个变量并建立了数据库的ADO连接,
② 在打开数据库时同时设置了连接:
With cnADO
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Open strPath
End With
这种连接方式采用了我在第8讲中讲到另外的方式,可以参考一下。
③strSQL = "SELECT * FROM 职员表 WHERE 部门= '" & Cells(2, 9) & " '"
我们要重点的讲解一下这条语句,之前有朋友联络问过这类语句的书写方式,今日可以一并回答,这里要注意变量,变量是代码中的变量,在SQL语句中是不能出现变量的,要是常量并用引号括起来,所以在上面的语句中
a "SELECT * FROM 职员表 WHERE 部门= '" 为第一部分
b 最后的 " '"为第三部分
c Cells(2, 9)为第二部分。
三个部分中间用“&”连接起来。大家要务必记住这种书写的方式,这样在程序的运行中SQL语句才正确,下面看看在运行过程中的SQL语句:
④ Set rsADO = cnADO.Execute(strSQL) 对于这条语句,我在第8讲的内容中,也讲到是一种打开记录集的方式之一,是Connection对象的Execute方法,通过上面语句,我们就可以执行查询,并将结果保存到集合的对象中。
下面我将Connection对象的Execute方法再次专门的讲解一下:
ADODB.Connection对象的Execute方法:
该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
- 第一种:执行SQL查询语句时,将返回查询得到的记录集。用法为:
Set对象变量名=连接对象.Execute("SQL语句")
Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。
- 第二种:执行SQL的操作性语言时,没有记录集的返回。此时用法为:
连接对象.Execute "SQL语句" [,RecordAffected][, Option]
参数 RecordAffected为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
参数 Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效
在第9讲的讲解中,我们用了第二种方法,今日的代码用的是第一种代码。至于那种好,我这里没有说明,可以根据写代码人员的喜好即可。
代码的运行结果:
今日内容回向:
1 Connection对象的Execute方法有哪两种方法?
2 如何实现可控的指定查询?并将结果显示?
本讲内容参考程序文件:VBA与数据库操作(第一册).xlsm
我20多年的VBA实践经验,全部浓缩在下面的各个教程中: