Vba 将ADODB记录集项添加到集合
我是VBA新手,试图通过Microsoft的ACE OLEDB提供程序围绕Excel电子表格编写Outlook宏。我在查询后循环浏览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
结果集
,并将结果存储在集合
中,如下所示:
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”).valueIIRC我正在引用的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…”