VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理

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

这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:VBA数据库解决方案第十五讲:Recordset集合中的单个数据的精确处理

【分享成果,随喜正能量】 你有你的立场,我有我的底气。各自修行,各自好;各自因果,各自了。成年人最大的清醒,就是管好自己,不渡他人,。

第十五讲 Recordset集合中的单个数据的精确处理

大家好,今天给继续讲解VBA数据库解决方案的第15讲:Recordset集合的单个数据精确处理,在前几讲中,我们讲了Table对象的添加和删除。今天我们要讲的内容是Recordset集合的处理方案,这个处理和Table的处理是关系紧密的,在第10讲中我们讲了利用下面的语句实现Recordset集合内容的可视化导出:Range("A2").CopyFromRecordset rsADO,那么是否还有其他的办法能精确的控制导出的内容呢?

比如我只需要其中几个字段的记录,该如何处理呢?这时我们需要对Recordset集合的详细的数据处理了,也就是说要通过循环语句把每一个数据都要遍历到。

1 记录集的MoveFirs,MoveLast,MoveNext,MovePrevious方法

  • MoveFirst方法

作用是:将记录指针移动到记录集中的第一条记录。它以第一条记录作为当前记录。

  • 当记录集为空时,请求MoveFirst或MoveLast将产生一个错误。
  • MoveLast方法

作用是:将记录指针移动到记录集中的最后一条记录。它以最后一条记录作为当前记录。

  • 当记录集为空时,请求MoveFirst或MoveLast将产生一个错误。
  • 如果记录集对象不支持书签或不能向后移动指针,那么将产生错误。
  • MoveNext方法

作用是:将记录指针移动到记录集中的下一条记录。它以下一条记录作为当前记录。

  • 当当前记录指针位于最后一条记录时,如果你请求这个方法,将产生错误。
  • MovePrevious 方法

作用是:将记录指针移动到记录集中的上一条记录。它以上一条记录作为当前记录。

  • 如果记录集对象不支持书签或不能向后移动指针,那么将产生错误。.
  • 当当前记录为记录集中第一条记录时,如果你请求该方法,那么它将产生一个错误。

由此我们还要判断记录集是否为首位还要判断,这时是通过般需要通过Recordset对象的EOF属性先进行判断游标是否到了记录尾。当游标到了记录尾时,EOF属性会被设置为True。

同理可以通过Recordset对象的BOF属性先进行判断游标是否到了记录首。当游标到了记录首时,BOF属性会被设置为True。

2 精准控制记录集的导出

如下面的数据库的数据,我们要导出部门为"一厂"的职工目录,该如何做到呢?

代码如下:

Sub mynz_15() '第15讲:Recordset集合的单个数据精确处理

Dim cnADO As Object, rsADO As Object

Dim strPath As String, strSQL As String

Dim i As Integer

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("15").Select

Cells.ClearContents

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

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

Next i

For i = 1 To rsADO.RecordCount

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

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

Next j

rsADO.MoveNext

Next i

rsADO.Close

cnADO.Close

Set rsADO = Nothing

Set cnADO = Nothing

MsgBox "ok!"

End Sub

代码截图:

代码解析:

1)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

上述代码先建立ADO 和RS 对象并打开

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

rsADO.Open strSQL, cnADO, 1, 3

上述语句,建立一个SQL语句并打开

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

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

Next i

表头计入

4) For i = 1 To rsADO.RecordCount

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

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

Next j

rsADO.MoveNext

Next i

数据内容计入,这个是今日内容的重点,这种方法的操作数据是一个一个计入的。对于记录集的指针转到下一个记录一定要用rsADO.MoveNext 移动记录。

5)rsADO.Close

cnADO.Close

Set rsADO = Nothing

Set cnADO = Nothing

关闭连接,释放内存。

看下面的输出结果:

通过记录集的精准控制,可以完成具体到每个数据的判断,应用是非常灵活的,

今日内容回向:

1 MoveFirs,MoveLast,MoveNext,MovePrevious 方法的意义是否理解呢?

2 如何实现记录的精确控制?

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

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

相关推荐
&岁月不待人&17 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove21 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道28 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒32 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio41 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE43 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻1 小时前
WPF中的依赖属性
开发语言·wpf
洋2401 小时前
C语言常用标准库函数
c语言·开发语言
进击的六角龙1 小时前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点1 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式