2012-07-24 18 views
5

Ho un programma esterno che esporta i dati in file CSV. I miei utenti vorrebbero avere accesso a questi dati tramite una funzione VBA in Excel. Per fare questo, ho pensato di avvolgere il file CSV letto in una funzione che restituisce un ADODB.Recordset. Il mio codice èrestituisce il file csv come recordset

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 

Sto cercando di chiamare questa funzione utilizzando

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

A questo punto, ottengo un errore di compilazione dire '=' previsto. Qualcuno potrebbe indicarmi la giusta direzione su come dovrei chiamare la mia funzione e scorrere i dati?

+3

'a.Open' (senza parentesi). –

+0

Vedi http://stackoverflow.com/a/431546/190829 – JimmyPena

+0

@TimWilliams - Puoi ridigitare il tuo commento come un aswer in modo che io possa accettarlo? –

risposta

5

Risolto con alcuni ritocchi del mio insieme con l'input di Tim Williams. Ecco il codice per chiunque altro che potrebbe aver bisogno di aiuto

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 

Ora, la funzione può essere chiamata come

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

Molto meglio analizzare il recordset all'interno della funzione e restituire una stringa o una matrice invece di dover aprire il recordset ** ESTERNO ** della funzione che lo crea. – JimmyPena

+0

@JimmyPena - Gli array sarebbero sicuramente più puliti rispetto alla restituzione di un set di record. Ho una seconda implementazione della mia funzione che converte il set di record in un array ma non l'ha aggiunto alla soluzione poiché non faceva parte della domanda originale. Ma mi piacciono decisamente gli array –

+0

Sono d'accordo, qui dovrebbe esserci una serie di funzioni di supporto. – JimmyPena

-1

Excel può importare direttamente file CSV. Quindi, perché non dare agli utenti il ​​file CSV e lasciarli aprire in Excel. Quindi possono eseguire i loro script come necessario, proprio come qualsiasi altro foglio di calcolo?

Ho perso qualcosa qui?

+0

I dati provengono da un file csv oggi, ma potrebbero provenire da un database o da un file di testo delimitato da tabulazione domani. Voglio nascondere la fonte dei dati ed esporre invece una funzione che restituisce un recordset. In questo modo, posso modificare il funzionamento interno della funzione senza che gli utenti debbano apportare alcuna modifica nel loro codice –

0

preferisco un set di record perché posso contare le righe, trasformare oggetti, assegnare nuove intestazioni ecc ...