将ADODB RecordSet项添加到Collection

时间:2016-06-10 03:27:11

标签: vba reference oledb adodb recordset

我是VBA的新手,试图通过微软的ACE OLEDB Provider在Excel电子表格周围编写Outlook宏。我在查询后循环遍历ResultSet并将结果存储在Collection中,如下所示:

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1

Sub Test()
   Dim conn As New ADODB.Connection
   Dim results As New ADODB.Recordset
   Dim values As Object
   Set values = CreateObject("System.Collections.ArrayList")

   conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\Users\me\test.xlsx;" & _
     "Extended Properties=""Excel 12.0; HDR=YES;"""

   results.Open "SELECT * FROM [Sheet1$]", _
     conn, adOpenStatic, adLockOptimistic, adCmdText
   Do Until results.EOF
     values.Add results.Fields.Item("num")
     Debug.Print Join(values.toArray, ", ")
     results.MoveNext
   Loop
End Sub

使用以下test.xlsx

Test Excel data

我们得到:

1
2, 2
3, 3, 3
4, 4, 4, 4
5, 5, 5, 5, 5

这似乎与results.Fields.Item("column_name")一致,返回在每个MoveNext覆盖的引用,引用是values中存储的内容。

对VBA中的参考/价值机制不太熟悉,这个猜测是在正确的轨道上,是否有某种方式我可以存储这些值?

2 个答案:

答案 0 :(得分:0)

这段代码甚至可以编译吗?

我从来没有听说过ADODB.Resultset,除非这是.NET ??? 您需要参考哪个库来查找此对象?

您是否尝试引用Recordset?

您正在使用Dim result As New ADODB.ResultSet 然后

result.Open "SELECT * FROM [Sheet1$]"

但您的循环使用复数' 结果'

答案 1 :(得分:0)

我知道这是一个旧帖子,但它是谷歌的最佳结果,所以答案可能是有序的。

使用results.Fields.Item(" column_name")或结果!column_name从记录集向集合中添加项目时,它会作为参考添加,因此当集合查找时该值,它反复得到相同的结果(同样,如果你关闭记录集,你会在每个索引处得到一个EOF错误。)

相反,您需要做的是添加字段值

MyCollection_.Add results.Fields(" column_name")。value