2016-06-10 30 views
1

Ich bin neu in VBA, versuchen, ein Outlook-Makro um eine Excel-Tabelle über Microsofts ACE OLEDB Provider zu schreiben. Ich Looping durch die ResultSet nach einer Abfrage und Speicherung der Ergebnisse in einem Collection, entlang der Linien der folgenden Möglichkeiten:Hinzufügen von ADODB RecordSet Element zu 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 

Mit folgendem test.xlsx:

Test Excel data

Wir bekommen:

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

Dies scheint konsistent mit results.Fields.Item("column_name") zurück eine Referenz, die bei jedem MoveNext überschrieben wird, und der Verweis ist, was in values gespeichert ist.

Nicht vertraut mit der Referenz/Wert-Mechanik in VBA, ist diese Vermutung auf dem richtigen Weg, und gibt es eine Möglichkeit, wie ich die Werte speichern kann?

Antwort

0

Kompiliert dieser Code überhaupt?

Ich habe noch nie von einem ADODB.Resultset gehört, es sei denn das ist .NET ??? Auf welche Bibliothek müssen Sie verweisen, um dieses Objekt zu finden?

Versuchen Sie, auf ein Recordset zu verweisen?

Sie verwenden Dim result As New ADODB.ResultSet Dann

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

aber Ihre Schleife wird mit dem Plural 'Ergebnisse'

+0

IIRC Ich Referenzierung 'Microsoft ActiveX Data Objects [6.1]' re: [diese Büroräume] (https://technet.microsoft.com/en-us/library/ee692882.aspx). Das Beispiel ist dem Live-Code nicht 100% ig treu, aber ich hatte gehofft, dass das Problem häufig genug war, um das Formular zu erkennen. Danke für den Hinweis auf den 'Ergebnis'-Fehler! – concat

+0

Ich denke, Sie müssen den Code kopieren und dann für Ihre Verwendung bearbeiten. In diesem Artikel gibt es kein ResultSet - dort heißt es auch Recordset. Als einen Punkt der zukünftigen Referenz sind wir nicht hier, um Code zu untersuchen, der nicht einmal selbst getestet wurde. Sobald Sie es in Gang bringen, könnte es besser sein, die Debug Join-Anweisung außerhalb der Schleife zu setzen - aber das ist nur eine große Vermutung im Moment – dbmitch

+0

Fair genug, ich fragte zunächst in Eile. Auf meiner Arbeitsmaschine konnte ich nun das Verhalten mit dem aktualisierten Beispiel reproduzieren. – concat

0

Ich weiß, das ein alter Thread ist, aber es ist das Top-Ergebnis auf Google, also ist wahrscheinlich eine Antwort in Ordnung.

Wenn Sie Elemente zu einer Sammlung aus einem Recordset mithilfe von results.Fields.Item ("column_name") oder result! Column_name hinzufügen, wird sie als Referenz hinzugefügt. Wenn die Auflistung den Wert nachschlägt, wird dasselbe Ergebnis erzielt immer wieder (auch wenn Sie das Recordset schließen, erhalten Sie bei jedem Index einen EOF-Fehler).

Statt dessen, was Sie tun müssen, ist der Feldwert

MyCollection_.Add results.Fields ("column_name") hinzufügen. Wert