Come creare una pagina web con il VBA
Impariamo ad utilizzare il VBA Visual Basic For Application per creare da codice una pagina web in html a partire da un recordset di Access
L’esportazione di un oggetto di Access in pagine Web statiche è rapida e semplice, se si desidera manipolare i dati mentre si creano le pagine statiche, la procedura di esportazione non è di alcun aiuto.
Una soluzione migliore è creare un modulo contenente codice VBA che manipola i dati.
Immaginiamo, per esempio, che un impiegato della NorthWind voglia usare i dati della tabella Clienti per creare una serie di 26 pagine Web, una per ogni lettera dell’alfabeto.
Ogni pagina dovrà elencare i clienti i cui nomi iniziano con quella lettera e contenere i collegamenti a tutte le altre pagine della serie.
Tutto il lavoro necessario per l’impostazione delle pagine può essere svolto tramite codice VBA.
Il database di esempio NWind2.mdb contiene il modulo HTML_finale, la versione finale del modulo di codice che stiamo per creare.
Maggiore è la complessità di un programma, più sono i modi possibili di scriverlo.
Questo tutorial non ha la pretesa di illustrare i metodi di programmazione migliori e lo spazio disponibile non è sufficiente a illustrare in dettaglio ogni parte del codice.
Si possono comunque trovare ulteriori informazioni riguardo a ciascun comando VBA facendo clic su esso e premendo F1 in modo da accedere alla Guida in linea di Access.
In questo esempio seguiremo il tipico approccio di programmazione che prevede di scrivere un modulo in stadi diversi, collaudando ogni stadio prima di passare al successivo.
Nel primo stadio scriveremo il codice per aprire il database ed esaminare ogni record della tabella Clienti. Nel secondo stadio troveremo un modo per rilevare la modifica della prima lettera del cognome di ogni persona. Nel terzo stadio apriremo un nuovo file di testo per ogni lettera e vi scriveremo codice HTML. Nel quarto e ultimo stadio provvederemo ad alcune attività di manutenzione generale e a chiudere tutti i file. Procediamo ora come segue:
1. Apriamo il database NWind2.mdb.
2. Sulla barra Oggetti facciamo clic su Moduli.
3. Facciamo clic sul pulsante Nuovo sulla barra degli strumenti della finestra del database. Si apre l’editor Visual Basic con un nuovo modulo evidenziato nella finestra Progetto.
4. Facciamo clic sul pulsante Salva sulla barra degli strumenti dell’editor Visual Basic, denominiamo il modulo HTML e facciamo clic su OK.
5. Nel menu Inserisci facciamo clic su Routine per visualizzare questa finestra di dialogo (figura 1).
6. Nella casella Nome digitiamo creaHTML e facciamo clic su OK per accettare le impostazioni di default. Una nuova subroutine viene inserita nella finestra del codice.
7. Se Option Explicit non figura nella sezione dichiarazioni nella parte superiore della finestra del codice, posiziona il punto d’inserimento alla fine di Option Compare Database, premiamo lnvio, digitiamo OptionExplicit, quindi premiamo nuovamente Invio.
Ora saremo obbligati a dichiarare qualsiasi variabile prima di eseguire il programma. In caso contrario, il programma non funzionerà e dovremo fermarci per dichiarare le variabili.
Perchè la dichiarazione Option Explicit venga aggiunta automaticamente a ogni nuovo modulo, facciamo clic su Opzioni nel menù Strumenti; nella scheda Editor della finestra di dialogo Opzioni facciamo clic su Richiedi dichiarazione di variabili.
E' consigliabile selezionare tutte le opzioni di questa scheda. Premiamo F1 mentre la scheda è visualizzata per ottenere informazioni riguardo alle opzioni.
8. Facciamo clic sulla riga vuota sotto Public Sub, premiamo il tasto Tab e poi digitiamo le righe di codice che seguono, premendo Invio alla fine di ogni riga:
Dim con As Object
Dim rs As Object
Dim stSql As String
Dim firstRec As Boolean
Dim activeDir As String
Dim curWord As String
Dim curLtr As String
Dim oldLtr As String
Dim skipLtr As String
Dim qt As String
Dim i As Integer
9. Abbiamo appena usato l’istruzione Dim (dimension) per dichiarare tutte le variabili che useremo in questaroutine. Normalmente questa operazione si effettua mano a mano che si rende necessario l’uso di una variabile.
Premiamo Invio alcune volte per lasciare qualche riga vuota, quindi, digitiamo le righe seguenti premendo Invio alla fine di ogni riga:
qt = Chr(34)
Set con = Application.CurrentProject.Connection
stSql = "SELECT * FROM [Clienti] ORDER BY Cognome"
Set rs = CreateObject("ADODB.Recordset")
rs.Open stSql, con, 1 ' 1 = adOpenKeyset
La prima riga imposta il valore della variabile qt in modo che rappresenti un segno di virgoletta singola.
Questo trucco viene utilizzato perché, altrimenti, una virgoletta semplicemente digitata nel codice verrebbe interpretata come parte del codice stesso.
Il resto delle righe effettuano una connes sione al database corrente ed eseguono una query che seleziona tutti i record della tabella Clienti, dopo averla riordinata in base al cognome.
Quando si preme Invio dopo aver digitato una riga di codice, la riga viene analizzata, la sua sintassi viene controllata e tutti i nomi di variabili e le parole chiave vengono impostate secondo lo schema di maiuscole e minuscole appropriato.
Adottando la consuetudine di dichiarare le variabili unendo maiuscole e minuscole e di digitare tutto il codice in minuscolo, potremo distinguere i vari elementi più facilmente.
10. Aggiungiamo qualche altra riga vuota e poi digitiamo le righe che seguono (premiamo il tasto Tab per rientrare la seconda riga ed il tasto Backspace per rimuovere il rientro prima di digitare l’ultima riga).
Do Until rs.EOF
curWord = rs!Cognome
Debug.Print curWord
rs.MoveNext
Loop
Questo segmento (definito istruzione Do...Loop) apre il primo record della tabellaClienti, imposta la variabile curWord al valore del campo Cognome, visualizza il valore dicurWord e poi passa al record successivo. Questa serie di operazioni viene ripetuta fino a quando non viene visualizzato l’ultimo record.
11. Aggiungiamo qualche altra riga vuota e digitiamo le righe che seguono:
rs.Close
Set rs = Nothing
Set con = Nothing
Queste righe chiudono il database e rilasciano le variabili oggetto interrompendo le loro associazioni con gli oggetti effettivi che, a loro volta, liberano memoria e risorse di sistema.
La finestra del codice dovrebbe presentarsi come nella figura (figura 2).
Ricordate di salvare il lavoro di tanto in tanto facendo clic sul pulsante Salva sulla barra degli strumenti.
12. Nel menu Visualizza facciamo clic su Finestra Immediata. La finestra Immediata viene visualizzata sotto quella del codice. E' possibile usare la finestra Immediata per testare una riga di codice o modificare un valore di una variabile, ma in questo caso la useremo come finestra di output, per visualizzare i risultati del comando Debug.Print.
13. Facciamo clic in un punto qualsiasi all’interno della routine Sub e poi clic sul pulsante Esegui Sub/UserForm sulla barra degli strumenti. La routine viene eseguita e i cognomi di tutti i clienti della tabella Clienti vengono visualizzati nella finestra Immediata.
14. Facciamo clic nella finestra Immediata, premiamo Ctrl+A per selezionare tutto il suo contenuto e poi il tasto Canc per cancellare la selezione.
15. Facciamo clic sul codice per attivare il focus sulla routine e premiamo F8 per eseguire il codice passo per passo.
La prima riga della routine Sub viene evidenziata in giallo, per indicare che sarà la successiva riga di codice che verrà elaborata.
16. Premiamo nuovamente F8. L’evidenziazione si sposta alla riga qt = Chr(34).
17. Continuamo a premere F8 e a osservare l’evidenziazione, fino a quando non ha superatoLoop ed è ritornata a Do Until rs.EOF.
Questo ciclo è il nucleo del programma. Verrà eseguito una volta per ogni record della tabella. Al primo passaggio il ciclo imposta curWord al valore del cognome del primo record della tabella, visualizza quel valore nella finestra Immediata e poi passa al record successivo.
18. Premiamo F8 per spostare l’evidenziazione su curWord = rs!Cognome.
19. Mantieniamo il puntatore posizionato su curWord per qualche secondo e poi facciamo lo stesso con rs!Cognome.
Quando posizioniamo il puntatore su ogni espressione, il suo valore attuale viene visualizzato in una casella di descrizione comando.
La variabile curWord mostra il nome del primo record della tabella e rs!Cognome visualizza il valore del record corrente.
20. Premiamo nuovamente F8 e controlliamo i valori visualizzati su entrambi i lati dell’espressione della riga soprastante. Ora sono uguali.
21. Premiamo F5 per concludere l’esecuzione della routine. La routine ora apre il database e preleva il cognome da ogni record nella tabella Clienti.
22. Sostituiamo ora la riga Debug.Print nel codice con il codice riportato di seguito:
curLtr = UCase(Left(curWord, 1))
If curLtr <> oldLtr Then 'abbiamo una nuova lettera
Debug.Print curLtr
oldLtr = curLtr
End If
La prima riga preleva il primo carattere a sinistra di curWord, lo trasforma in maiuscolo, se non lo è già, e lo imposta come valore di curLtr.
L’istruzione If confronta il valore di curLtr con oldLtr (a questo punto oldLtr sarà vuota perché il suo valore non è stato definito).
Se il valore è diverso, esso viene visualizzato e poi oldLtr viene impostata al valore attuale di curLtr; altrimenti, il flusso del codice passa il controllo alla riga successiva all’istruzione If, che si sposta sul record successivo.
23. Premiamo F5 per eseguire il programma
Questa volta le lettere dell’alfabeto vengono visualizzate nella finestra Immediata, sotto l’elenco dei nomi dei clienti. Se scorri il contenuto della finestra, noterai che mancano varie lettere, non perché esiste un problema nel codice, ma perché non vi sono clienti che hanno cognomi che iniziano con quelle lettere.
24. Nelle righe vuote che abbiamo lasciato sopra l’ultima istruzione Dim, digitiamo queste righe di codice:
activeDir = Application.CurrentProject.path
If Dir(activeDir & "\pagine_html", vbDirectory) = "" Then
MkDir activeDir & "\pagine_html"
End If
La prima riga imposta il valore di activeDir al percorso della cartella (o directory) contenente il database.
L’istruzione If verifica che quella directory abbia una sottodirectory denominata pagine_HTML in cui memorizzare le pagine HTML che stiamo creando.
In caso contrario, il comando MkDir crea la sottodirectory.
25. Inseriamo una riga sopra l’istruzione Do...Loop e poi digitiamo:
firstRec = True
Si deve differenziare tra il primo record di una lettera e tutti i record rimanenti. Spesso si fa riferimento alle variabili simili a firstRec come flag che possono essere impostati a True o a False.
26. Cancelliamo la riga Debug.Print sopra la riga che confronta oldLtr con curLtr.
27. Facciamo clic alla fine della riga che confronta oldLtr con curLtr, premiamo Invio per inserire una nuova riga, quindi Tab per rientrarla e digitiamo il codice che segue:
If Not firstRec Then 'termina la pagina precedente
Print #1, "</body>"
Print #1, "</html>"
Close #1
Else
firstRec = False
End If
Open activeDir & "\pagine_html\" & "clien" & curLtr & ".htm" _
For Output As #1
Print #1, "<html>"
Print #1, "<head><title>Elenco alfabetico dei clienti " _
& "– " & curLtr & "</title></head>"
Print #1, "<body bgcolor=yellow link=red>"
Print #1, "<h1>Elenco alfabetico dei clienti –" _
& " " & curLtr & "</h1>"
Print #1, "<br>"
Print #1, "<br>"
Importante!
Nel codice sopra, nonchè in alcuni dei punti che seguono, le righe sono state mandate a capo per adeguarle alla larghezza della pagina.
Per mandare a capo una riga di codice nell'editor Visual basic, si deve usare uno spazio seguito da un trattino basso (_), come nel codice sopra.
Questo codice verifica se il record elaborato è il primo: se non lo è, scrive i tag per chiudere il file HTML precedente.
Quindi apre un nuovo file HTML e scrive itag in esso.
28. Inseriamo una riga sopra rs.MoveNext e digitiamo la riga di codice seguente:
Print #1, "<p>" & rs!Nome & " " & rs!Cognome
In questo modo viene creato un paragrafo nel file HTML che contiene il nome e cognome del cliente, separati da uno spazio.
29. Inseriamo una riga dopo Loop e poi aggiungiamo le righe seguenti:
Print #1, "<body>"
Print #1, "</html>"
Close #1
Questo codice aggiunge i tag HTML di chiusura all’ultimo file e lo chiude.
30. Facciamo clic sul pulsanteSalva e poi sul pulsante Esegui Sub/UserForm per eseguire il programma, che creerà una serie di file HTML in una nuova cartella chiamata pagine_HTML all’interno della cartella di lavoro per questo esercizio. L’operazione dovrebbe richiedere solo qualche secondo.
Risoluzione dei problemi
Un errore di digitazione o una istruzione in una posizione errata può far entrare un programma in un ciclo infinito.
Se il tempo di esecuzione del programma vi sembra eccessivo, premete Ctrl+Interr (o Ctrl+Pause/Break) per passare alla modalità di debug che consente di eseguire il programma passo per passo al fine di individuare l'origine del problema.
31. In Esplora risorse accediamo alla cartella pagine_HTML all’interno della cartella nella quale si trova il database NWind2.mdb.
La cartella contiene una serie di file HTML, uno per ogni lettera dell’alfabeto, o quasi.
32. Fai doppio clic su clienA per aprirlo nel browser.
33. Visualizza il codice HTML relativo alla pagina (se utilizzi Internet Explorer, fai clic destro nel corpo della pagina e fai clic su HTML).
Viene visualizzato il codice sorgente della pagina. Il codice VBA ha scritto nel file i tag HTML e le informazioni del database.
34. Chiudamo la finestra del codice sorgente e il browser, quindi torniamonell’editor Visual Basic.
35. Se è necessario, inseriamo una riga sopra oldLtr = curLtr, quindi digitiamo il codice che segue:
For i = 65 To 77
Print #1, "<font color=" & qt & "purple" & qt & "size=+1><a href=" _
& qt & "clien" & Chr(i) & ".htm" & qt & ">" & Chr(i) & _
"</a> | </font>"
Next i
Print #1, "<br>"
For i = 78 To 90
Print #1, "<font color=" & qt & "purple" & qt & "size=+1><a href=" _
& qt & "clien" & Chr(i) & ".htm" & qt & ">" & Chr(i) & _
"</a> | </font>"
Next i
Print #1, "<p>"
Questo codice visualizza le lettere dalla A alla M in una riga all’inizio della pagina e le lettere dalla N alla Z sulla riga successiva. Ogni lettera è un collegamento alla pagina HTML corrispondente a essa.
36. Salviamo le modifiche ed esegui nuovamente il programma. Quindi ritorniamo alla cartella pagine_HTML e apriamo clienB.
La pagina Web si presenta così:
37. Facciamo clic su F per passare alla pagina che contiene i cognomi che iniziano con la lettera F.
Viene visualizzata la pagina appropriata.
38. Facciamo clic su X.
Un messaggio d’errore segnala che non esiste alcun cliente il cui cognome inizia con X, quindi il codice VBA non ha creato una pagina per quella lettera. La stessa situazione si verifica anche per molte altre lettere.
39. Chiudiamo il browser, chiudiamo l’editor Visual Basic e il database NWind2.
Esempi di accesso ai dati con VBA Microsoft Access
Tutorials su Microsoft Access
Dr.Maurizio Cucchiara
autore del corso:
"Corso Base di Microsoft Access"
disponibile on line su questo sito
MC2 E-Learning S.a r.l.
Formazione per il Web
http://www.mc2.it/html/access.html
Cerca sul web con Google:
Ricerca personalizzata
