maurogsc.eu
|
![]() |
home ==> Excel: articoli ==> ADO - Utilizzare ADO senza riferimenti
ADO - Utilizzare ADO senza riferimenti
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