我是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
:
我们得到:
1
2, 2
3, 3, 3
4, 4, 4, 4
5, 5, 5, 5, 5
这似乎与results.Fields.Item("column_name")
一致,返回在每个MoveNext
覆盖的引用,引用是values
中存储的内容。
对VBA中的参考/价值机制不太熟悉,这个猜测是在正确的轨道上,是否有某种方式我可以存储这些值?
答案 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