UN'ALTRA
PROCEDURA DI IMPORTAZIONE DATI
Le procedure che vedremo in questa pagina sono
leggermente diverse rispetto a quelle viste nell'esempio precedente, ma come
quelle, anche queste si basano su una Query per il reperimento e l'importazione
dei dati.
L'importanza di questo tipo di procedure è
rappresentato dal fatto che qui, usando il metodo CreateQueryDef
unito al
Workspaces, rendiamo "permanenti" le query
create. Questo ci consente di renderle disponibili per altri processi compreso
altre query. Non so quanti "pellegrini" usino una cartella di Excel sfruttandone
molti fogli, ma se per esempio si creasse una prima importazione di dati sul
foglio1, un'altra diversa interrogazione importata sul foglio2, e si salvassero
le query nel database rendendole permanenti, sarebbe possibile importare sul
foglio3 tramite una nuova query i dati contenuti in una o nelle due query
salvate, che essendo già formate da dati "filtrati", fornirebbero una ulteriore
"filtrazione" più mirata e veloce. Le Query "permanenti" non restano immutabili,
ma possono essere di nuovo ricreate variando uno o più dei criteri usati
nell'istruzione vera e propria, estraendo quindi nuovi dati che potranno poi
essere usati a valle tramite altre query che mirino a lei. Chi non conosce l'uso
delle query, non può rendersi conto della loro importanza e della molteplicità
di risultati ottenibili nella gestione dei database e quindi nei lavori in Excel
che prendono dati da questi database.
Le istruzioni che seguono sono simili all'esempio
precedente, quindi in questo caso evidenzierò solo le differenze in rosso,
aggiungendo solo i commenti necessari, oltre ad avvisare che facciamo uso di un
Controllo Errori:
Sub Importadue()
On Error Resume Next
'come si nota sotto, usiamo
altri nomi o sigle, ma dichiariamo il "tipo" di ogni variabile; 'cambia
comunque il modo di accedere sia al database (db) sia per la presenza del
tipo 'QueryDef (Definizione di una Query) non usata nel precedente
esempio. Questa è l'impostazione che ci consente di 'creare una query
"residente"
Dim db As Database, myq As QueryDef, myset As
Recordset, CellaAtt As Range
'sotto: settiamo la variabile
db impostando il percorso dove risiede il database usando 'l'oggetto
Workspaces(0) (in veramente due parole, diciamo che con Workspaces
manipoliamo il database, permettendo l'inserimento di una nuova query) e
col metodo 'OpenDatabase
Set db = Workspaces(0).OpenDatabase("C:\Progetti\Contabilita\contab.mdb")
Set CellaAtt = ActiveCell
CellaAtt = "ciccia"
CellaAtt.Offset(0, 1) = "verdura"
CellaAtt.Offset(0, 2) = "crema"
'sotto: quando creiamo una
nuova query residente nel database di origine, e lo facciamo 'una
unica volta, questa riga non sarebbe necessaria. ma visto che potremo
rilanciare di 'nuovo la routine perchè magari, come anticipato, vogliamo
cambiare un parametro (un 'campo), poichè nella creazione della query
DOBBIAMO assegnare un nome (pippo), se 'nel ripetere la macro la procedura
riscontra la presenza nel database di una query già 'chiamata pippo, si
genera un errore di run-time e si interrompe il tutto. Ecco perchè è
'necessario inserire a inizio e fine routine un controllo errori, e
sfruttando l'errore che si 'genererà inevitabilmente, con questa riga
diciamo: se il numero dell'errore di runtime è 'uguale al 3012, allora
cancelliamo (Delete) la query esistente pippo in modo che 'l'istruzione
della riga sotto possa ricrearne una nuova con lo stesso nome.
If Err.Number = 3012 Then db.QueryDefs.Delete
("pippo")
'e questa sotto è l'istruzione
che setta la variabile myq richiamando il database (db) e 'facendogli
creare una query residente, con CreateQueryDef . E NECESSARIO
definire 'un nome per identificare la query e il nome va posto tra doppi
apici, seguito dalla virgola 'e tra due doppi apici andrà scritta
l'istruzione della query: questa istruzione dice: seleziona '(tutti) i
record dei campi ciccia, verdura, crema dalla tabella prova.
Set myq = db.CreateQueryDef("pippo", "SELECT ciccia,
verdura, crema from prova;")
'assegnazione alla variabile myset della query "pippo".
seguono commenti come esempio 'precedente
Set myset = db.OpenRecordset("pippo")
While Not myset.EOF
i = i + 1
CellaAtt.Offset(i) = myset.Fields(0)
CellaAtt.Offset(i, 1) = myset.Fields(1)
CellaAtt.Offset(i, 2) = myset.Fields(2)
myset.movenext
Wend
myset.Close: db.Close
Resume
End Sub |
Abbiamo visto due esempi che consentiranno a chi
vorrà cimentarsi in queste procedure di potersi destreggiare senza grossi
problemi, almeno seguendo i suggerimenti e i commenti inseriti, nel realizzare
dei colleganti ai propri database. Ovviamente gli argomenti trattati sono un pò
come le ciliege : una tira l'altra, sarà quindi opportuno sviluppare a casa
propria le conoscenze necessarie per migliorare la padronanza sull'argomento.
Buon lavoro.
prelevato sul sito http://ennius.interfree.it
|