maurogsc.eu
mauro gamberini


home ==> Excel: articoli ==> ADO - Utilizzare ADO senza riferimenti (Access 2003 e precedenti)

ADO - Utilizzare ADO senza riferimenti (Access 2003 e precedenti)

Situazione.
Vogliamo importare nel Foglio1 della nostra cartella, una tabella(o una query) di una database di Access che(nell’esempio) si trova nella stessa directory del file di Excel. Per farlo vogliamo utilizzare ADO(ActiveX Data Objects) senza dover mettere il riferimento alle librerie Microsoft ActiveX Data Objects n.n Library, dove n.n stanno ad indicare la versione specifica di ADO installata sulla macchina.

Nota.
Il codice dell’esempio, scaricabile a questo link, è commentato e nella cartella in formato .zip sono contenuti un file di Excel ed un database di Access. Il codice ed i files sono forniti *così come sono* e l’autore declina ogni responsabilità su eventuali problemi causati dal codice o dai files se usati impropriamente. Utilizzate gli esempi forniti o files di test per le vostre prove. Codice e file sono stati testati con(e quindi validi per) Excel 2000/Xp(2002)/2003/2007/2010.
A seguito di una domanda sul newsgroup di Excel(m.p.i.o.e.) è disponibile un file qui, con una variante per eseguire più query sullo stesso db e mettere i risultati su colonne diverse dello stesso foglio.

Subito il codice.
ALT+F11 e siamo nell’editor del Visual Basic. Cominciamo con inserire un modulo standard nel nostro progetto(Inserisci-->Modulo).
Questo il codice da inserire nel nostro modulo di codice:

Public Sub mRecuperaDati()

On Error GoTo RigaErrore

    Dim cn As Object
    Dim rs As Object
    Dim sh As Worksheet
    
    With Application
        .ScreenUpdating = False
        .Calculation = xlManual
        .StatusBar = "Sto eseguendo: Sub m()"
    End With

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    Set sh = Worksheets("Foglio1")
    
    With sh

	.Rows("2:" & Rows.Count).Delete
        cn.CursorLocation = 1
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " _
            & "Data Source=" & ThisWorkbook.Path & _
            "\dbExcelAccess.mdb"
        
        rs.CursorLocation = 1
        rs.Open "SELECT * FROM tblAnagrafica", cn, 1, 3, 1
 
        .Range("A2").CopyFromRecordset rs
    
    End With
    
RigaChiusura:
    If rs.State = 1 Then
        rs.Close
    End If
    If cn.State = 1 Then
        cn.Close
    End If

    Set sh = Nothing
    Set rs = Nothing
    Set cn = Nothing
    
    With Application
        .ScreenUpdating = True
        .Calculation = xlAutomatic
        .StatusBar = ""
    End With
    Exit Sub

RigaErrore:
    MsgBox Err.Number & vbNewLine & Err.Description
    Resume RigaChiusura

End Sub

C’è veramente poco da aggiungere se non di modificare nome del db e query SQL in base alle proprie esegenze.

Parametrizziamo la routine.
Veramente semplice è parametrizzare la routine passando più query SQL da eseguire sul Foglio1:

Public Sub mRecuperaDati(ByVal sQuery As String)

On Error GoTo RigaErrore

    Dim cn As Object
    Dim rs As Object
    Dim sh As Worksheet
    
    With Application
        .ScreenUpdating = False
        .Calculation = xlManual
        .StatusBar = "Sto eseguendo: Sub m()"
    End With

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    Set sh = Worksheets("Foglio1")
    
    With sh
        
        .Rows("1:" & Rows.Count).Delete
        cn.CursorLocation = 1
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " _
            & "Data Source=" & ThisWorkbook.Path & _
            "\dbExcelAccess.mdb"
        
        rs.CursorLocation = 1
        rs.Open sQuery, cn, 1, 3, 1

        .Range("A2").CopyFromRecordset rs
    
    End With
    
RigaChiusura:
    If rs.State = 1 Then
        rs.Close
    End If
    If cn.State = 1 Then
        cn.Close
    End If

    Set sh = Nothing
    Set rs = Nothing
    Set cn = Nothing
    
    With Application
        .ScreenUpdating = True
        .Calculation = xlAutomatic
        .StatusBar = ""
    End With
    Exit Sub

RigaErrore:
    MsgBox Err.Number & vbNewLine & Err.Description
    Resume RigaChiusura

End Sub
E queste due routine per eseguire comandi SQL diversi:
Public Sub mQuery1()
    Dim s As String
    s = "SELECT * FROM tblAnagrafica"
    Call mRecuperaDati(s)
End Sub

Public Sub mQuery2()
    Dim s As String
    s = "SELECT Nome, Cognome, Comune " & _
        "FROM tblAnagrafica " & _
        "WHERE Provincia = 'Fe'"
    Call mRecuperaDati(s)
End Sub

Costanti.
Quando mettiamo i riferimenti alle librerie ADO, possiamo utilizzare le costanti ADO nella forma, ad esempio:

rs.Open "SELECT * FROM tblAnagrafica", _
        cn, adOpenKeyset, _
        adLockOptimistic, _
        adCmdText

Senza riferimenti, dobbiamo invece utilizzare il valore numerico corrispondente:

rs.Open "SELECT * FROM tblAnagrafica", cn, 1, 3, 1

Per maggiori informazioni sulle costanti di ADO, date uno sguardo a questo sito. Nessuno vi vieta di mettere i riferimenti alle librerie ADO, utilizzare così l’intellisense per navigare fra i vari oggetti, le loro proprietà, i loro metodi, ecc. e poi riscrivere il codice per l’utilizzo senza riferimenti.

Per ulteriori informazioni su Microsoft Excel ed il suo Visual Basic, utilizzate questo forum:
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads


Ultimo aggiornamento di questa pagina: 12/11/2009 - mauro gamberini