分享

VBA数据库解决方案第42讲:把记录集的数据,如何记入数组

 xfzxlgs 2022-06-23 发布于江西

大家好,今日继续讲解《VBA数据库解决方案》,今日讲解第42讲内容,把记录集的数据,如何记入数组。这讲的内容涉及到数组在数据库中的应用,如果大家对数组还有不理解之处也可以参考拙著《工作表数组与VBA数组解决方案》,数组在EXCEL及其接口程序中的应用中有着不可替代的角色,利用好了,可以给自己的工作表处理和VBA数据处理带来很大的方便。

今日实例:在数据库中有如下的数据:

图片

我要做的是打开这个数据库,然后把内容先存到一个数组中,最后在工作表中体现出来。

看代码:

Sub mynzUpdateRecords_42() '42将数据记录存入数组的方案

Dim cnADO, rsADO As Object, Fdsarr, Arr

   Dim strPath, strTable, strSQL, strMsg As String

   Set cnADO = CreateObject("ADODB.Connection")

   Set rsADO = CreateObject("ADODB.Recordset")

   strPath = ThisWorkbook.Path & "\mydata2.accdb"

   strTable = "员工信息"

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

    '汇报给用户记录数

    strSQL = "SELECT * FROM " & strTable

    rsADO.Open strSQL, cnADO, 1, 3

    Fdsarr = Array("员工编号", "姓名", "性别", "民族", "部门", "职务", "电话", "出生日期")  '字段名

   Arr = Application.Transpose(rsADO.GetRows(, 1, Fdsarr))  '记录存入数组

   For x = 1 To UBound(Arr)

       Cells(x + 1, 1).Resize(1, 8) = Application.Index(Arr, x, 0)

   Next

   rsADO.Close

    '释放内存

   cnADO.Close

   Set rsADO = Nothing

   Set cnADO = Nothing

End Sub

代码截图:

图片

代码讲解:

1  Fdsarr = Array("员工编号", "姓名", "性别", "民族", "部门", "职务", "电话", "出生日期")  '字段名

Arr =Application.Transpose(rsADO.GetRows(, 1, Fdsarr))  '记录存入数组

这里利用了一个方法:rsADO.GetRows(,1, Fdsarr)

GetRows方法:此方法传回一个二维的数组,每一行对应Recordset中的一笔记录,且每一列对应到记录中的字段。

此方法的语法如下:varArray =rs.GetRows([Rows], [Start], [Fields])

参数:

Rows是要读取记录的数量;如果想要取得Recordset所有记录,可用-1或省略此参数。

Start 是指出第一个被读取记录的书签;也可以是下列列举常数中的一个:0-adBookmarkCurrent(目前记录)、1-adBookmarkFirst(第一笔记录)、或2-adBookmarkLast(最后记录)。

Fields 是可选择的栏位名称字段,其用来限制要读取的资料量。(也可指定单一字段名称、单一栏位索引、或者一个栏位索引阵列)。

2  Forx = 1 To UBound(Arr)

       Cells(x + 1, 1).Resize(1, 8) = Application.Index(Arr, x, 0)

Next

上面的过程中也用到了一个函数Index(Arr,x, 0),是调用工作表函数indexINDEX 返回列表或数组中的元素值,此元素由行序号和列序号的索引值给定。

INDEX 函数有两种语法形式:数组和引用。数组形式通常返回数值或数值数组,引用形式通常返回引用。

当函数 INDEX 的第一个参数为数组常数时,使用数组形式。

语法:数组形式INDEX(array,row_num,column_num)

参数:

 Array 为单元格区域或数组常量。

 如果数组只包含一行或一列,则相对应的参数 row_num  column_num 为可选。

如果数组有多行和多列,但只使用 row_num  column_num,函数 INDEX 返回数组中的整行或整列,且返回值也为数组。

 Row_num 数组中某行的行序号,函数从该行返回数值。如果省略 row_num,则必须有Column_num

 Column_num 数组中某列的列序号,函数从该列返回数值。如果省略 column_num,则必须有 row_num

特别说明:

①如果同时使用row_num  column_num,函数 INDEX 返回 row_num  column_num 交叉处的单元格的数值。

②如果将 row_num  column_num 设置为 0,函数 INDEX 则分别返回整个列或行的数组数值。Row_num  column_num 必须指向 array 中的某一单元格;否则,函数 INDEX 返回错误值 #REF!

例:=INDEX(A2:B3,2,2)返回单元格区域的第二行和第二列交叉处的值

=INDEX(A2:B3,2,1) 返回单元格区域的第二行和第一列交叉处的值

下面看我们程序的运行结果:

图片

今日内容回向:

1  如何把记录集传递给数组?

2 GetRows  INDEX 是否理解呢?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多