File PDF .it

Condividi facilmente i tuoi documenti PDF con i tuoi contatti, il Web e i Social network.

Inviare un file File manager Cassetta degli attrezzi Ricerca PDF Assistenza Contattaci



Cap 1 .pdf



Nome del file originale: Cap 1.pdf
Titolo: Cap 1.p65
Autore: attilios

Questo documento in formato PDF 1.2 è stato generato da PageMaker 6.5 / Acrobat Distiller 3.02, ed è stato inviato su file-pdf.it il 05/02/2015 alle 14:43, dall'indirizzo IP 151.42.x.x. La pagina di download del file è stata vista 1843 volte.
Dimensione del file: 650 KB (63 pagine).
Privacy: file pubblico




Scarica il file PDF









Anteprima del documento


Capitolo1

Introduzione a
Visual Basic,
Applications Edition
Una decina di anni fa, Bill Gates propose un linguaggio macro universale per le applicazioni desktop. Microsoft Visual Basic, Applications Edition (VBA) è la realizzazione di un
sogno e qualcosa di più. VBA di Microsoft Access 2000 è comune a tutti i componenti
Microsoft Office e a molti pacchetti di altri produttori. La sua sintassi è coerente con il
linguaggio di programmazione Visual Basic standalone. La polivalenza di VBA consente
agli sviluppatori di utilizzare un solo linguaggio di programmazione per più contesti, semplicemente apprendendo un nuovo modello oggetto. VBA funge da collante per le applicazioni Access, connette tutti gli elementi e dà forma all’applicazione.
Access 2000 include una nuova interfaccia: l’Editor di Visual Basic (VBE), perfettamente integrato con gli altri componenti Office. Tuttavia, è probabile che ci si trovi a inserire il codice VBA nelle tradizionali maschere di Access piuttosto che in maschere utente e
l’operazione risulterà del tutto naturale.
Questo capitolo descrive l’utilizzo di VBA in Access 2000 e riprende le nozioni di
base di VBA in relazione allo sviluppo di applicazioni Access 2000. Inoltre, saranno illustrate le maggiori innovazioni VBA e le tecniche di inserimento del codice senza l’ausilio
delle maschere. Questo argomento viene frequentemente affrontato nell’ambito dello sviluppo di Access; tuttavia sono state introdotte alcune novità sulle modalità di esecuzione
delle stesse operazioni con VBE.

1

Programmare Microsoft Access 2000

Il capitolo descrive sette aspetti relativi a VBA in Access, elencati di seguito, e si chiude
con una breve discussione sulle macro.


Insiemi, oggetti, proprietà, metodi ed eventi



Procedure e moduli



Interfaccia VBE



Jet, tipi di dati e dichiarazioni



Logica condizionale e creazioni di loop



Funzioni incorporate



Debug e trap degli errori

INSIEMI, OGGETTI,
PROPRIETÀ, METODI ED EVENTI
Access 2000 supporta VBA, che semplifica lo sviluppo a oggetti. Le sezioni che seguono
introducono lo sviluppo a oggetti nel contesto VBA e Access 2000. Le informazioni sono
destinate a utenti avanzati che passano allo sviluppo di applicazioni in maniera
programmatica e agli sviluppatori di livello medio che desiderano riprendere la programmazione a oggetti con VBA.

Insiemi e oggetti
Access 2000 è un ambiente di sviluppo a oggetti. La finestra Database facilita l’accesso degli
utenti a tabelle, query, maschere, report, moduli e macro. VBA rende tutti questi elementi
disponibili con un ampio array di creazioni programmatiche, come i set di record e gli oggetti
TableDef. Per utilizzare al meglio VBA in Access, è necessario capire a fondo cosa si intende per oggetti e analizzare i numerosi concetti correlati.
Un oggetto è una cosa. Le cose possono essere di natura diversa: ad esempio, automobili, telefoni e video. Tutti gli oggetti presentano delle proprietà. Le automobili, ad esempio, vengono definite dalle proprietà del colore, delle portiere e del motore. Le proprietà
possono definire istanze di oggetti generici. Una funzionalità orientata agli oggetti consente
di specificare istanze univoche di oggetti in base alle loro proprietà. Ad esempio, un’automobile rossa e una nera definiscono due istanze univoche dell’oggetto automobile.
Le proprietà degli oggetti variano a seconda della classe di oggetti a cui ci si riferisce. Un’automobile presenta proprietà diverse da quelle di un telefono. Entrambi gli oggetti
presentano una proprietà colore ma un telefono può disporre anche di una proprietà altoparlante. Le automobili, d’altro canto, dispongono di motori di dimensioni diverse. Alcuni
oggetti contengono altri oggetti. Gli oggetti contenuti presentano, a loro volta, delle proprietà. Ad esempio i motori sono di dimensioni e configurazioni diverse, mentre gli alto-

2

Capitolo 1 Introduzione a Visual Basic, Applications Edition

parlanti sono dotati di un controllo del volume e di livelli di fedeltà. Le proprietà possono
definire istanze univoche di classi di oggetti contenuti. Un telefono a viva voce presenta
proprietà diverse da quelle di un telefono standard.
Oltre alle proprietà, gli oggetti presentano metodi diversi. I metodi di un oggetto sono
le funzioni che l’oggetto può eseguire. Un telefono crea connessioni. Un’automobile si
muove. Molti oggetti presentano metodi diversi. I telefoni, ad esempio, consentono di effettuare chiamate locali e interurbane.
Gli sviluppatori di Access non devono gestire oggetti fisici, bensì creazioni di programmazione, come maschere, tabelle e query, che possono rappresentare oggetti e funzionalità. La finestra Database di Access 2000 mostra alcune classi di oggetti del database
sulla barra degli strumenti di tipo Microsoft Outlook (vedere la figura 1-1). Selezionando
il pulsante Maschere dalla barra degli strumenti, si apre una finestra di visualizzazione di
oggetti maschera e vengono visualizzate due opzioni per la creazione di nuove maschere.
Gli oggetti maschera possono contenere altri oggetti, denominati controlli. Gli oggetti
contenuti definiscono l’oggetto principale, proprio come i controlli di una maschera ne
definiscono l’aspetto e la funzionalità.

Figura 1-1. Finestra Database con una selezione di oggetti maschera e due opzioni per la creazione
dinuovemaschere.

La figura 1-1 mostra diversi oggetti maschera. Questi oggetti costituiscono un insieme. Le applicazioni Access, di solito, dispongono di insiemi di maschere, tabelle, query e altri
oggetti. La finestra Database ordina automaticamente gli oggetti selezionati in classi. Facendo clic sulla parte sinistra della barra degli strumenti, vengono rivelati gli oggetti di ogni
insieme.
Gli insiemi sono come gli oggetti. Tutte gli insiemi di Access presentano una proprietà Count, che specifica il numero di istanze dell’insieme. Gli insiemi possono disporre

3

Programmare Microsoft Access 2000

anche di una proprietà Item. È possibile utilizzare la proprietà Item in sola lettura per restituire una sola maschera dall’insieme AllForms. Dato che i membri di un insieme sono oggetti singoli, essi non dispongono di una proprietà Count. Gli oggetti di un insieme servono
a diversi scopi. Un’automobile decappottabile può essere utilizzata in situazioni diverse
rispetto a una familiare ma entrambe possono appartenere allo stesso insieme di auto di una
famiglia.

Proprietà e metodi
Le proprietà e i metodi caratterizzano l’aspetto e la funzionalità degli oggetti. La sintassi
per riferirsi a essi è object.property o object.method. Il termine object può indicare un oggetto singolo o un insieme di oggetti. Ad esempio, txtInput1.BackColor specifica il colore dello sfondo
di una casella di testo di una maschera e AllForms.Item(0) si riferisce alla prima maschera
dell’insieme di maschere. Se il nome di questa maschera è frmSample1, è possibile fare riferimento alla maschera come AllForms.Item(“frmSample1”).
È possibile visualizzare le proprietà di un oggetto di database selezionandolo nella
finestra Struttura e premendo il pulsante Proprietà sulla barra degli strumenti. La figura 12 mostra una maschera nella finestra Struttura e il foglio delle proprietà della maschera. Il
foglio delle proprietà mostra una voce personalizzata, My Default Caption, nella casella delle proprietà Didascalia. Viene selezionata la proprietà PulsanteChiusura. È possibile scegliere la casella Pulsante chiusura e selezionare No. La nuova proprietà PulsanteChiusura disattiva
il pulsante Chiudi quando viene visualizzata una maschera nella finestra Maschera. Il foglio delle proprietà presenta più pagine. La figura 1-2 mostra la scheda Formato selezionata. Queste pagine organizzano le proprietà in gruppi per un recupero veloce.

Figura 1-2. Semplice maschera nella visualizzazione Struttura con il relativo foglio delle proprietà.

NOTA: in Access 2000, il foglio delle proprietà è disponibile sia nella
visualizzazione Struttura che nella visualizzazione Maschera. Questo significa che è possibile modificare rapidamente e ridefinire l’aspetto di
una maschera quando si opera con la struttura nella visualizzazione Maschera.
L’oggetto DoCmd è un’origine piuttosto ricca di metodi per sviluppatori Access di
ogni livello ma sono soprattutto i principianti a trovarlo particolarmente utile come intro-

4

Capitolo 1 Introduzione a Visual Basic, Applications Edition

duzione ai metodi. L’oggetto DoCmd dispone di metodi diversi, inclusi Close, OpenForm,
GoToControl, FindRecord e RunCommand. Molti metodi DoCmd richiedono argomenti per
specificare le modalità di esecuzione. Altri metodi dispongono di argomenti obbligatori e
facoltativi. Se non vengono specificati i valori per un argomento facoltativo, il metodo
utilizza impostazioni predefinite. RunCommand è interessante soprattutto per gli utenti avanzati che passano alla programmazione; è possibile utilizzarlo per eseguire i comandi disponibili nei menu e sulle barre degli strumenti di Access.
Le maschere di Access si chiudono mediante il metodo Close dell’oggetto DoCmd.
Questo metodo presenta due argomenti obbligatori e uno facoltativo. Il primo argomento
obbligatorio specifica il tipo di oggetto da chiudere. Quando si chiude una maschera, utilizzare acForm. (acForm è una costante incorporata di Access il cui valore indica al metodo
Close che si desidera chiudere una maschera. Per ulteriori informazioni sulle costanti incorporate in Access, consultare la sezione intitolata “Visualizzatore oggetti” a pagina 23). Il
secondo argomento è il nome della maschera. La voce viene visualizzata nella proprietà
Name del foglio delle proprietà della maschera. Racchiudere il nome tra virgolette. L’argomento opzionale indica ad Access se salvare o meno le modifiche alla maschera.
L’impostazione predefinita consiste nel richiedere se salvare le modifiche o meno. Utilizzare acSaveYes o acSaveNo per chiudere la maschera con o senza il salvataggio delle modifiche. È possibile richiamare il metodo Close relativo a una maschera mediante la seguente
sintassi.
DoCmd.Close acForm, “formname”, acSaveNo

Molti metodi DoCmd si applicano direttamente a oggetti singoli, ad esempio il metodo GoToControl attiva un controllo specifico di una maschera. È possibile ottenere lo stesso
risultato mediante il metodo SetFocus, che seleziona un controllo. Entrambi i metodi sono
efficaci quando l’applicazione deve spostare l’attivazione per inserire nuove informazioni
o correggere informazioni errate.

Eventi
Gli eventi hanno un ruolo importante nella programmazione VBA. È possibile utilizzare
eventi per rendere le applicazioni dinamiche e interattive. Gli oggetti e gli insiemi dispongono di eventi che fungono da punti di avvio per il codice personalizzato di uno
sviluppatore. Quando si opera con le maschere, è possibile utilizzare gli eventi per attività
come la convalida dei dati, l’attivazione o la disattivazione dei controlli, la modifica del
controllo attivo, l’apertura e la chiusura di una maschera.
È necessario comprendere quando viene attivato ogni evento, così come l’ordine di attivazione degli eventi. Quando si apre una maschera, viene avviata una sequenza
di eventi: Open, Load, Resize e Current. L’evento Open si verifica quando viene avviata
l’apertura di una maschera ma prima della visualizzazione di tutti i record. L’evento Load
si verifica dopo l’evento Open. Quando si attiva l’evento Load, la maschera mostra i suoi
record. Un codice che provoca la modifica delle dimensioni e della posizione di una
maschera mediante i metodi DoCmd MoveSize, Minimize, Maximize o Restore attiva l’evento

5

Programmare Microsoft Access 2000

Resize. L’evento Current è l’ultimo evento che si verifica all’apertura di una maschera.
Contrassegna il momento in cui un particolare record viene visualizzato o si rende
disponibile. Inoltre si attiva quando un utente passa a un nuovo record e richiede o
aggiorna una maschera.
È possibile accedere agli eventi relativi alle maschere e ad altri controlli selezionando prima la maschera o il controllo nella visualizzazione Struttura e quindi la scheda Evento
del foglio delle proprietà. Selezionando il pulsante per la generazione dell’evento si apre una
finestra di dialogo che è possibile utilizzare per aprire il modulo del codice in una maschera. Selezionando Code Builder si apre una routine evento in VBE. La routine evento viene
definita Objectname_Eventname, in cui Objectname è il nome dell’oggetto e Eventname quello
dell’evento. Se si seleziona una maschera e si preme il pulsante Build per l’evento Close, ad
esempio, la routine evento verrà definita Form_Close. Se si crea una routine evento per l’evento On Click di un etichetta chiamata lblTitle, VBA viene denominato automaticamente
lblTitle_Click.
Quelle che seguono sono tre routine evento relative alla maschera mostrata nella figura 1-2: Form_Open, Form_Load e lblTtitle_Click. Quando si apre per la prima volta la maschera in visualizzazione Maschera, si apre una finestra di messaggio con la frase
“The form opened”. Quando si seleziona OK, viene rilevato un secondo messaggio
“The form loaded”. Una volta che la maschera ha completato il ciclo di caricamento,
selezionando l’etichetta si apre una terza finestra di messaggio che riporta : “Hello from
the label”
Private Sub Form_Open(Cancel As Integer)
    MsgBox “The form opened.”, vbInformation, 
        “Programming Microsoft Access 2000”
End Sub
Private Sub Form_Load()
‘This is s simple statement.
    MsgBox “The form loaded.”, vbInformation, _
        “Programming Microsoft Access 2000”
‘This sets a property.
    Me.Caption = “New Caption”
‘Here are two methods for giving a control focus.
‘    DoCmd.GoToControl “txtMyTextBox”
    Me.txtMyTextBox.SetFocus
‘Now that the method worked, VBA sets a property.
    Me.txtMyTextBox.Text = “Hi, there!”
End Sub
Private Sub lblTitle_Click()
    MsgBox “Hello from the label.”, vbInformation, _
        “Programming Microsoft Access 2000”
End Sub

6

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Le routine evento fanno in modo che siano visualizzate finestre di messaggio. Selezionando l’etichetta si richiama la routine evento lblTitle_Click. Questa routine dispone di
una sola istruzione che presenta una finestra di messaggio (la sottolineatura alla fine della
prima riga della routine è un carattere di continuazione). Anche la routine evento Form_Open
ha una sola istruzione. La routine evento Form_Load dispone invece di diverse istruzioni
oltre quella relativa alla finestra di messaggio. Questa routine evento imposta dinamicamente
la didascalia relativa alla maschera, particolarmente utile quando si dispone di una maschera
che svolge più ruoli in un applicazione. Inoltre, imposta l’attivazione per la casella di testo
denominata txtMyTextBox e quindi assegna “Hi, there!” alla proprietà Text del controllo.
Questa routine illustra due diverse tecniche per l’impostazione dell’attivazione. Una si basa
sul metodo SetFocus e l’altra utilizza il metodo GoToControl per lo stesso scopo. Gli apostrofi
all’inizio di alcune righe di codice le contrassegnano come commenti. Una delle due tecniche è una riga di commento.

PROCEDURE E MODULI
Le procedure sono contenitori per il codice VBA. Esistono tre tipi di contenitori: procedure secondarie, procedure mediante funzioni e procedure mediante proprietà. Sebbene in
alcune aree le funzioni si sovrappongano, ogni tipo ha uno scopo unico e specifico. Access
offre due tipologie di base di contenitori per le procedure: moduli standard e moduli di
classe. I moduli di classe possono essere classi personalizzate relative a maschere e report.
È possibile utilizzarli, inoltre, per definire classi proprie, per semplificare il riutilizzo di codice
per le attività delle routine, come l’aggiunta di nuovi impiegati, il versamento di un deposito in un conto o il prelievo di denaro da un conto.

Procedure secondarie
Le procedure secondarie possono eseguire azioni, calcolare valori e aggiornare e rivedere
impostazioni di proprietà incorporate (le procedure secondarie vengono, di norma, definite “subroutine” o più semplicemente “procedure”). Come si è già visto, Access 2000 richiama automaticamente le routine evento ma è possibile utilizzarle in maniera più estensiva.
Le procedure non restituiscono mai valori. Inoltre, non definiscono proprietà personalizzate
per maschere, report o moduli di classe.
Una routine consiste di una serie di istruzioni VBA tra le istruzioni Sub e End Sub.
L’istruzione Sub deve dichiarare un nome per la procedura. Mentre le routine evento hanno nomi molto stilizzati (come object_event), i nomi delle procedure seguono, di norma, le
convenzioni di denominazione delle variabili standard. Devono iniziare con una lettera, non
possono superare i 255 caratteri, non possono includere segni di punteggiatura o spazi e
non devono includere il nome di una chiave, una funzione o un operatore VBA. Le procedure possono disporre di argomenti, inseriti dopo il nome della procedura. Se esistono più
argomenti, separarli mediante virgole.

7

Programmare Microsoft Access 2000

Un modo per guadagnare dimestichezza con le procedure consiste nell’utilizzare la
Creazione guidata Pulsante di comando, che scrive codice VBA per più di 30 funzioni. È
sufficiente effettuare alcune selezioni nelle finestre di dialogo. Le procedure scritte dalla
procedura guidata sono, di norma, piuttosto semplici, quindi rappresentano un ottimo strumento di apprendimento. Anche gli sviluppatori di livello medio e avanzato possono trarre vantaggio dalla procedura guidata in quanto crea un’ottima struttura per l’aggiunta di
codice con più specifiche. I principianti possono utilizzare la procedura guidata per
automatizzare rapidamente l’esplorazione dei record, la gestione dei database, le operazioni
su maschere generali e report, le chiamate di altre applicazioni e attività varie, come l’esecuzione di una query o la composizione di un numero telefonico.
È possibile richiamare la Creazione guidata Pulsante di comando dalla casella degli
strumenti in visualizzazione Struttura della maschera. Selezionare il pulsante Creazioni
guidate Controllo e quindi rilasciare un pulsante sulla maschera. Questo consente di aprire la finestra di dialogo riportata nella figura 1-3. È possibile selezionare circa una mezza
dozzina di azioni in ogni categoria. Dopo aver completato tutte le finestre di dialogo per
l’azione selezionata, è possibile visualizzare il codice nel VBE di Access 2000. Selezionare
il pulsante Codice dalla barra degli strumenti Struttura della maschera per passare a VBE.

Figura 1-3. Utilizzando la Creazione guidata Pulsante di comando, è possibile creare una routine
eventocompletainserendodatiinalcunefinestredidialogo.

Molti sviluppatori preferiscono scrivere procedure personalizzate dall’inizio alla fine.
È possibile aprire una finestra di codice per una routine evento, come descritto in precedenza, o creare una procedura ordinaria. Due sono i modi per avviare questo tipo di procedura, a seconda della posizione di inserimento. Se la procedura deve risiedere dietro una
maschera o un report, selezionare il pulsante Codice dalla barra degli strumenti Struttura.
Se il codice deve trovarsi in un modulo standard che non risiede in nessuna maschera o
report specifico, scegliere Strumenti-Macro-Visual Basic Editor o premere Alt+F11. In
entrambi i casi, si giunge a VBE. Scegliere Inserisci-Routine, nella finestra di dialogo Inserisci routine, inserire un nome e confermare la selezione del pulsante di opzione Sub. Questo

8

Capitolo 1 Introduzione a Visual Basic, Applications Edition

consente di creare una shell per una procedura con le istruzioni Sub e End Sub. È possibile
aggiungervi codice.
Utilizzare le proprie conoscenze del modello oggetto Access per codificare alcune
azioni. È importante ricordare che l’oggetto DoCmd dispone di metodi diversi. Digitare
DoCmd e quindi premere il tasto del punto. Questo consente di aprire la casella di riepilogo a discesa in cui sono visualizzate tutte le voci autorizzate dopo DoCmd. Quando si digita
una voce, Access converge sul sottoinsieme di risposte che corrisponde alla voce (vedere
figura 1-4). Se non si è sicuri di cosa digitare, è possibile scorrere attraverso le voci per trovare un metodo. Questa tecnica funziona per tutti gli oggetti, non solo DoCmd. Microsoft
definisce questa funzione IntelliSense perché è in grado di rilevare in maniera intelligente
il sottoinsieme di risposte appropriato. IntelliSense esegue due operazioni: Elenca le proprietà e i metodi autorizzati in qualsiasi punto della costruzione di un’istruzione VBA e
fornisce informazioni alla sintassi circa i contenuti dei campi, richiesti per le istruzioni VBA
selezionate. Questo consente di ridurre in maniera determinante gli errori e avviare velocemente le operazioni.

Figura 1-4. IntelliSense consente di completare un’istruzione VBA per l’oggetto DoCmd. Se si
digital’iniziodell’istruzionevienevisualizzatounelencodirisposteautorizzateperilbilanciamentodi
quellapartediistruzione.

Quella che segue è una procedura semplice composta da tre righe. La prima riga riserva un percorso di memoria per un risultato calcolato. La seconda aggiunge due costanti. La terza stampa il risultato nella Finestra Immediata. Questa finestra è simile a un blocco
di lavoro per la memorizzazione dei risultati intermedi durante il controllo del codice. È
possibile aprirla da VBE selezionando Visualizza-Finestra Immediata. È possibile eseguire la procedura da VBE, facendo clic su qualsiasi punto della procedura e quindi selezionando il pulsante Esegui Sub/Form utente sulla barra degli strumenti Standard.
Sub MyFirstCalculator()
Dim Result
    Result = 1 + 2
    Debug.Print Result
End Sub

9

Programmare Microsoft Access 2000

In una situazione più tipica, è possibile richiamare una procedura secondo due modalità. Si può includere il nome su una riga; se la procedura dispone di argomenti, è possibile includerli dopo il nome, separati da virgole. In alternativa, è possibile far precedere al
nome della procedura Call. Questa è una parola chiave di VBA per richiamare una procedura. Quando si utilizza Call, racchiudere gli argomenti tra parentesi dopo il nome della
procedura.
Quella che segue è una versione un po’ più flessibile della funzione di calcolo iniziale. La calcolatrice consiste di due procedure. Una, denominata MySecondCalculator, aggiunge due numeri qualsiasi e stampa il risultato nella Finestra immediata. Determina quali
numeri aggiungere dai due argomenti che riceve. L’altra procedura richiama la procedura
che esegue la somma. È possibile modificare i numeri aggiunti dalla seconda procedura, alterando il valore dei due argomenti nella prima procedura. In un’applicazione più sofisticata, è possibile collegare questi valori dell’argomento alle variabili o ai campi di una
maschera.
Sub CallSecondCalculator()
    MySecondCalculator 1, 3
End Sub
Sub MySecondCalculator(First, Second)
Dim Result
    Result = First + Second
    Debug.Print Result
End Sub

Procedure mediante funzioni
Le procedure mediante funzioni, definite di norma “funzioni”, differiscono dalle procedure
per un paio di aspetti. Innanzitutto, possono restituire un valore, quindi è possibile utilizzarle nelle espressioni proprio come si utilizzano le variabili. In secondo luogo, non funzionano come le routine evento. Sia le procedure che le funzioni possono eseguire attività.
Salvo alcune eccezioni, le funzioni e le procedure sono intercambiabili.
Una funzione è un insieme di istruzioni VBA collegate dalle istruzioni Function e End
Function. Può accettare argomenti proprio come una procedura. Una funzione può includere una o più espressioni. Almeno una di queste può impostare il nome della funzione
come equivalente di un valore. È possibile terminare una funzione dopo averne impostato
il valore mediante un’istruzione Exit Function. Tutte le funzioni possono contenere una o
più istruzioni Exit Function.
Sebbene una funzione possa restituire un valore, questa condizione non è necessaria. Una funzione può essere un insieme di istruzioni che richiamano metodi e impostano
proprietà senza mai impostare il nome della funzione come equivalente di un valore. Questo è uno degli aspetti per cui le funzioni sono simili alle procedure.

10

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Una funzione viene avviata proprio come una procedura ma si seleziona il pulsante
di opzione Function invece di Sub nella finestra di dialogo Inserisci routine. È possibile
richiamare una procedura mediante funzioni selezionando il pulsante Esegui Sub/Form
utente sulla barra degli strumenti Standard in VBE. È possibile, inoltre, richiamare una
funzione dalla Finestra Immediata: digitare un punto interrogativo seguito dal nome della
funzione. Se la funzione presenta argomenti, questi vengono messi tra parentesi, separati
da virgole. È possibile eseguire funzioni personalizzate, come le funzioni incorporate di
Access, dalla Finestra Immediata.
La figura 1-5 mostra una visualizzazione di VBE con una funzione semplice che
determina se la data inserita come argomento è compresa nel terzo millennio. Per corrispondere alla convenzioni comuni, si calcola questo millennio come avente inizio nell’anno 2000 piuttosto che nel 2001. La funzione Year2KTest accetta una data e restituisce 3 se
la data è compresa nel terzo millennio, altrimenti restituisce 0. La Finestra Immediata sotto la finestra di codice mostra il risultato per l’esecuzione della funzione con due date diverse. La Finestra Immediata, nella figura 1-5, conferma il risultato, restituendo 3 per il primo
giorno del 2000 e uno 0 per il primo giorno del 1999. È necessario racchiudere una data
tra due segni di sterlina.

Figura 1-5. Funzione richiamata dalla Finestra Immediata.

La procedura della pagina seguente rappresenta un approccio più sofisticato per la
questione dell’anno 2000. La funzione viene avviata dichiarando l’intervallo di date in cui
la funzione è valida. Quindi verifica l’argomento in relazione ai due eventi chiave del millennio. Se la data non è compresa nel primo o nel secondo millennio, la funzione dà per
assunto che appartenga al terzo. L’istruzione iniziale della finestra di messaggio indica l’intervallo di date all’interno del quale la funzione è valida.

11

Programmare Microsoft Access 2000

Public Function PopularMillennium(dtmDateIn) As Byte
    MsgBox “This works for dates after 12/31/0099” & _
        “ and before 1/1/3000.”, _
        vbInformation, _
        “Programming Microsoft Access 2000”
    If dtmDateIn <= #12/31/999# Then
        PopularMillennium = 1
    ElseIf dtmDateIn <= #12/31/1999# Then
        PopularMillennium = 2
    Else
        PopularMillennium = 3
    End If
End Function

Le date di Access 2000 sono valide dall’1/1/100 al 31/12/2999. Questo intervallo
è sufficiente per la stragrande maggioranza delle applicazioni desktop. Se è necessario un
intervallo che vada oltre queste date, è necessario considerare la codifica delle date in maniera indipendente dal sistema date seriale di Access.

NOTA: Access 2000 è compatibile con l’anno 2000. Come le precedenti
versioni, memorizza le date con quattro cifre complete. Access 2000 gestisce, inoltre, gli anni bisestili correttamente: gli anni divisibili per 4 sono
anni bisestili, a meno che non siano divisibili per 100. Tuttavia, se sono
divisibili per 400, sono anni bisestili. Dal momento che 2000 è divisibile
per 400 è un anno bisestile. La regola è strategica per il calcolo della differenza tra due date. I formati Data generica e Data breve di Access utilizzano le opzioni del formato data breve del sistema operativo per
determinare la visualizzazione corretta. Se si definiscono le impostazioni
internazionali del pannello di controllo per mostrare le date con anni a
quattro cifre, tutti i formati della Data generica mostrerà le quattro cifre
complete.
Le regole riportate sopra non eliminano del tutto la possibilità che la programmazione faccia emergere problemi relativi all’anno 2000. Quindi, ogni applicazione di Access
può presentare un bug relativo all’anno 2000 anche se Access 2000 è compatibile con l’anno 2000. Visitare il sito www.microsoft.com/technet/topics/year2k/default.htm per un panoramica di Microsoft sull’argomento insieme a verifiche della compatibilità con l’anno 2000
di prodotti e versioni. Il sito FMS (www.fmsinc.com/tpapers/index.html#Year 2000 Papers)
offre una prospettiva diversa su alcune delle questioni relative ad Access e all’anno 2000.
FMS commercializza un prodotto, denominato Total Access Inspector 2000, che individua
proprio le questioni relative all’anno 2000 nelle applicazioni Access.
Spesso è possibile utilizzare sia le procedure che le funzioni per sviluppare una soluzione a un problema. La figura 1-6 illustra una maschera basata su entrambi i tipi di funzioni per sviluppare risposte. La maschera consente a un utente di digitare valori nelle caselle
di testo, con l’etichetta Number 1 e Number 2. Selezionando un pulsante funzione /, *, −
, o + si calcola un risultato corrispondente nella casella di testo Risultato.

12

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Figura 1-6. La maschera funge da semplice calcolatrice. Le funzioni VBA attivano i pulsanti della
maschera e riempiono la casella di testo Risultato, sulla base delle voci delle altre due caselle di testo.

Il codice VBA per l’implementazione della maschera nella figura 1-6 utilizza quattro coppie di procedure, come riportato di seguito. Quattro procedure si comportano come
un gestore di eventi, selezionando i quattro tasti di funzione della maschera. Questi gestori di eventi non fanno altro che richiamare una funzione che estrae i valori dalle due caselle
di testo, esegue il calcolo indicato dal pulsante funzione e restituisce il valore alla routine
evento. La routine evento, a sua volta, assegna il valore restituito dalla funzione alla terza
casella di testo della maschera. È importante notare l’utilizzo opzionale del prefisso Me prima
dei nomi delle caselle di testo. Dal momento che il codice si trova dietro la maschera con
la casella di testo, specificare il nome della maschera è un’operazione facoltativa. Le routine
evento utilizzano Me al posto del nome di classe della maschera, più lungo e formale
(Form_frmCalculator1).
Option Compare Database
Option Explicit
Dim dblResult As Double
Private Sub cmdAddition_Click()
    Me.txtResult = MyAdder
End Sub
Private Function MyAdder()
    dblResult = CDbl(txtNumber1) + CDbl(txtNumber2)
    MyAdder = dblResult
End Function
Private Sub cmdSubtraction_Click()
    Me.txtResult = MySubtractor
End Sub
Private Function MySubtractor()
    dblResult = CDbl(txtNumber1) - CDbl(txtNumber2)
    MySubtractor = dblResult
End Function
(continua)

13

Programmare Microsoft Access 2000

Private Sub cmdMultiplication_Click()
    Me.txtResult = MyMultiplier
End Sub
Private Function MyMultiplier()
    dblResult = CDbl(txtNumber1) * CDbl(txtNumber2)
    MyMultiplier = dblResult
End Function
Private Sub cmdDivision_Click()
    Me.txtResult = MyDivider
End Sub
Private Function MyDivider()
    dblResult = CDbl(txtNumber1) / CDbl(txtNumber2)
    MyDivider = dblResult
End Function

La funzione e le procedure risiedono nel modulo del codice dietro la maschera.
L’istruzione Dim sulla parte superiore del modulo dichiara una variabile che tutte le procedure del modulo possono utilizzare. Dal momento che gli utenti possono selezionare solo
un tasto funzione alla volta, questa condivisione di dblResult funziona. L’istruzione Option
Explicit provoca la dichiarazione delle variabili prima del loro utilizzo. Questo consente di
evitare errori tipografici, molto comuni nei programmi. Option Compare Database è una specifica a livello di modulo che designa variabili di stringa ordinate secondo l’ID locale del
pannello di controllo.
La coppia di procedure che segue illustra molto di quanto detto circa le procedure,
le funzioni e i metodi. La maschera frmCalculator2 dispone solo di due controlli: una casella
di testo, denominata txtInput e un pulsante di comando denominato cmdSquarer. La maschera
calcola il campo della voce nella casella di testo, quando l’utente seleziona il pulsante. Le
procedure visualizzano il risultato in una casella di messaggio.
Option Compare Database
Option Explicit
Dim dblResult As Double
Private Sub cmdSquarer_Click()
    MySquarer Form_frmCalculator2.txtInput
End Sub
Public Sub MySquarer(MyOtherNumber As Double)
    dblResult = MyOtherNumber * MyOtherNumber
    MsgBox dblResult, vbInformation, _
        “Programming Microsoft Access 2000”

14

Capitolo 1 Introduzione a Visual Basic, Applications Edition

‘Optional statements illustrating the use of methods
‘    DoCmd.GoToControl “txtInput”
‘    txtInput.SetFocus
‘    DoCmd.Close acForm, “frmCalculator2”, acSaveNo
End Sub

La routine evento cmdSquarer_Click richiama la procedura MySquarer e passa i contenuti di txtInput sotto forma di argomento. MySquarer calcola il risultato e quindi visualizza
il risultato in una finestra di messaggio.
Tre ulteriori righe di commento suggeriscono azioni aggiuntive che è possibile eseguire. Una riga, che richiama il metodo GoToControl, mostra la modalità per spostare l’attivazione dal pulsante alla casella di testo. L’esempio di SetFocus, alla riga successiva, illustra
un modo alternativo per ottenere lo stesso risultato. Il metodo Close mostra la modalità per
chiudere una maschera. Questa riga utilizza un altro nome, frmCalculator2, per fare riferimento alla maschera. L’utilizzo della costante acSaveNo è importante, perché consente di
chiudere la maschera senza una richiesta di salvataggio della maschera.

Procedure mediante proprietà
Utilizzare le procedure mediante proprietà per definire proprietà personalizzate per maschere, report e moduli di classe. Dei moduli di classe si discuterà nella sezione successiva e nel
capitolo 7 si esamineranno anche esempi di procedure mediante proprietà.
Esistono tre tipi di istruzione di proprietà: Property Get, Property Let e Property Set. È
possibile utilizzare queste istruzioni per aggiungere proprietà speciali alle maschere. L’istruzione Property Get e l’istruzione End Property corrispondente possono restituire un valore,
proprio come una procedura mediante funzioni. Se si definisce una proprietà con una sola
istruzione Property Get, quella proprietà è in sola lettura. Una proprietà in sola lettura è utile quando si ha il diritto di visualizzare una quantità ma non di alterarla, ad esempio il
bilanciamento di 401K o i gradi.
Con alcune proprietà, è importante essere in grado di modificarle anche senza
poterle visualizzare. Ad esempio, per gli amministratori della protezione dei database
non è necessario leggere le password utente che supervisionano. Devono, invece, poterle sovrascrivere quando gli utenti dimenticano la password. Utilizzare l’istruzione Property Let, con l’istruzione corrispondente End Property per impostare una
password.
L’istruzione Property Set funziona in maniera simile a Property Let. Entrambe creano un’impostazione per una proprietà. L’istruzione Property Let imposta una
proprietà equivalente a un tipo di dati, come una stringa o un valore intero. L’istruzione Property Set imposta una proprietà equivalente a un riferimento oggetto. Si
utilizza l’istruzione Property Set con i riferimenti oggetti, come i riferimenti a una
maschera o a un report.

15

Programmare Microsoft Access 2000

Dal momento che molte proprietà sono sia in lettura che in scrittura, spesso verranno
utilizzate sia Property Get che Property Let o Property Set. In questo caso, la coppia di istruzioni Property
deve avere lo stesso nome, in modo tale da fare riferimento alla stessa proprietà.

Moduli
Un modulo è un contenitore per procedure e dichiarazioni, come Option Explicit e Dim.
Esistono due tipi di moduli di base. Innanzitutto, esistono moduli standard, che vengono
elencati in Moduli nella finestra Database. Le procedure di un modulo standard sono indipendenti da oggetti esistenti in un file di database di Access. Questo significa che non esistono riferimenti a Me o nomi controllo senza prefissi appropriati per i controlli. Tuttavia,
le applicazioni possono fare riferimento a procedure di un modulo standard da qualsiasi
altro oggetto.
Il secondo tipo di modulo è il modulo di classe. Esistono tre varietà di base di moduli di classe: di classe della maschera, di classe del report e di classe personalizzata. Le
procedure all’interno di un modulo sono generalmente accessibili ad altri moduli. È possibile estrarre una procedura da questa area di validità generale, utilizzando la parola chiave
Private quando si specifica la procedura (per la sintassi di esempio vedere la figura 1-7). È
possibile anche dichiarare esplicitamente che le procedure hanno un’area di validità globale, utilizzando la parola chiave Public.
Un modulo di maschera è relativo a una maschera che abbia almeno una dichiarazione o una procedura. La creazione di una routine evento per una maschera o un controllo
su una maschera crea un modulo di classe maschera. I moduli di classe di report funzionano in maniera simile ai moduli di classe maschera ma gli eventi Report sono diversi da quelli relativi alle maschere ed è difficile che si disponga della stessa combinazione di controlli
su un report e su una maschera. È possibile creare moduli di classe personalizzati che comprendano funzioni di metodo e funzioni di procedura per un concetto, come un impiegato o un conto. È possibile fare riferimento a metodi e proprietà per i moduli di classe
personalizzati molto più spesso di quanto accada per le classi incorporate di Access.
Si utilizzano moduli di classe personalizzati, come i taglierini, per creare nuove istanze
di una classe. Access dispone di due modalità per eseguire questo tipo di operazioni.
Innanzitutto, è possibile utilizzare una sola istruzione Dim sia per dichiarare la classe che
per crearne una nuova istanza. La sintassi per istruzioni di questo tipo è la seguente
Dim objInstance As New objClass

Il secondo approccio si basa su una coppia di istruzioni. Il primo membro della coppia
dichiara l’istanza dell’oggetto. Il secondo membro imposta un riferimento all’oggetto. La
sintassi per quest’istruzione è la seguente
Dim objInstance as objClass
Set objInstance = New objClass

16

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Il nome objClass si riferisce a un modulo di classe, con procedure mediante proprietà e
funzioni di metodo pubbliche. Queste funzioni di metodo si comportano come metodi per la
classe, proprio come le procedure mediante proprietà servono a definire le proprietà. Il capitolo 7 illustra la modalità per creare e utilizzare moduli di classe personalizzati.

INTERFACCIA VBE
La nuova interfaccia VBE è probabilmente la modifica di maggior rilievo dell’ambiente di
sviluppo di Access. Questa interfaccia consente di equiparare Access 2000 a Microsoft Word,
Excel e PowerPoint da un punto di vista di interfaccia di sviluppo. Questa sezione esaminerà l’utilizzo e il layout delle finestre e illustrerà la modalità per utilizzarle per il debug.
Inoltre, verrà ripreso l’utilizzo del Visualizzatore oggetti.

Finestre VBE
Access 2000 offre almeno tre percorsi per VBE relativi ai moduli che non si trovano dietro una maschera o un report. Innanzitutto, gli utenti che hanno dimestichezza con lo sviluppo di altri componenti Office possono scegliere Strumenti-Macro-Visual Basic Editor
dalla finestra Database. I tasti di scelta rapida per ottenere lo stesso risultato sono Alt+F11,
che consentono di accedere immediatamente a VBE. È possibile utilizzare Alt+F11 per passare dalla finestra Database a quella di VBE e viceversa. In secondo luogo, se si dispone
già di moduli standard, selezionare il pulsante Moduli nella finestra Database e quindi fare
doppio clic su uno dei moduli standard che si desidera visualizzare. Questa operazione apre
VBE con la visualizzazione del modulo desiderato. In terzo luogo, se si desidera creare un
nuovo modulo standard, selezionare il pulsante Moduli nella finestra Database e quindi New
sulla barra degli strumenti. Questo consente di aprire un modulo vuoto in VBE.

NOTA: il team di sviluppo di Office sta lavorando a una quarta strada per
VBE, che ad alcuni sviluppatori di Access risulterà già nota. Sarà possibile selezionare un pulsante Codice nella finestra Database con un modulo
standard, una maschera o un report selezionato. Il pulsante Codice aprirà VBE con il modulo corrispondente.

Per arrivare al modulo dietro a una maschera o a un report, è necessario prima di tutto
aprire l’oggetto in visualizzazione Struttura. È possibile selezionare il pulsante Codice sulla barra degli strumenti Struttura. Questo consente di aprire il modulo e posiziona la
visualizzazione sulla parte superiore del modulo. È possibile passare direttamente alla procedura mediante eventi relativa a un oggetto specifico su una maschera o un report, selezionando il pulsante per la creazione accanto all’evento nel foglio delle proprietà. Se non
esiste una procedura mediante eventi per un oggetto, selezionando il pulsante per la creazione e scegliendo Code Builder si passa a una routine evento vuota, relativa all’oggetto.

17

Programmare Microsoft Access 2000

Una volta passati a VBE, è possibile aprire le finestra Progetto e Proprietà., utili per
aprire e ispezionare gli altri moduli di un’applicazione. Nella finestra Progetto sono
visualizzati moduli che non stanno dietro a una maschera o a un report nella cartella Moduli. I moduli dietro le maschere e i report vengono visualizzati nella cartella Microsoft
Access Class Objects. È possibile selezionare una cartella associata a una maschera o a un
report per visualizzare e impostare gli oggetti associati alla classe. Per aprire la finestra
Progetto o quella Proprietà, scegliere il comando appropriato dal menu Visualizza o utilizzare i tasti di scelta rapida della tastiera o i collegamenti della barra degli strumenti.

NOTA: per fare in modo che nella finestra Proprietà siano visualizzati gli
oggetti relativi a un oggetto classe di Access, l’oggetto deve essere aperto in visualizzazione Struttura. Facendo doppio clic su un modulo o una
classe nella finestra Progetto, vengono visualizzate le istruzioni e le dichiarazioni corrispondenti nella finestra Codice corrispondente ma gli oggetti
vengono visualizzati solo se anche l’oggetto classe è aperto in
visualizzazione Struttura.
La figura 1-7 mostra il codice relativo al database di esempio di questo capitolo, caricato in VBE. La finestra Progetto mostra la classe Form_frmSample1 selezionata. In basso, la finestra Proprietà mostra il controllo di etichetta per il titolo della maschera selezionato.
La finestra mostra, inoltre, che il controllo di etichetta dispone di una routine evento associata all’evento OnClick. La finestra Codice a destra delle finestre Progetto e Proprietà mostra il codice per questa procedura mediante eventi. È possibile spostare, ridimensionare e
ancorare una di queste finestre.

Figura 1-7. Finestre Progetto, Proprietà e Codice di VBE con il codice relativo al database di esempiodelcapitolo.

18

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Facendo doppio clic su un’altra classe di Access o oggetto Modulo nella finestra Progetto si apre la finestra Codice corrispondente, in cui è possibile esaminare, modificare o
copiare il codice. La finestra Codice presenta un layout noto, con le caselle di riepilogo a
discesa Oggetto e Procedura nella parte superiore. È possibile utilizzare queste caselle per
passare a un modulo di grosse dimensioni o aprire nuove procedure in un modulo esistente. La finestra Proprietà mostra le proprietà relative alla classe o al modulo di Access correntemente selezionato. Sebbene sia possibile modificare le proprietà dell’oggetto nella
finestra, è più utile e flessibile modificare le proprietà dell’oggetto relative a una maschera
o a un report in visualizzazione Struttura.

Debug
È possibile utilizzare la finestra Codice per eseguire il debug ed esaminare il codice. Si può
aggiungere o rimuovere un punto di interruzione di un’istruzione, selezionando il margine
a sinistra dell’istruzione. VBE contrassegna il punto di interruzione con il tradizionale punto
sul margine sinistro. La figura 1-8 mostra il debugger bloccato sulla seconda delle quattro
righe di codice di una procedura; la freccia sul margine sinistro indica la riga di codice che
verrà eseguita successivamente.

Figura 1-8. Finestra Codice per l’evento di caricamento della classe Form_frmSample1 su un
puntodiinterruzione,conunafrecciachepuntaallarigacheverràeseguitasuccessivamente.

Scegliere Continua dal menu Esegui per riavviare l’esecuzione del codice dopo un
punto di interruzione. La figura 1-9 della pagina seguente mostra il risultato dell’esecuzione di quello che resta del codice nella procedura Form_frmSample1. Nella didascalia della
maschera è riportato “New Caption”, mentre nella casella di testo è riportato “Hi, there!”
È possibile utilizzare la freccia mostrata nella figura 1-8 per ignorare una o più righe
di codice nel percorso di esecuzione. Ad esempio, la figura 1-10 della pagina seguente mostra
il risultato del trascinamento della freccia alla riga che richiama il metodo SetFocus e della
scelta del comando Continua dal menu Esegui. Questa procedura ignora l’assegnazione di
“New Caption” alla proprietà Caption della maschera, quindi la maschera sembra simile a
quella della figura 1-9 ma la didascalia dice “My Default Caption”.

19

Programmare Microsoft Access 2000

La figura 1-11 mostra il risultato del trascinamento della freccia nella figura 1-8 alla
riga finale del codice che esegue un’assegnazione alla casella di testo. Questo, ovviamente,
genera un messaggio di errore, a causa del tentativo di assegnare un valore di proprietà senza
che l’oggetto sia attivato.

Figura 1-9. Risultato dell’esecuzione delle tre righe rimanenti nella figura 1-8.

Figura1-10. Risultatoottenutoignorandolasecondarigarimanentenellafigura1-8econtinuando
l’esecuzione.

Figura 1-11. Risultato ottenuto ignorando l’ultima riga rimanente nella figura 1-8 e continuando
l’esecuzione.

20

Capitolo 1 Introduzione a Visual Basic, Applications Edition

La maggior parte delle funzioni della finestra Debug di Microsoft Access 97 è disponibile in Access 2000. La finestra Debug di Access 97 disponeva di una pagina Controllo
e di una pagina Variabili locali; ciascuna di esse disponeva di un riquadro diviso, in cui era
disponibile la Finestra Immediata come parte della pagina. Access 2000 presenta finestre
Controllo, Variabili locali e Immediata distinte. Aprire queste finestre in VBE, utilizzando
il menu Visualizza. È possibile trascinare, rilasciare e ridimensionare ciascuna di esse insieme
alle finestre Codice, Progetto e Proprietà. Scegliere Strumenti-Opzioni e utilizzare la pagina Aggancio per indicare la finestra ancorabile.
È possibile utilizzare la finestra Controllo per rilevare valori di espressioni, variabili
e oggetti quando viene eseguito il codice. Dopo aver aperto una finestra Controllo, è possibile aggiungere variabili per eseguire il controllo, scegliendo Debug-Aggiungi espressione di controllo. Selezionare una variabile per eseguire il controllo, prima di richiamare il
comando. Quando si apre la finestra di dialogo Aggiungi espressione di controllo, selezionare un tipo Controllo e quindi scegliere OK per chiudere la finestra di dialogo. Il valore
della variabile viene mostrato nella finestra Controllo quando viene eseguito il codice. Se
si esamina il codice in modalità interruzione, è possibile verificare il valore delle variabili
critiche ad ogni passaggio.
La figura 1-12 mostra il valore della proprietà di frmSample1 Caption immediatamente dopo che una riga di codice lo trasforma da “My Default Value” a “New Caption”. La
finestra Controllo mostra il valore di txtMyTextBox come Null, dal momento che il codice
non ha ancora eseguito l’istruzione di assegnazione.

Figura 1-12. Finestra Controllo che illustra lo stato delle espressioni quando viene eseguita una
routineevento.

La finestra Variabili locali può visualizzare tutte le variabili nell’area di validità, mentre il codice viene eseguito in modalità interruzione. Quando l’esecuzione si interrompe su
un punto di interruzione, la finestra Variabili locali contiene un oggetto Me. È possibile
successivamente espandere Me e i componenti selezionati per ricercare valori di tutte le
proprietà e variabili. Questo può essere utile se sono richiesti dettagli completi per poter
determinare la modalità di esecuzione di un programma.

21

Programmare Microsoft Access 2000

La Finestra Immediata può risultare lo strumento più efficace per lo sviluppo e il
debug del codice. Da questa finestra, è possibile eseguire qualsiasi funzione o subroutine
che si trovi all’interno dell’area di validità. È possibile, inoltre, valutare le espressioni e le
modalità diverse di scrittura di funzioni. Prima della disponibilità delle espressioni Controllo,
la Finestra Immediata era adeguata per la stampa dei risultati intermedi in modalità interruzione e può ancora risultare utile per le funzioni in particolari circostanze.
La figura 1-13 mostra tre utilizzi della Finestra Immediata. Nella discussione iniziale sulle procedure sono state descritte queste funzioni ma non è stato illustrato il risultato
nella Finestra Immediata. Digitando MyFirstCalculator si richiama la procedura con lo stesso nome. Quando si preme Invio nella Finestra Immediata, viene eseguita la procedura e
stampato il risultato 3 nella finestra. Lo stesso vale per la procedura CallSecondCalculator. In
questo caso, il risultato è 4. L’ultimo esempio illustra come specificare argomenti per la
funzione MySecondCalculator; è sufficiente digitare il nome, uno spazio e l’argomento separato da una virgola. L’esempio è strategico, dal momento che illustra la modalità di utilizzo degli argomenti passati a una procedura o a una funzione per calcolare un valore restituito.

Figura 1-13. Finestra Immediata che illustra la modalità di esecuzione delle procedure e delle funzioniincorporate.

La Finestra Immediata può essere utilizzata anche per eseguire funzioni incorporate e personalizzate. Con una funzione, è necessario specificare un comando di stampa per
restituire il risultato della funzione. È possibile utilizzare la parola chiave Print o semplicemente ? seguito dal nome della funzione e da un ritorno a capo. L’ultimo esempio nella
Finestra immediata illustra la modalità per richiamare la funzione incorporata Date.

22

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Visualizzatore oggetti
Il Visualizzatore oggetti, mostrato nella figura 1-14, è uno strumento efficace per ottenere
informazioni sui modelli di oggetto. È particolarmente importante per gli sviluppatori di
Access 2000, a causa delle numerose innovazioni significative del nuovo modello di oggetti.
Ad esempio, Access 2000 introduce un nuovo linguaggio di sviluppo dell’accesso ai dati,
ADO (ActiveX Data Objects), che renderà obsoleto DAO (Data Access Objects). Sono
almeno tre i modelli di oggetto che sottendono l’implementazione Access 2000 di ADO.

Figura 1-14. Visualizzazione mediante il Visualizzatore oggetti della classe ADODB
Recordset e di un insieme selezionato di membri.

Prima di visualizzare le classi di oggetti ADO nel Visualizzatore oggetti, è necessario impostare un riferimento nella libreria appropriata. Scegliere Strumenti-Riferimenti per
verificare o creare collegamenti alle librerie di tipo ADO. Aprire il Visualizzatore oggetti,
premendo il relativo pulsante sulla barra degli strumenti standard di VBE. Per aprirlo è anche
possibile utilizzare il menu Visualizza e premere il tasto di scelta rapida F2. Il nome di una
delle librerie ADO è ADODB. Selezionare questa libreria dall’elenco a discesa nella parte
superiore del Visualizzatore oggetti. Questo consente di modificare i contenuti dell’elenco Classi e in quello Membri del browser. La figura 1-14 mostra la classe Recordset, selezionata dall’elenco Classi e una combinazioni di proprietà, metodi ed eventi visualizzati
nell’elenco Membri. Selezionare la voce relativa a un membro e quindi il pulsante ? per
disporre di una guida in linea dettagliata sull’argomento. Il Visualizzatore oggetti può anche ricercare classi e membri specifici grazie al suo motore di ricerca. Utilizzare la seconda
casella di riepilogo a discesa per specificare i criteri di ricerca. Questo talvolta restituisce
insiemi di risultati in numerose librerie diverse. Il Visualizzatore oggetti rende possibile
un’analisi distinta di esse.

23

Programmare Microsoft Access 2000

JET, TIPI DI DATI E DICHIARAZIONI
È necessario specificare i tipi di dati in posizioni diverse all’interno di Access, incluse
le variabili all’interno di procedure e le tabelle di dati memorizzati su una periferica di
memorizzazione. Le sezioni che seguono affrontano alcune questioni legate allo sviluppo concernenti i tipi di dati da Jet 4 e l’utilizzo di variabili nelle procedure.

Jet
Access 2000 supporta due motori di database. Fino a questo momento Access è stato
legato al motore di database Jet. Access 2000 introduce un supporto di database incorporato per SQL Server 7. La compatibilità con SQL Server per Access 2000 viene
illustrata nel capitolo 12. In questa sezione sono discussi gli effetti delle innovazioni Jet 4 sul progetto delle applicazioni di Access 2000. Queste innovazioni
possono influenzare le dimensioni dei file di database e del blocco dei record, la
modalità di lavoro con i tipi di dati del campo selezionato (inclusi i campi chiave
Promemoria, Collegamento ipertestuale e quelli a incremento automatico) e i collegamenti alle origini dati esterne.
Access 2000 memorizza tutti i dati di testo e promemoria in formato Unicode.
Questo consente di sostituire il formato MBCS (multi-byte character set), utilizzato
nelle precedenti versioni di Access per il giapponese, il cinese e le altre lingue selezionate. Unicode è un sottoinsieme dello standard ISO 10646, che fornisce una codifica
digitale per tutte le lingue scritte. Il nuovo standard richiede 2 byte invece di un 1 byte
per rappresentare un carattere. Questo fa in modo che le dimensioni dei database che
fanno riferimento a campi basati sui caratteri vengano quasi raddoppiate. Per variare
l’incremento, Jet comprime e decomprime i tipi di dati ogni volta che è possibile. Vengono compressi i campi promemoria di 4000 caratteri o meno. All’interno di un campo, questo può provocare la compressione di alcune ma non di tutte le righe di un
campo dati promemoria. Sia Access che ADO comprimono automaticamente i caratteri Unicode ma DAO non supporta la compressione per tipi di dati stringa. Gli
sviluppatori, che programmano in Jet SQL, dispongono di una clausola WITH
COMPRESSION per la specificazione delle tabelle.
Oltre al nuovo formato per tipi di dati carattere, la dimensione della pagina è diventata di 4 KB. Questo consente di ridurre la concorrenza dovuta ai conflitti di più blocchi
di pagina. Jet risolve la questione, offrendo un blocco di una sola riga. È possibile ridurre
al minimo il problema della concorrenza, bloccando i singoli record invece delle pagine intere. Access 2000 consente agli utenti di aggiornare due record sulla stessa pagina contemporaneamente.

NOTA: le nuove dimensioni della pagina incrementano le dimensioni
massime del database da 1.07 Gb a 2.14 Gb.
Il blocco di una sola riga è l’opzione predefinita generale ma gli utenti e gli sviluppatori
possono utilizzare il tradizionale blocco di pagina. I campi e gli indici promemoria non
supportano mai il blocco di una sola riga. L’accesso ai dati mediante ADO o Jet SQL con-

24

Capitolo 1 Introduzione a Visual Basic, Applications Edition

sente il ripristino facoltativo del blocco a livello di pagina. L’accesso ai dati mediante maschere Access e DAO consente il blocco di una sola riga.
Anche se il blocco di una sola riga risulta utile per ridurre al minimo i conflitti di
concorrenza, è necessario un costo aggiuntivo per l’impostazione e la rimozione dei blocchi di record. L’impatto di questo sovraccarico dipende dalla dimensione dei record in relazione alle dimensioni della pagina, così come al numero di blocchi necessari per l’attività
in questione.
La transizione a Unicode consente anche un ordinamento compatibile con Microsoft
Windows NT. Questo migliora la compatibilità e le prestazioni, dal momento che Access
2000 può distribuire l’esecuzione dell’ordinamento coerente sia ai sistemi Microsoft
Windows 95 che a quelli Windows NT. Ciò è possibile in quanto Windows 95 supporta solo
l’ordinamento sulla base della lingua di sistema predefinita, mentre Windows NT supporta
un ordinamento corretto sulla base di più lingue. Inoltre, Visual Basic 6 e SQL Server 7
supportano lo stesso standard di ordinamento, che fornisce una standardizzazione
multiprodotto. L’ordinamento di Access 2000 è del 50% più veloce, per la maggior parte
delle lingue, ma l’aumento della velocità di ordinamento è anche maggiore per altri lingue,
ad esempio il tailandese.
Jet 4 supporta l’indicizzazione per i primi 255 caratteri dei tipi di dati Promemoria.
Le versioni precedenti di Access e Jet non supportavano nessuna indicizzazione per i campi
Promemoria. Sebbene la lunghezza limitata dell’indice non sia appropriata a tutte le applicazioni dei campi Promemoria, è di particolare rilievo per il tipo di dati Collegamento
ipertestuale, che è un derivato del tipo di dati Promemoria. La nuova indicizzazione può
attivare l’ordinamento e la ricerca dei campi Collegamento ipertestuale.
Jet 4 consente, inoltre, agli sviluppatori di specificare un valore iniziale e un valore
di passaggio per i campi ad incremento automatico. Inoltre, una nuova istruzione ALTER
TABLE consente agli sviluppatori Jet SQL di reimpostare sia il valore iniziale che quello
di passaggio. È possibile utilizzare un’altra nuova istruzione SELECT @@IDENTITY per
ripristinare l’ultimo valore relativo alla colonna ad incremento automatico. Viene passato
il valore dell’istruzione SQL insieme al testo SQL relativo al metodo Open dell’oggetto
Recordset in un’istruzione ADO. DAO non supporta la nuova istruzione.
Jet 4 ha attivato la tecnologia installabile ISAM in diverse aree, che può influenzare
le opportunità di sviluppo di Access mediante origini di dati esterne. La nuova tecnologia
ISAM Text/HTML consente di leggere i documenti Web in formato Unicode. La nuova tecnologia Exchange ISAM offre miglioramenti in diverse aree. Prima di tutto, legge gli indici dal
server Exchange. Questo consente di aumentare notevolmente la velocità di ricerca dei record
nelle origini di dati Exchange. In secondo luogo, la nuova tecnologia ISAM supporta la Rubrica Windows per il client Microsoft Outlook Express. In ambienti aziendali più piccoli, in cui
l’attivazione della posta è esterna piuttosto che interna, questo offre vantaggi significativi (anche se solo in termini di produttività personale). Infine, Jet può recuperare client Outlook
personalizzati, così come quelli relativi al client Outlook Exchange. Gli utenti dei database dBase
e Paradox possono continuare a utilizzare l’accesso in lettura e in scrittura ai suddetti database,
mediante Jet 5. Coloro che hanno bisogno di un supporto per una versione più recente
devono procurarsi una copia di Borland Database Engine da altri produttori.

25

Programmare Microsoft Access 2000

Tipi di dati
VBA utilizza regolarmente variabili per salvare i risultati calcolati, impostare le proprietà,
indicare gli argomenti per i metodi e passare i valori tra le procedure. Per un’esecuzione
efficiente, VBA utilizza un insieme di tipi di dati per le variabili. Diverse altre attività di
Access, come le tabelle di definizione e gli argomenti di funzione, utilizzano i tipi di dati.
Questa sezione si incentra sui tipi di dati per variabili. Altri tipi di dati sono, di norma, simili. Inoltre, Access consente tipi di dati diversi per ciascuna attività.
La tabella che segue elenca i tipi più importanti di variabili e i loro requisiti di
memorizzazione nei programmi VBA. Gli sviluppatori che necessitano di alti livelli di precisione nei loro calcoli numerici possono utilizzare il tipo di dati Decimal come sottotipo
del tipo di dati Variant. I tipi di dati Decimal corrispondono a numeri interi senza segno a
12 byte, adattati da una potenza variabile di 10. Non è possibile dichiarare un tipo di dati
Decimal con un’istruzione Dim ma è possibile memorizzare un tipo di dati Decimal, trasformando Variant con una funzione CDec. È buona norma utilizzare il tipo di dati più
piccolo per rendere disponibile una grossa quantità di memoria per altre variabili e logiche
di applicazione. Tuttavia, quando è necessaria la precisione per i calcoli numerici, è disponibile il tipo di dati Decimal.

TIPI DI DATI VARIABILI

26

Nome

Numero
di byte

Intervallo

Byte

1

Da 0 a 255

Boolean

2

Vero o falso

Integer

2

Da -32.768 a 32.767

Long

4

Da -2.147.483.648 a 2.147.483.647

Single

4

Da -3,402823E38 a -1,401298E-45
per i valori negativi
da 1,40129E-45 a 3,402823E38
per i valori positivi

Double

8

Da -1,79769313486232E308 a
-14,94065645841247E-324 per i valori negativi
da 4,94065645841247E-324 a
1,79769313486232E308 per i valori positivi

Currency

8

Da -922.337.203.685.477,5808 a
922.337.203.685.477,5807

Date

8

Dal primo gennaio 100 al 31 dicembre 9999

Object

4

Riferimento a un oggetto (vedere l’istruzione Set
nella guida in linea)

String (fissa)

Lunghezza

Fino a circa 64.000 caratteri

String (variabile)

10 + lunghezza

Fino a circa 2 bilioni di caratteri

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Numero
di byte

Intervallo

Variant
(con numeri)

16

Come per Double

Variant
(con caratteri)

22 + lunghezza

Come per String (variabile)

User-defined

Dipende dagli
elementi

Somma degli elementi costitutivi per il tipo di
dati personalizzati

Nome

Quando non si dichiara una variabile come tipo specifico, Access la assegna al tipo
di dati Variant. Questo tipo di dati è flessibile, dal momento che i tipi di dati Variant possono assumere sia valori numerici che di stringa. Il tipo di dati Variant può contenere tutti
i tipi di dati, a eccezione dei tipi definiti dall’utente (che sono un soprainsieme di tutti i tipi
di dati). Quando VBA esegue un’operazione su due Variant, deve prima recuperare i contenuti del secondo Variant e convertire il risultato nel sottotipo di dati del primo Variant.
Questo rende l’elaborazione dei Variant più lenta di quella di altri tipi di dati. Inoltre, il
sottotipo di dati restituito dall’operazione potrebbe non essere corretto per la propria applicazione.
È possibile utilizzare la funzione VarType per determinare il sottotipo di dati Variant.
La funzione VarType assume un tipo di dati Variant e restituisce una costante VBA che indica
il sottotipo del valore nel tipo di dati Variant. Ad esempio, se varMyVariable contiene “Hi,
there!”, VarType(varMyVariable) restituisce vbString (8). Allo stesso modo, se varMyVariable
contiene #1/1/2000#, VarType(varMyVariable) restituisce vbDate (7). Controllare la documentazione in linea o il Visualizzatore oggetti per ottenere un elenco completo delle costanti del sottotipo Variant, restituite dalla funzione VarType.
Le funzioni di conversione VBA consentono di convertire un tipo di dati Variant
in un sottotipo di dati determinato e di specificare il tipo di risultato che ci si aspetta.
Ad esempio, CDbl(varMyVariable) restituisce i contenuti di varMyVariable come tipo di
dati Double.
Nonostante la possibilità di errori e la necessità di un’elaborazione ulteriore,
Variant è un tipo di dati molto utilizzato. I dati nei campi tabella, query, report e maschere è Variant per impostazione predefinita. Se non si definisce un campo di una
tabella, il campo restituisce un valore Null quando si esegue una query (se non sono
stati assegnati dati), che è uno dei due valori di dati Variant particolari. Un valore Null
indica che i dati sono mancanti, sconosciuti o inapplicabili. Utilizzare la funzione IsNull
in VBA per effettuare il test di valori Null e l’operatore Is Null nelle istruzioni dei criteri delle query per eseguire lo stesso tipo di operazione in relazione a un campo. Fare
attenzione alla modalità di elaborazione delle variabili con valori Null, dal momento
che i Null si propagano. Combinazioni di variabili equivalenti a Null e di eventuali altre variabili restituiscono sempre un valore Null.

27

Programmare Microsoft Access 2000

NOTA: dal momento che i tipi di dati Variant possono assumere valori Null,
utilizzare questo tipo quando l’applicazione è in grado di sfruttarlo. I valori Null eliminano la necessità di valori arbitrari per la determinazione dei
dati mancanti da un campo o da un tipo di variabile.
La parola chiave Empty viene utilizzata come sottotipo di Variant e rappresenta un
valore di variabile non inizializzato. Utilizzare la funzione IsEmpty in VBA per determinare se una variabile presenta questo valore. Le stringhe Empty, Null, 0 e di lunghezza zero
(“”) sono diverse l’una dall’altra. Quando VBA trasforma una variabile Variant equivalente a Empty, trasforma la variabile in 0 o in “”, in relazione al fatto che sia più adeguato un
numero o una stringa.
Quando si devono richiamare le funzioni API di Windows mediante DLL, è talvolta necessaria una variabile definita dall’utente. È necessario dichiarare variabili definite dall’utente tra le istruzioni Type e End Type. Le righe singole tra queste due istruzioni devono
definire gli elementi di un tipo di variabile personalizzato. È possibile, ad esempio, pensare a un libro come a un insieme di elementi, inclusi un ISBN, un titolo, un autore, un editore e delle pagine. Il tipo di dati personalizzato viene specificato nel modo riportato di
seguito:
Type Book
    ISBN as Long
    Title as String
    Authors as String
    Publisher as String
    Pages as Integer
End Type
Sub MyBook
Dim udvMyBook as Book
    udvMyBook.ISBN = 1234567890
    udvMyBook.Title = “Programming Microsoft Access 2000”
    udvMyBook.Authors = “Rick Dobson”
    udvMyBook.Publisher = “Microsoft Press”
    udvMyBook.Pages = 550
End Sub

Inserire la coppia di istruzioni Type…End Type nell’area delle dichiarazioni generali
di un modulo. La procedura MyBook crea un’istanza della variabile Book definita dall’utente.

Dichiarazioni
Le variabili e le costanti possono essere dichiarate (una costante è una variabile speciale, il
cui valore non può essere modificato dopo l’impostazione mediante un’istruzione Constant).
Una dichiarazione ha due ruoli: designa l’area di validità di una variabile (l’area all’interno
dell’applicazione che può contenere riferimenti alla variabile) e specifica un tipo di dati per

28

Capitolo 1 Introduzione a Visual Basic, Applications Edition

la variabile. Questi sono motivi validi per dichiarare le variabili prima di utilizzarle. È possibile richiedere una dichiarazione di variabile mediante l’istruzione Option Explicit nell’area
Generale di un modulo.
Utilizzare l’istruzione Public in un’area Dichiarazione del modulo per dichiarare le
variabili che l’applicazione può utilizzare da qualsiasi procedura all’interno dell’applicazione, inclusi gli altri moduli. È possibile utilizzare l’istruzione Private per definire in modo
esplicito che una variabile dispone di un’area di validità locale all’interno di un modulo
(questo non viene richiesto in maniera rigorosa, dal momento che le istruzioni Dim e Static
dichiarano variabili private di un modulo per impostazione predefinita).
L’istruzione Dim conserva memoria per una variabile solo fino a quando la procedura in cui è stata dichiarata la variabile termina. Questo significa che le variabili dichiarate
mediante l’istruzione Dim perdono il valore da una chiamata della procedura all’altra. Le
variabili dichiarate mediante un’istruzione Static vengono preservate per il modulo o fino
a quando un’applicazione non reimposta o riavvia il modulo (le dichiarazioni di variabili
statiche possono essere utilizzate per eseguire somme o determinare il numero di volte in
cui viene richiamata una procedura).

NOTA: è possibile eliminare i valori dalle variabili statiche di una procedura, scegliendo Reset dal menu Run di VBE.

È possibile utilizzare la parola chiave Static nelle dichiarazioni di funzioni e procedure, così come nelle dichiarazioni di variabili. Questa parola chiave opera in maniera identica con le funzioni e con le procedure; protegge tutte le variabili locali nella funzione e nella
procedura per il modulo.
Utilizzare la parola chiave As con l’istruzione Dim o Static per specificare un tipo di
dati per una variabile. L’istruzione Dim intMyNumber As Integer dichiara che la variabile
intMyNumber è un tipo di dati con numeri interi.

Matrici
Access consente di dichiarare matrici. Le matrici sono variabili che contengono elenchi di
valori dello stesso tipo. Una matrice può essere a più dimensioni (fino a 60). Ad esempio,
l’istruzione Dim aryScores(2, 1) As Integer riserva una matrice bidimensionale di sei elementi: tre righe e due colonne di numeri interi.
Per impostazione predefinita, le matrici sono su base zero. L’istruzione Dim
aryMyName(1) presenta due elementi, a cui il codice può riferirsi come a aryMyName(0) e
aryMyName(1). Utilizzare l’istruzione Option Base 1 nell’area delle dichiarazioni per indicare
che una matrice è su base uno. La procedura che segue dichiara una matrice di due elementi,
ne definisce i valori e ne stampa gli elementi e la somma degli elementi nella Finestra Immediata.
Sub ArrayTest()
Dim aryMyExpenses(1) As Currency, Total As Currency
    aryMyExpenses(0) = 10.5
    aryMyExpenses(1) = 22.25

(continua)

29

Programmare Microsoft Access 2000

    Total = aryMyExpenses(0) + aryMyExpenses(1)
    Debug.Print aryMyExpenses(0) & “ + “ & aryMyExpenses(1) _
        & “ = “ & Total
End Sub

La matrice aryMyExpenses contiene due elementi del tipo di dati Currency. Dal momento che il tipo di dati Currency è a 8 byte, la matrice aryMyExpenses è a 16 byte. Poiché
è possibile utilizzare matrici con stringhe a più dimensioni e di lunghezza variabile, le matrici possono consumare rapidamente grossi blocchi di memoria.
Utilizzare le parole chiave Dim, Static, Public e Private come si fa con le variabili scalari
per definire l’area di validità di una matrice. Utilizzare la parola chiave ReDim per modificare dinamicamente le dimensioni di una matrice multidimensionale.

LOGICA CONDIZIONALE E CREAZIONI ITERATIVE
L’esecuzione condizionale e il ciclo del codice costituiscono il nucleo di numerose soluzioni
basate sul codice. VBA offre un’ampia scelta di opzioni per l’implementazione di questo
tipo di logica. Le sezioni che seguono riesaminano i tipi più importanti di istruzioni che consentono l’esecuzione condizionale e il ciclo dei programmi e forniscono esempi pratici.

If...Then
Molte procedure non consentono di raggiungere l’obiettivo elaborando righe di codice in
sequenza. È spesso auspicabile eseguire il codice in maniera condizionale, per ignorare alcune righe ed eseguirne altre. Una soluzione efficace per ottenere un’esecuzione condizionale delle procedure VBA consiste nell’utilizzo dell’istruzione If…Then. Attualmente
esistono tre varianti significative di quest’istruzione di base. La prima variante esegue in
maniera condizionale un semplice blocco di codice. La sintassi è la seguente
If condition Then
    ‘Statements
End If 

Una o più istruzioni possono risiedere all’interno di un blocco If…End If. La clausola terminale End If contrassegna la fine del blocco. VBA esegue le istruzioni all’interno
del blocco solo quando la condizione equivale a True. È possibile nidificare più blocchi
If…End If, l’uno all’interno dell’altro.
Una seconda variante dell’istruzione If…Then consente al codice di eseguire entrambi
i blocchi. La sintassi è la seguente:
If condition Then
    Statements1
Else
    Statements2
End If

30

Capitolo 1 Introduzione a Visual Basic, Applications Edition

La maschera dell’istruzione esegue uno dei due blocchi di codice. Quando la condizione è vera, vengono eseguite le istruzioni del primo gruppo. Altrimenti, vengono eseguite
le istruzioni del secondo gruppo.
Sebbene questa struttura sia più flessibile del primo formato, è, in ogni caso, limitata, dal momento che sono disponibili solo due opzioni. È possibile, infatti,
nidificare le istruzioni If…Then per attivare più opzioni ma VBA offre una terza struttura, che semplifica l’esecuzione di uno dei tre o più blocchi di istruzioni. La sintassi
è la seguente
If condition1 Then
    ‘Statements
ElseIf condition2 Then
    ‘Statements
Else
    ‘Statements
End If

La maschera dell’istruzione If…Then incorpora più condizioni e tre o più gruppi di
istruzioni. È possibile aggiungere nuovi gruppi di istruzioni e condizioni, inserendo nuove clausole ElseIf con le relative condizioni e istruzioni. La struttura è più efficace della seconda variante, non solo perché può organizzare più condizioni ma anche perché restringe
l’esecuzione di ciascun blocco di istruzioni (eccetto l’ultimo) al caso in cui ci sia una precisa corrispondenza con un test delle condizioni. La seconda istruzione If…Then esegue il secondo blocco di istruzioni ogni qual volta la condizione relativa al primo blocco di istruzioni
non è vera. Quando una mancata corrispondenza alla prima condizione non funge automaticamente da base di esecuzione del secondo blocco di istruzioni, è necessario il terzo
stile dell’istruzione If…Then.
Prendere in considerazione la maschera riportata nella figura 1-15. La maschera include una casella di testo, un gruppo di opzioni e un pulsante di comando. Il gruppo di
opzioni consente a un utente di designare l’elevazione al quadrato o al cubo del valore
numerico della casella di testo. Per calcolare il quadrato di un numero, digitare il numero
nella casella di testo, selezionare Square It nel gruppo di opzioni Compute Type e quindi
scegliere Compute.

Figura 1-15. Maschera per il calcolo dei quadrati e dei cubi di numeri.

31

Programmare Microsoft Access 2000

Il codice che segue illustra le due procedure che rendono possibile l’elevazione al
quadrato. La routine evento cmdComputer_Click risponde alla selezione. Se il gruppo di
opzioni (opgComputeType) equivale a 1, l’utente ha selezionato il pulsante di opzione Square
It. La procedura richiama MySquarer quando il gruppo di opzioni equivale a 1. In caso
contrario termina senza aver eseguito nessun calcolo.
Sub cmdComputer_Click()
    If opgComputeType = 1 Then
        MySquarer txtInput.Value
    End If
End Sub
Sub MySquarer(MyOtherNumber As Double)
    dblResult = MyOtherNumber * MyOtherNumber
    MsgBox dblResult, vbInformation, _
        “Programming Microsoft Access 2000”
End Sub

La procedura cmdComputer_Click utilizza la prima struttura If…Then. La procedura
esegue in maniera condizionale un solo blocco di istruzioni. In questo caso, il blocco consiste di una sola riga. Se l’utente seleziona Square It, MySquarer moltiplica il valore della
casella di testo per se stesso e riporta il risultato in una casella di testo.
Se l’utente seleziona Cube It, prima di premere il pulsante di comando, il codice non
esegue alcuna operazione. Il gruppo di opzioni restituisce un valore di 2 ma non esiste alcuna condizione per individuarlo. Infatti, non esistono alternative quando il gruppo di
opzioni equivale a 1. Il codice che segue mostra una nuova versione della routine evento
con il codice per gestire una situazione in cui l’utente non seleziona Square It.
Sub cmdComputer_Click()
    If opgComputeType = 1 Then
        MySquarer txtInput.Value
    Else
        MyCuber txtInput.Value
    End If
End Sub
Sub MyCuber(MyOtherNumber As Double)
Dim dblResult As Double
    dblResult = MyOtherNumber ^ 3
    MsgBox dblResult, vbInformation, _
        “Programming Microsoft Access 2000”
End Sub

La procedura cmdComputer_Click utilizza la seconda maschera dell’istruzione If…Then.
Richiama MySquarer se opgComputeType equivale a 1, altrimenti richiama MyCuber. Questa
operazione funziona correttamente se l’utente seleziona Cube It. Tuttavia, rimane almeno

32

Capitolo 1 Introduzione a Visual Basic, Applications Edition

un problema: la maschera si apre senza che vengano selezionati pulsanti di opzione. Se un
utente inserisce un numero nella casella di testo e quindi seleziona il pulsante di comando,
la maschera restituisce il valore al cubo del numero, nonostante l’utente non abbia selezionato alcun pulsante di opzione. L’errore è nella struttura dell’istruzione If…Then. È necessaria la terza variante con due condizioni distinte, una per l’elevazione al quadrato e l’altra
per quella al cubo. Il codice che segue illustra questa struttura:
Sub cmdComputer_Click()
    If opgComputeType = 1 Then
        MySquarer txtInput.Value
    ElseIf opgComputeType = 2 Then
        MyCuber txtInput.Value
    Else
        MsgBox “Click a computation type”, _
            vbCritical, _
            “Programming Microsoft Access 2000”
    End If
End Sub

L’esempio include due condizioni. Una verifica se il gruppo di opzioni equivale a 1
e l’altra se il gruppo di opzioni equivale a 2. Se il gruppo di opzioni non supera nessuno
dei due test, la procedura visualizza una finestra di messaggio che invita l’utente a selezionare un tipo di calcolo. Se si aggiungono nuovi pulsanti di opzione al gruppo di opzioni
per calcoli diversi, organizzarli è facile. Basta inserire una nuova clausola ElseIf con una
condizione particolare per ciascun pulsante.
Come risulta evidente, l’istruzione If…Then è molto flessibile. È possibile utilizzarla
per gestire numerose opzioni ma per uno o due elementi la gestione è ancora più semplice. La sintassi subisce una piccola modifica, a seconda di quale operazione si stia tentando
di eseguire.

Select Case
L’istruzione Select Case esegue una sola operazione: valuta un’espressione ed esegue in
maniera condizionale un blocco di istruzioni. Quando si opera con più di una o due
impostazioni condizionali, l’istruzione Select Case può risultare più semplice da impostare
e da gestire dell’istruzione If…Then. La sintassi generale per Select Case è la seguente
Select Case test expression
    Case expression list-1
        ‘Statements
    Case expression list-2
        ‘Statements
    Case Else
        ‘Statements
End Select

33

Programmare Microsoft Access 2000

Select Case valuta un’espressione di test iniziale. L’istruzione può risultare semplice
quando un parametro passato o complicata quanto un’espressione della scienza missilistica.
expression list-1 e expression list-2 sono intervalli (o valori specifici) per l’espressione di test.
Alcune opzioni per la specifica di elenchi di espressioni includono costanti, elementi delimitati in una serie o espressioni restituiscono True o False. Quando un elenco di espressioni è vero, in quanto corrisponde all’espressione di test, viene eseguito il blocco di istruzioni
corrispondente. L’esempio di sintassi riportato sopra mostra solo due elenchi ma è possibile aggiungerne altri, inserendo ulteriori istruzioni Case. La clausola Case Else è facoltativa
ma rappresenta un’ottima pratica di programmazione. Quest’opzione cattura qualsiasi valore delle espressioni di test, non intercettato dalle precedenti clausole Case. È possibile
nidificare le istruzioni Select Case l’una nell’altra; ogni istanza deve iniziare con Select Case e
terminare con End Select.
La figura 1-16 mostra un’istruzione Select Case utilizzata in una procedura mediante
funzioni. Questa procedura può eseguire una delle quattro operazioni numeriche su una
coppia di numeri passati alla procedura stessa. Un argomento stringa specifica l’operazione e il risultato viene visualizzato nella Finestra Immediata. Come risulta evidente dalla Finestra Immediata, nei test dell’elenco di espressioni non viene effettuata la distinzione tra
maiuscole e minuscole.
Un’operazione digitata in modo non corretto provoca l’intervento della clausola Case
Else. In questa situazione la funzione stampa un messaggio nella Finestra Immediata per
informare che l’operazione non è valida.

Figura 1-16. Procedura mediante funzioni e output che illustrano l’utilizzo dell’istruzione Select
Case.

34

Capitolo 1 Introduzione a Visual Basic, Applications Edition

For...Next
L’istruzione For…Next viene utilizzata per l’esecuzione di un ciclo in un blocco di istruzioni, un certo numero di volte. Dal momento che è possibile uscire da questo tipo di ciclo in maniera condizionale mediante l’istruzione Exit For, è possibile utilizzare anche
l’istruzione For…Next quando non si sa con certezza quante volte eseguirlo prima di bloccarlo. Tuttavia, è necessario specificare un numero massimo di cicli. La sintassi generale per
l’istruzione è la seguente
For counter = start To stop Step step
    ‘Statements
    If condition Then
        Exit For
    End If
    ‘Statements
Next counter

Il ciclo For si estende dalla riga For counter a quella Next counter. L’istruzione For…Next
inizializza counter sul valore di start e quindi esegue le istruzioni comprese tra For e Next. Il
flusso di esecuzione ritorna, quindi, all’inizio del ciclo For, in cui counter viene incrementato dal valore facoltativo step (se non è specificato step, counter viene incrementato di 1).
Le istruzioni del ciclo For vengono eseguite più volte fino a quando il valore di counter
non supera stop (o quando counter è più piccolo di stop, se step è un numero negativo). Il
controllo quindi passa all’istruzione immediatamente successiva a quella Next counter. L’istruzione facoltativa Exit For provoca l’interruzione del ciclo For, prima che counter superi stop.
È possibile nidificare le istruzioni For…Next; un ciclo interno passa il controllo a un
ciclo esterno quando counter supera stop. VBA può generare un errore di runtime, se incontra un’istruzione Next senza un’istruzione For corrispondente ma è probabile che si faccia
un errore di sintassi, quando si progettano le procedure.
La procedura CountFor (vedere in basso) applica la logica For…Next mentre potenzia le tecniche per operare con matrici e dichiarazioni Static (la matrice aryMyArray presenta cinque elementi. È importante ricordare che l’indice della matrice inizia da 0, a meno che
il codice non specifichi esplicitamente qualcosa di diverso). In seguito, il codice dichiara una
variabile Integer in modo che funga da contatore. L’istruzione For…Next assegna quindi i
valori 1–5 alla variabile contatore, intIndex.
Vengono eseguite due istruzioni per ogni passaggio del ciclo. Prima di tutto il valore di un elemento in aryMyArray accumula il valore corrente di intIndex sul suo valore corrente. Dal momento che il codice dichiara aryMyArray con un’istruzione Static, gli elementi
della matrice conservano i loro valori in successive esecuzioni nella procedura. Dopo il
primo passaggio nella procedura, gli elementi della matrice sono i valori successivi di intIndex.
Dopo il secondo passaggio attraverso la procedura, gli elementi aryMyArray corrispondono a due volte i valori successivi di intIndex, così via per ogni ulteriore passaggio. La seconda istruzione stampa il valore corrente di intIndex e l’elemento associato della matrice.
Ricordare che è possibile inizializzare nuovamente il valore degli elementi della matrice su
0, scegliendo Run-Reset dal menu Run di VBE.

35

Programmare Microsoft Access 2000

Sub CountFor()
Static aryMyArray(4) As Integer
Dim intIndex As Integer
    For intIndex = 1 To 5
        aryMyArray(intIndex - 1) = _
            aryMyArray(intIndex - 1) + intIndex
        Debug.Print intIndex, aryMyArray(intIndex - 1)
    Next intIndex
    Debug.Print vbLf
End Sub

La figura 1-17 mostra l’output della Finestra Immediata per le tre successive esecuzioni della procedura. La prima colonna mostra i valori successivi di intIndex e la seconda
i valori corrispondenti degli elementi della matrice. Durante la prima esecuzione della procedura, gli elementi della matrice corrispondono esattamente a intIndex. Durante il secondo e il terzo passaggio, i valori degli elementi della matrice corrispondono a due volte i valori
di intIndex. Questo risultato cumulativo illustra l’impatto di una dichiarazione di variabile
Static. I valori intIndex e aryMyArray corrispondono esattamente l’uno all’altro durante tutti i passaggi della procedura se si modifica la parola chiave Static nella dichiarazione
aryMyArray su Dim.

Figura 1-17. Visualizzazione del risultato dell’esecuzione della procedura CountFor tre volte in
successionenellaFinestraImmediata.

36

Capitolo 1 Introduzione a Visual Basic, Applications Edition

For Each...Next e With...End With
Le istruzioni For Each…Next e With…End With possono essere integrate per la convalida
dei dati delle maschere e per le classiche attività di enumerazione. For Each…Next viene
iterata mediante un insieme (come i controlli di una maschera) o una matrice. Non è necessario che l’applicazione riconosca il numero degli elementi di un insieme o di una matrice. L’istruzione With…End With può fare da complemento a For Each…Next,
semplificando la modalità di codifica di più controlli in un blocco di istruzioni.
L’istruzione For Each…Next è simile ma leggermente meno complessa dell’istruzione
For…Next. La somiglianza con For…Next consiste nel fatto che il ciclo inizia con una riga
che inizia con For e termina con una riga che inizia con Next. Tuttavia, il progetto delle righe
For e Next è diverso per entrambe le versioni del ciclo For. L’istruzione For Each…Next è
meno complessa dell’istruzione For…Next in quanto non è necessario rilevare tre distinti
parametri (counter, start e stop) o preoccuparsi dell’utilizzo di un valore step positivo o negativo. L’istruzione For Each…Next viene avviata sempre all’inizio di un insieme o di elementi
di una matrice e continua fino a quando non ne raggiunge la fine. La sintassi generale relativa all’istruzione è la seguente
For Each element In group
    ‘Statements
    If condition Then
        Exit For
    End If
    ‘Statements
Next element

Il termine group, nella prima riga dell’istruzione For Each…Next, si riferisce al nome
dell’insieme o della matrice. Element, nella prima e nell’ultima riga designa oggetti singoli
di un insieme o elementi di una matrice.
L’istruzione For Each…Next esegue la ripetizione delle istruzioni al suo interno per ciascun elemento dell’insieme o della matrice specificata. Spesso è necessario posizionare Exit For
o un’altra istruzione eseguita in maniera condizionale in qualche punto del ciclo For. Questo
consente al codice di rispondere dinamicamente a un risultato particolare nel suo ambiente. Il
test di condizione identifica questo risultato particolare e Exit For o altre istruzioni eseguite in
maniera condizionale si attivano solo quando si realizza questo risultato.
Come con l’istruzione For…Next, le istruzioni For Each…Next possono nidificare
l’una nell’altra. Alla fine di un loop For Each…Next, il controllo passa alla prima istruzione
che segue il loop.
L’istruzione With…End With semplifica il riferimento di diverse proprietà o metodi
dello stesso oggetto. Si specifica l’oggetto alle cui proprietà o metodi si desidera fare riferimento all’inizio della riga With e si chiude il riferimento all’oggetto con la riga End With

37

Programmare Microsoft Access 2000

al termine del blocco. Tra le righe With e End With è possibile accedere alle proprietà o ai
metodi dell’oggetto senza specificare il nome dell’oggetto. Il codice che segue mostra la
sintassi generale dell’istruzione With…End With:
With object
    .propertyname1 = “new value1”
    .propertyname2 = “new value 2”
    .method1
    .method2
End With

object è il nome di un oggetto, un riferimento a un oggetto o un nome di matrice.
propertyname1 e propertyname2 sono proprietà dell’oggetto e method1 e method2 sono metodi
dell’oggetto. Come risulta evidente, l’istruzione With…End With semplifica l’accesso alle
proprietà e ai metodi di un oggetto.
Le figure 1-18, 1-19 e 1-20 mostrano una maschera di convalida di dati in azione.
Sebbene la maschera disponga solo di una coppia di caselle di testo che richiedono una
convalida, il codice della maschera utilizza un ciclo For Each…Next che può essere esteso
per adeguarsi a più controlli di caselle di testo. È possibile effettuare una leggera modifica
per includere altri tipi di controlli nella procedura di convalida. La figura 1-18 mostra il layout
della maschera Input di base con una coppia di caselle di testo e un pulsante di comando.
Selezionando il pulsante di comando Do It! si richiama una routine evento che controlla le caselle di testo per assicurarsi che non contengano valori Null. Se entrambi i controlli contengono un valore Null, la routine evento visualizza una finestra di messaggio che
comunica all’utente di inserire informazioni in entrambe le caselle di testo.
La routine evento richiama anche una procedura che trasforma da bianco in giallo
lo sfondo di ogni casella di testo che contenga un Null. La procedura quindi sposta l’attivazione all’ultima casella di testo che contenga un Null. Lo sfondo resta giallo fino a quando
l’utente non aggiorna i dati della casella di testo.
La figura 1-19 mostra una casella di testo che conteneva un Null ma che attualmente contiene 1. Lo sfondo della casella di testo ritorna ad essere bianco non appena l’utente
inserisce informazioni e sposta l’attivazione fuori dalla casella di testo. La figura 1-20 mostra la maschera dopo che il nuovo valore ha aggiornato il valore della casella di testo.
La seguente coppia di procedure, definita cmdSubmit_Click e MarkFieldsToEdit,
esamina le caselle di testo ed evidenzia in giallo tutte le caselle di testo che contengono un Null. La routine evento Click relativa al pulsante di comando continua ad operare attraverso tutti i controlli della maschera, inclusi i controlli delle caselle di testo e
altri controlli. La routine evento utilizza una parola chiave TypeOf per individuare quale
controllo corrisponda a una casella di testo. Un errore di misurazione può avere come
conseguenza un errore di runtime, dal momento che non tutti i controlli dispongono
di una proprietà Value. Se la procedura mediante eventi individua un controllo di casella di testo, esamina la proprietà del controllo Value per stabilire se contenga o meno
un valore Null. Eventuali controlli con un valore Null attivano il codice all’interno

38

Capitolo 1 Introduzione a Visual Basic, Applications Edition

dell’istruzione If…Then. Questo codice visualizza una finestra di messaggio e richiama la procedura per evidenziare il controllo con la voce mancante.

Figura 1-18. Risultato della selezione del pulsante di comando Do It! quando almeno una casella
di testo contiene un valore Null.

Figura 1-19. Casella di testo evidenziata in giallo che conteneva un Null e attualmente contiene 1.

Figura 1-20. Dopo che l’utente ha inserito le informazioni e spostato l’attivazione, il colore di sfondodellacaselladitestovienereimpostatosulbianco.

39

Programmare Microsoft Access 2000

Private Sub cmdSubmit_Click()
‘Check for valid entries.
    For Each ctl In Screen.ActiveForm.Controls
        If TypeOf ctl Is TextBox Then
            If IsNull(ctl.Value) Then
                MsgBox “Please enter information “ _
                    & “in both input boxes.”, _
                    vbInformation, _
                    “Programming Microsoft Access 2000”
                MarkFieldsToEdit
                Exit For
            End If
        End If
    Next ctl
End Sub
Public Sub MarkFieldsToEdit()
    For Each ctl In Screen.ActiveForm.Controls
        If TypeOf ctl Is TextBox Then
            If IsNull(ctl.Value) Then
                With ctl
                    .BackColor = RGB(255, 255, 0)
                    .SetFocus
                End With
            End If
        End If
    Next ctl
End Sub

La procedura MarkFieldsToEdit utilizza anche la parola chiave TypeOf per identificare le caselle di testo. Quando individua una casella di testo che contiene un valore Null, utilizza un’istruzione With…End With per modificare il colore di sfondo del controllo e sposta
l’attivazione al controllo. Questo garantisce che l’ultima casella di testo che contiene Null
sia attivata al termine della procedura.
Ciascuna routine evento del codice riportato in basso si attiva sull’evento AfterUpdate.
Le procedure utilizzano un blocco With…End With per modificare il colore di sfondo del
controllo associato e riportarlo al bianco se il colore di sfondo è giallo. L’evento AfterUpdate
si verifica indipendentemente per entrambe le caselle di testo ma il codice di ciascuna procedura è identico, fatta eccezione per il nome dell’oggetto associato (txtInput1 o txtInput2).
Private Sub txtInput1_AfterUpdate()
    With txtInput1
        If .BackColor = RGB(255, 255, 0) Then
            .BackColor = RGB(255, 255, 255)
        End If
    End With
End Sub

40

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Private Sub txtInput2_AfterUpdate()
    With txtInput2
        If .BackColor = RGB(255, 255, 0) Then
            .BackColor = RGB(255, 255, 255)
        End If
    End With
End Sub

Do...Loop
L’istruzione Do…Loop è un’altra variante dell’istruzione di ciclo disponibile con VBA.
L’istruzione Do…Loop costituisce un’alternativa più flessibile rispetto all’istruzione
While…Wend, presenta tutte le funzionalità dell’istruzione While…Wend se non altre. VBA
conserva While…Wend per la compatibilità retroattiva.
È possibile utilizzare un ciclo Do per eseguire a ripetizione un gruppo di istruzioni
fino a quando una condizione non venga ritenuta True o False. La sintassi dell’istruzione
Do…Loop supporta esplicitamente l’esecuzione di un test di una condizione prima di eseguire un blocco di istruzioni o immediatamente dopo. Come con le altre istruzioni di ciclo, esiste anche un’istruzione particolare per uscire da un blocco in piena esecuzione. Le
due varianti della sintassi per l’istruzione Do…Loop sono le seguenti:
Do {While | Until} condition
    ‘Statements
    If condition Then
        Exit Do
    End If
    ‘Statements
Loop

And:
Do
    ‘Statements
    If condition Then
        Exit Do
    End If
    ‘Statements
Loop {While | Until} condition

La prima variazione esegue la valutazione delle condizioni prima di eseguire le istruzioni nel ciclo. L’altro formato valuta la condizione immediatamente dopo l’esecuzione delle
istruzioni. Il test delle condizioni può utilizzare una parola chiave While o una parola chiave Until. La parola chiave While fa in modo che il ciclo continui l’esecuzione fino a quando
la condizione risulti vera; la parola chiave Until fa sì che il ciclo continui l’esecuzione
fino a quando la condizione risulta falsa. Molti sviluppatori esperti di Access hanno
scritto numerosi cicli Do per passare da un record all’altro di un set di record, fino
all’individuazione di una riga di fine file (EOF) o di inizio file (BOF). Come con le altre

41

Programmare Microsoft Access 2000

istruzioni di ciclo VBA, è possibile uscire dai cicli Do al centro di un blocco di istruzioni
mediante l’istruzione Exit Do.
La figura 1-21 mostra una coppia di procedure mediante funzioni e il relativo output,
per illustrare le modalità di programmazione dei cicli Do. La funzione DaysToNextMonth
accetta una data e restituisce il numero di giorni da quella data al primo del mese successivo. Se si inserisce la data corrente, la procedura la considera uno dei giorni prima dell’inizio del mese successivo. Ad esempio, sono due i giorni (28/2/2000 e 29/2/2000) tra il 28/
2/2000 al primo giorno del mese successivo. La funzione inizia calcolando dtmNextMonth,
che corrisponde alla data di input più un mese (nell’esempio della figura 1-21, la data è 28/
3/2000). La procedura, quindi, imposta il nome della funzione, che funge da variabile contatore come equivalente a 0. La terza riga avvia un ciclo Do con una condizione che esegue
il test della non corrispondenza del mese successivo rispetto alla data di input più la quantità contenuta nel nome della funzione. Nella misura in cui non corrispondono, il ciclo
esegue il blocco, che consiste in un’istruzione che incrementa il valore della funzione di 1.

Figura 1-21. Coppia di procedure mediante funzioni che utilizzano i test delle condizioni all’inizio
e alla fine di un ciclo Do.

La funzione DaysFromFirstOfLastMonth mostra l’effetto di un test delle condizioni alla fine
di un ciclo Do. L’output mostra il numero di giorni tra il 28/2/2000 e il primo giorno del mese
precedente (1/1/2000). Il risultato corrisponde a 58 giorni, sommando i 28 giorni di febbraio
e i 30 giorni di gennaio. La funzione inizia calcolando il mese precedente per la data specifica.
Quindi passa quel mese alla funzione DateValue per stabilire il primo giorno del mese precedente.

42

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Proprio prima di avviare il ciclo Do, il codice imposta DaysFromFirstOfLastMonth su 0. Il codice
inserisce il ciclo senza un test delle condizioni e incrementa DaysFromFirstOfLastMonth di 1. Il
test delle condizioni sulla riga Loop consente un altro passaggio attraverso il ciclo, in quanto la
data di input meno DaysFromFirstOfLastMonth è anteriore al primo giorno del mese precedente.
In questo modo, la funzione conta 58 giorni dalla data di input al primo giorno, non incluso,
del mese precedente.

FUNZIONI INCORPORATE
Come dimostrano gli esempi precedenti, Access 2000 dispone di una libreria piuttosto ricca
di funzioni incorporate, che consentono di velocizzare lo sviluppo di soluzioni
personalizzate, riducendo al minimo e semplificando il codice personalizzato iniziale che
è necessario preparare. È possibile utilizzare funzioni incorporate esattamente come si
utilizzano le proprie funzioni personalizzate, in procedure, query, maschere e report. Acquistando dimestichezza con i possibili utilizzi delle funzioni incorporate, è possibile scoprire modalità innovative di applicazione delle proprie funzioni personalizzate.
Questa sezione include tre esempi che utilizzano funzioni incorporate: una per una
query, una per una maschera e una per un report. È possibile far convergere tutti e tre gli
approcci nell’applicazione. Il terzo esempio illustra come fare in modo che un controllo su
un report agisca come un’origine per il codice VBA in un modulo di report, servendosi di
funzioni incorporate. Tutti e tre gli esempi operano con una piccola tabella di fattura e illustrano i modi per creare report su fatture scadute.
La figura 1-22 riporta la tabella originale InvoiceDates, sulla parte sinistra e una query
che mostra una visualizzazione della tabella sulla destra. La query seleziona 2 delle 10 righe della tabella InvoiceDates e calcola una nuova colonna definita Past Due Days (la data della
finestra sullo schermo è 12/9/98).

Figura 1-22. Tabella InvoiceDates e risultati di una query che seleziona righe e calcola nuovi
campiconfunzioniincorporate.

43

Programmare Microsoft Access 2000

È possibile individuare la data corrente utilizzando due funzioni incorporate: la funzione Date e quella Now (il valore restituito dalla funzione Now include anche l’ora corrente. Se si sta lavorando solo con le date, non importa quale delle due funzioni si utilizza).
La query include entrambe le colonne della tabella originale InvoiceDates. Il criterio per
la colonna InvoiceDate è <Date()-30. Dal momento che la data corrente al momento della
query è 12/9/98, ogni fattura che preceda il 13/8/98 è scaduta. Quindi, la query restituisce le fatture dal 1/7/98 al 15/6/98.
Past Due Days merita una propria colonna. Il campo calcolato utilizza una coppia di
funzioni data incorporate: DateDiff e Now. La funzione DateDiff è ideale per il calcolo della differenza tra due date. È possibile specificare la differenza in termini di giorni, mesi, trimestri, anni e altre unità di tempo. La funzione DateDiff relativa alla colonna Past Due Days
restituisce la differenza in giorni. L’espressione che calcola il campo è DateDiff(“d”,
[InvoiceDate]+30,Now()). Quest’espressione determina la data corrente mediante la funzione Now (sebbene la funzione Date opererebbe altrettanto bene). Il termine [InvoiceDate] si
riferisce alla tabella, che agisce come un’origine di record per la query. +30 designa il periodo di tempo in cui una fattura non è considerata in ritardo.
La query consente di produrre alcuni risultati utili ma presenta degli svantaggi. Uno
svantaggio immediato è costituito dal fatto che la visualizzazione Foglio dati non riporta
la data corrente. Quindi, ci si può chiedere quale sia la base per il calcolo dei conti scaduti.
L’oggetto della maschera frmPastDueEvaluator della figura 1-23 risolve il problema presentando una visualizzazione Maschera con una descrizione più dettagliata dei dati. In questa
visualizzazione, tre campi della maschera forniscono informazioni strategiche. Il campo
Invoice Date mostra la data di creazione della fattura. Il campo successivo mostra la data
corrente. Il terzo campo calcola il numero di giorni per cui una fattura è considerata scaduta. Nel campo è visualizzato uno 0 se la data di emissione della fattura è anteriore o corrispondente a un intervallo di 30 giorni.

Figura 1-23. Maschera per il calcolo dei giorni per cui le fatture risultano scadute.

Gli ultimi due campi della maschera utilizzano funzioni incorporate per il calcolo dei
valori. Il campo Today’s Date utilizza Date. In questo caso, Date è più adeguata di Now, per-

44

Capitolo 1 Introduzione a Visual Basic, Applications Edition

ché Now fa in modo che vengano riportate la data e l’ora, a meno che il campo non venga
esplicitamente formattato. Se si imposta la proprietà del campo Control Source su =Date(),
non è necessaria alcuna formattazione. Il campo Days Late utilizza una funzione IIF (Immediate If). Con questa funzione le espressioni vengono elaborate secondo modalità che gli
sviluppatori del precedente foglio di calcolo troveranno molto naturali. Ad esempio, l’espressione relativa all’ultimo campo della maschera è IIF(Date()-[txtInvoiceDate]>30,Date()[txtInvoiceDate]-30,0). L’espressione presenta tre argomenti, come la funzione If del foglio
di calcolo. Il primo argomento viene considerato True o False; si tratta di una condizione.
Se la condizione è vera, la funzione IIF restituisce il valore del secondo argomento; se la
condizione è falsa, la funzione IIF restituisce il valore del terzo argomento. Quindi, se la
data della casella di testo con la data della fattura, txtInvoiceDate, corrisponde a più di 30 giorni
dalla data corrente, la funzione IIF restituisce il numero di giorni per cui la fattura supera
il periodo di dilazione di 30 giorni. Altrimenti, la funzione IIF restituisce 0.
Il report della figura 1-24 mostra un altro approccio per riepilogare i conti scaduti.
Il report include tre colonne. L’ultima colonna è una colonna calcolata che conta il numero di giorni per cui una fattura risulta scaduta. Per ogni fattura data, la colonna è vuota se
la fattura non è scaduta. L’intestazione del report ricorda all’utente la data del report, in
modo tale che l’utente sappia quale data definisce la scadenza della fattura.

Figura 1-24. Report che mostra in maniera condizionale il numero di giorni per cui una fattura
risultascaduta.Selafatturaèinferioreougualea30giorni,l’ultimacolonnaèvuota.

45

Programmare Microsoft Access 2000

Per calcolare l’ultima colonna del report viene utilizzata una formula. Si deve poter
scrivere la formula sulla base dei due esempi precedenti. Quello che rende il report speciale è il fatto che l’ultima colonna possa essere vuota. La routine evento OnFormat, relativa
alla sezione della maschera Dettagli, rende possibile tutto ciò, manipolando in maniera condizionale, in fase di esecuzione, la proprietà Visible del controllo relativo all’ultima colonna del report. La logica della routine evento è la seguente:
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
Dim ctlD As Control
    For Each ctlD In Me.Detail.Controls
        If ctlD.Name = “txtPastDueDays” Then
            If ctlD.Value >= 0 Then
                ctlD.Visible = True
            Else
                ctlD.Visible = False
            End If
        End If
    Next ctlD
End Sub

La routine evento utilizza un’istruzione For Each…Next per eseguire il ciclo dei controlli per ciascun record, ricercando la casella di testo txtPastDueDays. Questa casella di testo
contiene il numero di giorni per cui una fattura è considerata scaduta. Se la quantità è positiva, la fattura è scaduta e il codice imposta la proprietà Visible del controllo su true. Altrimenti, la fattura non è scaduta e il codice imposta la proprietà Visible del controllo su false.
Queste poche righe di codice generano la formattazione del report flessibile, in fase di esecuzione.

Riepilogo delle funzioni selezionate
Access 2000 dispone di più di 170 funzioni incorporate che eseguono una vasta gamma di
attività, inclusa la conversione da un tipo di dati a un altro, l’elaborazione della data e dell’ora, l’analisi statistica del contenuto di tabelle e query, operazioni matematiche ed elaborazione di testi. Per conoscere a fondo le funzioni è consigliabile innanzitutto conoscere le
operazioni che queste consentono di eseguire. La conoscenza delle funzioni impedisce di
scrivere codici nuovi per attività per cui Microsoft ha già elaborato codici. In secondo luogo, è possibile decifrare come le funzioni si completino le une con le altre. È possibile,
inoltre, apprendere le caratteristiche dei valori restituiti. Ad esempio, la funzione Hex restituisce una stringa che rappresenta l’equivalente esadecimale di un numero decimale e la
funzione Oct esegue una conversione simile verso una rappresentazione ottale. L’output di
entrambe le funzioni è adeguato per la concatenazione e la comparazione di stringhe ma
non per le operazioni aritmetiche.
È possibile, inoltre, esaminare l’impatto degli argomenti facoltativi di una funzione
sul valore restituito dalla funzione stessa. Un errore nella comprensione di questi argomenti

46

Capitolo 1 Introduzione a Visual Basic, Applications Edition

può, talvolta, portare a risultati fuorvianti o confusi. Ad esempio, la funzione StrComp compara due stringhe. I primi due argomenti corrispondono alle stringhe da comparare. Un terzo
argomento facoltativo specifica il tipo di comparazione che deve essere eseguita sulle stringhe. È possibile specificare una comparazione senza distinzione tra maiuscole e minuscole,
una con distinzione tra maiuscole e minuscole o una alternativa basata sull’opzione Ordinamento
nuovi database della pagina Generale della finestra di dialogo Opzioni di Access 2000. Se non
si specifica questa comparazione facoltativa, la funzione ritorna al metodo di comparazione
specificato dall’istruzione Option Compare, nell’area delle dichiarazioni di un modulo (se non è
specificato alcun metodo, Access utilizza una comparazione binaria).
La tabella che segue illustra una selezione di categorie di funzioni e descrive lo scopo delle funzioni selezionate in ciascuna categoria. Esistono più categorie di quelle riportate nella tabella e, di norma, esistono più funzioni in ciascuna categoria. Ogni
categorizzazione è arbitraria, dal momento che molte funzioni possono rientrare in più di
una categoria. Ad esempio, la funzione DateSerial elabora le date, restituendo numeri di date
seriali, sulla base di argomenti diversi dalla data e dall’ora ma può anche convertire le date
delle stringhe in numeri seriali., quindi rientra sia nella categoria data/ora che in quella
conversione.

CATEGORIE DI FUNZIONI SELEZIONATE
Categoria
della funzione

Funzioni
rappresentative

Conversione

CDbl, CSng, CInt,
CCur, CDec, Str, Val,
Hex, Oct

Determinazione del tipo di
operazione aritmetica che
un’espressione esegue
e conversione tra tipi di dati

Data/ora

Date, Now, DateAdd,
DatePart, DateDiff,
Year, Month, Day,
Hour,Minute,Second,
Weekday, DateValue,
DateSerial, MonthName,
WeekdayName,
FormatDateTime

Espressione, calcolo ed estrazione
dei valori di data e di ora
dai numeri seriali delle date
e rappresentazioni delle stringhe di
date e ore

Aggregazione di
domini

DLookup, DCount,
DSum, DAvg, DVar

Calcolo dei risultati statistici, come
il conteggio relativo a un dominio
(come una tabella o una query)

Gestione degli
errori

Error, CVErr, IsError

Trap degli errori e codici di errore
personalizzati

Scopo

(continua)

47

Programmare Microsoft Access 2000

Categorie di funzioni selezionate continua

Categoria
della funzione

Funzioni
rappresentative

Verifica

IsDate, IsTime,
IsNumeric, IsNull,
IsEmpty,VarType

Organizzazione programmatica
dei tipi di dati

Matematica

Rnd, Sqr, Exp, Log,
Sin, Cos, Tan

Esecuzione di calcoli
matematici

Messaggi

MsgBox, InputBox

Inoltro di messaggi e ricezione
di input dalla tastiera

Testo

Left, Right, Mid, Trim,
UCase, LCaseStrReverse,
Replace, InStr,
InStrReverse

Elaborazione di stringhe

Varie

Sum, Count, RGB,
FV, NPV, CreateObject,
GetObject, SysCmd

Aggregazione di risultati statistici,
impostazione proprietà colore,
calcolo-risultati finanziari, creazione
o individuazione di riferimenti a
oggetti ActiveX, presentazione di
misuratori avanzamento e altro

Scopo

Queste funzioni eseguono diverse attività. Le funzioni di stringa possono estrarre,
trasformare e troncare le parti di una stringa di testo che si desidera eliminare ma è anche
possibile utilizzare funzioni incorporate per calcolare risultati finanziari o valori matematici. Le funzioni di verifica sono utili per determinare i tipi di dati prima di iniziare a calcolare espressioni. Un ampio utilizzo di queste funzioni e delle funzioni di conversione
consente al codice di evitare errori di non corrispondenza dei tipi di dati (l’elaborazione degli
errori è una parte fondamentale di qualsiasi soluzione completa. Senza di essa, le soluzioni
non possono intercettare errori di runtime o visualizzare errori di runtime personalizzati).
Le funzioni di aggregazione di domini non sono molto veloci ma possono sostituire un’intera query o un’istruzione SQL ancora più complessa. Ad esempio, le applicazioni possono utilizzare le funzioni di aggregazione di domini nelle procedure VBA, così come in query
e in maschere. Le funzioni di aggregazione SQL, come Count e Sum, possono generare risultati statistici per le origini di record. Queste funzioni però non sono applicabili quanto
le funzioni di aggregazione di domini. Ad esempio, non è possibile utilizzarle nelle procedure VBA.
La figura 1-25 mostra una procedura e la Finestra Immediata per illustrare il comportamento della funzione Hex. La procedura, inizialmente, trasforma entrambi gli argomenti in stringhe esadecimali e quindi stampa i risultati nella Finestra Immediata.

48

Capitolo 1 Introduzione a Visual Basic, Applications Edition

Figura 1-25. Procedura di verifica della funzione Hex.

La stringa restituita dalla funzione Hex non è adeguata per i calcoli aritmetici. La
funzione hextest va oltre, eseguendo calcoli aritmetici con argomenti decimali e quindi trasformando il risultato con la funzione Hex. Le righe successive della procedura illustrano
questo tipo di approccio. Le righe aggiungono firstarg e secondarg e salvano il risultato in newarg.
Quindi la procedura trasforma newarg in una stringa esadecimale e la memorizza in newhex.
La procedura stampa newarg e newhex nella Finestra Immediata.
L’ultima trasformazione in hextest converte il decimale 90 nell’equivalente esadecimale
5A. Le righe di commento che precedono la trasformazione indicano che 90 corrisponde
a 5 × 16 + 10.
L’ultima coppia di righe nella Finestra Immediata mostra che la funzione Hex restituisce valori di stringa. Di fatto, Hex restituisce un tipo di dati Variant ma il sottotipo di
Variant è una stringa. L’operazione aritmetica esadecimale 16 + esadecimale 16 deve avere
come risultato esadecimale 20. Tuttavia, la Finestra Immediata restituisce 1010. Questo
dimostra che il segno + nella riga newarg = firstarg + secondarg esegue una concatenazione di
stringhe e non una somma numerica.
È sempre opportuno ricercare tecniche che riducano al minimo i tempi di elaborazione. Questo è particolarmente importante per soluzioni che siano state utilizzate a lungo o che eseguano attività di particolare importanza per l’azienda. La figura 1-26 della
pagina seguente illustra una procedura che può servire da base per la temporizzazione
dell’esecuzione del codici. La procedura calcola l’intervallo di tempo necessario per
eseguire un ciclo un numero stabilito di volte. È possibile estendere questo progetto
di base per comparare il tempo necessario per eseguire un’attività a due diverse soluzioni di codificazione. Come risulta evidente dalla Finestra Immediata, un blocco di codi-

49


Documenti correlati


Documento PDF cap 1
Documento PDF teosofismo
Documento PDF vera storia abramo
Documento PDF tutti in classe a legambiente 2012
Documento PDF alf da fre
Documento PDF prof cinquegrana digiuno contro cancro


Parole chiave correlate