我是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