2016-06-10 61 views
1

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

Test Excel data

我們得到:

1 
2, 2 
3, 3, 3 
4, 4, 4, 4 
5, 5, 5, 5, 5 

這似乎與results.Fields.Item("column_name")返回一致在每個MoveNext處被覆蓋的參考,以及存儲在values中的參考。

對VBA中的引用/值機制不太熟悉,這種猜測是否在正確的軌道上,是否有某種方式可以存儲值?

回答

0

這段代碼是否可以編譯?

我從來沒有聽說過ADODB.Resultset除非這是.NET? 什麼庫你不得不參考找到這個對象?

你想引用記錄集?

您使用Dim result As New ADODB.ResultSet 然後

result.Open "SELECT * FROM [Sheet1$]"

,但你的循環使用複數「結果」

+0

IIRC我引用'Microsoft ActiveX數據對象[6.1]' re:[這個Office Space](https://technet.microsoft.com/en-us/library/ee692882.aspx)。這個例子並不是100%忠實於現場代碼,但我希望這個問題很普遍,足以認識到這種形式。感謝您指出'結果'遺漏! – concat

+0

我認爲你需要複製代碼然後編輯它供你使用。該文章中沒有ResultSet - 它也被稱爲Recordset。作爲未來參考的一個要點,我們不是要對自己未經過測試的代碼進行故障排除。一旦你完成了,將調試連接語句放在循環之外可能會更好 - 但這只是一個很大的猜測,現在 – dbmitch

+0

夠公平的,我最初急急地問道。在我的工作機器上,我現在可以通過更新的示例重現行爲。 – concat

0

我知道這是一個古老的線程,但它是在頂部結果谷歌,所以一個答案可能是爲了。

當您使用results.Fields.Item(「column_name」)或results!column_name將項添加到記錄集的集合中時,它被添加爲引用,因此當集合查找值時,它會得到相同的結果一遍又一遍(另外,如果關閉記錄集,則每個索引處都會出現EOF錯誤)。

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

MyCollection_.Add results.Fields( 「欄」)。值