我是VBA的新手,试图通过Microsoft的ACE OLEDB Provider在Excel电子表格中编写Outlook宏。我循环通过ResultSet
查询后存储在Collection
结果,沿着以下线路:将ADODB RecordSet项目添加到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中的引用/值机制不太熟悉,这种猜测是否在正确的轨道上,是否有某种方式可以存储值?
IIRC我引用'Microsoft ActiveX数据对象[6.1]' re:[这个Office Space](https://technet.microsoft.com/en-us/library/ee692882.aspx)。这个例子并不是100%忠实于现场代码,但我希望这个问题很普遍,足以认识到这种形式。感谢您指出'结果'遗漏! – concat
我认为你需要复制代码然后编辑它供你使用。该文章中没有ResultSet - 它也被称为Recordset。作为未来参考的一个要点,我们不是要对自己未经过测试的代码进行故障排除。一旦你完成了,将调试连接语句放在循环之外可能会更好 - 但这只是一个很大的猜测,现在 – dbmitch
够公平的,我最初急急地问道。在我的工作机器上,我现在可以通过更新的示例重现行为。 – concat