Vba 将ADODB记录集项添加到集合

Vba 将ADODB记录集项添加到集合,vba,reference,oledb,adodb,recordset,Vba,Reference,Oledb,Adodb,Recordset,我是VBA新手,试图通过Microsoft的ACE OLEDB提供程序围绕Excel电子表格编写Outlook宏。我在查询后循环浏览结果集,并将结果存储在集合中,如下所示: Const adOpenStatic = 3 Const adLockOptimistic = 3 Const adCmdText = &H1 Sub Test() Dim conn As New ADODB.Connection Dim results As New ADODB.Recordset

我是VBA新手,试图通过Microsoft的ACE OLEDB提供程序围绕Excel电子表格编写Outlook宏。我在查询后循环浏览
结果集
,并将结果存储在
集合
中,如下所示:

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
使用以下
测试.xlsx

我们得到:

1
2, 2
3, 3, 3
4, 4, 4, 4
5, 5, 5, 5, 5
这似乎与
results.Fields.Item(“column_name”)
一致,它返回的引用在每次
MoveNext
时都会被覆盖,并且引用是存储在
值中的内容


由于不太熟悉VBA中的引用/值机制,这一猜测是否正确,是否有某种方法可以存储这些值?

这段代码甚至可以编译吗

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

您正在尝试引用记录集吗

您正在使用
Dim结果作为新的ADODB.ResultSet
然后

result.Open“从[Sheet1$]中选择*”


但是您的循环使用复数“结果”

这段代码编译了吗

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

您正在尝试引用记录集吗

您正在使用
Dim结果作为新的ADODB.ResultSet
然后

result.Open“从[Sheet1$]中选择*”


但是您的循环使用复数“结果”我知道这是一个旧线程,但它是Google上的顶级结果,因此答案可能是正确的

当您使用results.Fields.Item(“column_name”)或results从记录集中向集合添加项时!列_name,它被添加为引用,因此当集合查找该值时,它会一次又一次地得到相同的结果(同样,如果关闭记录集,每个索引都会出现EOF错误)

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


MyCollection.Add results.Fields(“column\u name”).value

我知道这是一个旧线程,但它是Google上的顶级结果,因此答案可能是正确的

当您使用results.Fields.Item(“column_name”)或results从记录集中向集合添加项时!列_name,它被添加为引用,因此当集合查找该值时,它会一次又一次地得到相同的结果(同样,如果关闭记录集,每个索引都会出现EOF错误)

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


MyCollection_u.Add results.Fields(“column_name”).value

IIRC我正在引用的
Microsoft ActiveX数据对象[6.1]
re:。这个例子并不是100%忠实于实时代码,但我希望这个问题足够普遍,可以识别表单。感谢您指出
结果
slipup!我认为你需要复制代码,然后编辑它供你使用。那篇文章中没有ResultSet,它也被称为Recordset。作为将来的参考,我们不会在这里对甚至还没有自己测试过的代码进行故障排除。一旦开始,将debug-join语句放在循环之外可能会更好——但现在这只是一个很大的猜测,很公平,我承认,一开始是匆忙问的。在我的工作机器上,我现在能够用更新的示例重现该行为。正如我之前所建议的那样-将调试语句置于循环之外在这种情况下我不能-可能是因为数组引用了results.Fields.Item,它错误为“BOF或EOF为true…”IIRC我引用的是
Microsoft ActiveX数据对象[6.1]
re:。该示例并非100%忠实于实时代码,但我希望该问题足够常见,可以识别该表单。感谢您指出
结果
slipup!我认为您需要复制代码,然后编辑它以供使用。该文中没有结果集-它也被称为记录集。作为未来参考点rence我们来这里不是为了解决那些甚至还没有自己测试过的代码的问题。一旦你开始测试,把debug join语句放到循环之外可能会更好——但这只是一个很大的猜测,现在已经足够公平了,我承认最初很匆忙地问。在我的工作机器上,我现在已经能够用更新的正如我之前所建议的,将调试语句放在循环之外在这种情况下我不能——可能是因为数组引用了results.Fields.Item,它会出现错误,错误为“BOF或EOF为true…”