Oltre alle funzioni presenti nel menù dati per il collegamento ad una tabella (o query) ad un database è possibile ottenere le stessa cosa con poche righe di codice.
Nel caso di collegamento otteniamo tutte le righe della tabella (possiamo usare una query solo statica) da elaborare poi in Excel: non ha molti vantaggi rispetto all'avere il "database" direttamente su un foglio di appoggio su Excel.
Utilizzando una macro sarà possibile leggere dal database solo le righe che ci interessano (ad esempio le righe di un ordine) e fare in modo che avvenga al cambio del contenuto di una cella (ad es. quella che contiene il numero di ordine.
Nell'esempio sotto è utilizzata la funzione CopyFromRecordset per importare il risultato di una query:
Sub LeggiDaDatabase_V1()
Dim Cn
As ADODB.
Connection
Dim T1
As ADODB.
Recordset
'--- Percorso del DB in Access nella stesa cartella in cui è contenuto il file in Excel ---
FileDB =
Application.
ThisWorkbook.Path & "\DbDemo.accdb"
'--- Link ADO al DB Access---
Set Cn =
New ADODB.
Connection
Provider = "Microsoft.ACE.OLEDB.12.0"
DataLink = "Provider=" + Provider + ";Data Source=" + FileDB + ";JPersist Security Info=False"
Cn.
Open DataLink
'--- crea la query ---
Set T1 =
New ADODB.
Recordset
StQ = "Select * From Agenti"
T1.
Open StQ, Cn, adOpenKeyset, adLockOptimistic, adCmdText
'--- incolla il risultato dalla cella B3 ---
Range("B3").CopyFromRecordset T1
End Sub
In questo altro esempio invece vengono estratti i nomi dei campi e poi i dati scorrendo le righe e le colonne:
Sub LeggiDaDatabase_V2()
Dim Cn
As ADODB.
Connection
Dim T1
As ADODB.
Recordset
'--- Percorso del DB in Access nella stesa cartella in cui è contenuto il file in Excel ---
FileDB =
Application.
ThisWorkbook.Path & "\DbDemo.accdb"
'--- Link ADO al DB Access---
Set Cn =
New ADODB.
Connection
Provider = "Microsoft.ACE.OLEDB.12.0"
DataLink = "Provider=" + Provider + ";Data Source=" + FileDB + ";Persist Security Info=False"
Cn.
Open DataLink
'--- crea la query ---
Set T1 =
New ADODB.
Recordset
StQ = "Select * From Agenti"
T1.
Open StQ, Cn, adOpenKeyset, adLockOptimistic, adCmdText
If Not (T1.EOF)
Then
'--- nomi dei campi ---
Set CellaBase =
Range("B3")
RigaBase = CellaBase.Row
ColBase = CellaBase.Column
R = RigaBase
For I = 0
To T1.Fields.Count - 1
Cells(R, I + ColBase) = T1.Fields(I).Name
Next I
' --- dati ---
R = RigaBase + 1
While Not (T1.EOF)
For I = 0
To T1.Fields.Count - 1
Cells(R, I + ColBase) = T1.Fields(I)
Next I
R = R + 1
T1.MoveNext
Wend
End If
T1.
Close
Cn.
Close
End Sub
L'esempio è scaricabile da questo link:
Es381.xlsm
Il database di test da questo link:
DbDemo.zip