2012-07-24 8 views
5

Ich habe ein externes Programm, das Daten in CSV-Dateien exportiert. Meine Benutzer möchten über eine VBA-Funktion in Excel Zugriff auf diese Daten haben. Um dies zu tun, dachte ich darüber nach, die CSV-Datei in eine Funktion zu schreiben, die ein ADODB.Recordset zurückgibt. Mein Code istCSV-Datei als Datensatz zurückgeben

Public Function getData(fileName As String) As ADODB.Recordset 
Dim path As String 
path = "C:\testDir\" 
Dim cN As New ADODB.Connection 
Dim RS As New ADODB.Recordset 
cN.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
       "Data Source=" & path & ";" & _ 
       "Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""") 
RS.ActiveConnection = cN 
RS.Source = "select * from " & fileName 
Set getData = RS 
End Function 

Ich versuche, diese Funktion aufzurufen

Dim a As ADODB.Recordset 
Set a = getData("testFile.csv") 
a.Open() 

An dieser Stelle verwenden, ich einen Compiler-Fehler erhalten sagen ‚=‘ erwartet. Könnte mir jemand in die richtige Richtung zeigen, wie ich meine Funktion aufrufen und die Daten durchlaufen soll?

+3

'a.Open' (ohne die Klammern). –

+0

Siehe http://Stackoverflow.com/a/431546/190829 – JimmyPena

+0

@TimWilliams - Können Sie Ihren Kommentar als Antwort eingeben, damit ich ihn akzeptieren kann? –

Antwort

5

Gelöst es mit einigen Verbesserungen von meinem eigenen zusammen mit Eingabe von Tim Williams. Hier ist der Code für alle anderen, die benötigen

Public Function getData(fileName As String) As ADODB.Recordset 

    Dim path As String 
    path = "C:\testDir\" 
    Dim cN As ADODB.Connection 
    Dim RS As ADODB.Recordset 
    Set cN = new ADODB.Connection 
    Set RS = new ADODB.Recordset 
    cN.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
        "Data Source=" & path & ";" & _ 
        "Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""") 
    RS.ActiveConnection = cN 
    RS.Source = "select * from " & fileName 
    Set getData = RS 

End Function 

Jetzt helfen, kann die Funktion als

Dim a As ADODB.Recordset 
Set a = getData("testFile.csv") 
a.Open 
MsgBox(a.GetString()) 
a.Close 
+0

Wie viel besser ist es, das Recordset in der Funktion zu analysieren und eine Zeichenfolge oder ein Array zurückzugeben, anstatt das Recordset zu öffnen ** OUTSIDE ** der Funktion, die es erstellt. – JimmyPena

+0

@JimmyPena - Arrays wären auf jeden Fall sauberer als das Zurückgeben eines Datensatzes. Ich habe eine zweite Implementierung meiner Funktion, die den Datensatz in ein Array konvertiert, aber nicht zu der Lösung hinzugefügt, da es nicht Teil der ursprünglichen Frage war. Aber ich mag definitiv die Arrays besser –

+0

Ich stimme zu, es sollte eine Reihe von Hilfsfunktionen hier sein. – JimmyPena

-1

Excel kann CSV-Dateien direkt importieren. Warum also nicht einfach Ihren Benutzern die CSV-Datei geben und sie in Excel öffnen? Dann können sie ihre Skripts wie jede andere Tabelle nach Bedarf ausführen.

Habe ich hier etwas verpasst?

+0

Die Daten stammen aus einer CSV-Datei heute, aber möglicherweise aus einer Datenbank oder Tab-getrennte Textdatei morgen kommen. Ich möchte die Quelle der Daten ausblenden und stattdessen eine Funktion verfügbar machen, die ein Re-Cord-Set zurückgibt. Auf diese Weise kann ich die interne Funktionsweise der Funktion ändern, ohne dass die Benutzer Änderungen an ihrem Code vornehmen müssen. –

0

ich ein Re-Cord lieber genannt werden, weil ich Reihen zählen kann, Elemente umwandeln, weisen neue Header usw. ...

Verwandte Themen