2016-06-10 41 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( “栏”)。值