Risoluzione dei conflitti di nome

Gli errori di conflitto di nome vengono generati quando si cerca di creare o utilizzare un identificatore che è stato precedentemente definito. In alcuni casi, i conflitti di nome generano errori quali "Rilevato nome non univoco" o "Dichiarazione doppia nell'area di validità corrente". I conflitti di nome possono anche non essere rilevati e generare errori e quindi risultati non corretti nel codice, in particolare se tutte le variabili non vengono dichiarate in modo esplicito prima dell'utilizzo.

La maggior parte dei conflitti di nome può essere evitata grazie a una più approfondita comprensione delle caratteristiche relative all'area di validità degli identificatori di dati, oggetti e routine. In Visual Basic sono disponibili tre livelli di validità, ovvero a livello di routine, a livello di modulo privato e a livello di modulo pubblico.

Un conflitto di nome può verificarsi se un identificatore:

•	È visibile a più di un livello di validità.

•	Ha due significati diversi nel medesimo livello.

Le routine incluse in moduli diversi possono avere, ad esempio, lo stesso nome. Una routine denominata MySub può essere definita nei moduli denominati Mod1 e Mod2. Non si verificano conflitti se le routine vengono chiamate solo dai corrispondenti moduli. È possibile, tuttavia, che venga generato un errore se la routine MySub viene chiamata da un terzo modulo e non viene fornita alcuna qualificazione per distinguerla dall'altra routine MySub.

La maggior parte dei conflitti di nome può essere risolta anteponendo un qualificatore al nome. Tale qualificatore è costituito in genere dal nome del modulo e, se necessario, dal nome del progetto. Ad esempio:

YourProject.YourModule.YourSub MyProject.MyModule.MyVar

Il codice dell'esempio precedente chiama la routine Sub denominata YourSub e passa MyVar come argomento. È possibile utilizzare una qualsiasi combinazione di qualificatori per distinguere identificatori identici.

In Visual Basic, ogni riferimento a un identificatore viene abbinato alla dichiarazione "più vicina" di un identificatore corrispondente. Se MyID, ad esempio, viene dichiarata Public in due moduli di un progetto (Mod1 e Mod2), è possibile specificare dal modulo Mod2 l'identificatore MyID dichiarato nel modulo Mod2 senza qualificarlo, ma è necessario qualificarlo come Mod2.MyID per specificarlo in Mod1. Ciò è vero anche se Mod2 è incluso in un progetto diverso, purché sia un progetto con riferimento diretto. Se invece Mod2 è incluso in un progetto con riferimento indiretto, ovvero in un progetto a cui viene fatto riferimento dal progetto con riferimento diretto, i riferimenti alla variabile Mod2 denominata MyID dovranno essere sempre qualificati con il nome del progetto. Se si fa riferimento a MyID da un terzo modulo con riferimento diretto, l'abbinamento verrà eseguito in base alla prima dichiarazione trovata cercando:

•	Nei progetti con riferimento diretto, nell'ordine in cui appaiono nella finestra di dialogo Riferimenti del menu Strumenti.

•	Nei moduli di ciascun progetto. Si noti che i moduli del progetto non vengono analizzati in un ordine specifico.

Non è possibile riutilizzare i nomi degli oggetti delle applicazioni host, ad esempio R1C1 in Microsoft Excel, a diversi livelli di validità.

Suggerimento   Tra gli errori più comuni generati da conflitti di nome è possibile includere la non univocità dei nomi, le dichiarazioni doppie, gli identificatori non dichiarati e l'impossibilità di trovare routine. Se ciascun modulo viene iniziato con l'istruzione Option Explicit, verrà forzata la dichiarazione esplicita delle variabili prima del loro utilizzo e sarà quindi possibile evitare conflitti di nome ed errori collegati agli identificatori.


Chiamata di routine con lo stesso nome

È possibile chiamare una routine che si trova in un qualsiasi modulo dello stesso progetto del modulo attivo esattamente come si chiama una routine nel modulo attivo. Se, tuttavia, due o più moduli contengono una routine con lo stesso nome, è necessario specificare un nome di modulo nell'istruzione di chiamata, come è illustrato nell'esempio seguente:

Sub Main()

Module1.MyProcedure

End Sub

Se a due routine differenti incluse in due progetti diversi viene assegnato lo stesso nome, quando si effettua una chiamata alla routine è necessario specificare un nome di progetto. Nell'esempio seguente è illustrata la routine che richiama la routine Main nel modulo MyModule del progetto MyProject.vbp.

Sub Main()

[MyProject.vbp].[MyModule].Main

End Sub

Nota   Il nome di un progetto varia a seconda dell'applicazione. Ad esempio, in Microsoft Access un progetto è un database (.mdb); in Microsoft Excel, un progetto è una cartella di lavoro (.xls).

Suggerimenti per la chiamata di routine

•	Se un modulo o un progetto viene rinominato, accertarsi che il relativo nome venga modificato in tutte le istruzioni di chiamata in cui compare, altrimenti non sarà possibile trovare la routine chiamata. Per trovare e sostituire testo in un modulo, è possibile utilizzare il comando Sostituisci del menu Modifica.

•	Per evitare conflitti di nome tra progetti a cui si fa riferimento, assegnare alle routine nomi univoci, in modo da poterle richiamare senza dover specificare un nome di progetto o di modulo.


Chiamata di routine Property

Nella tabella seguente è riportata la sintassi per le chiamate alle routine Property:

Routine Property	Sintassi
Property Let	[oggetto.]nomeprop(argomenti)] = argomento
Property Get	nomevar = [oggetto.]nomeprop(argomenti)]
Property Set	Set [oggetto.]nomeprop[.(argomenti)] = nomevar
Quando viene chiamata una routine Property Let o Property Set, a destra del segno uguale (=) compare sempre un argomento.

Se viene dichiarata una routine Property Let o Property Set con più argomenti, l'argomento a destra della chiamata verrà passato all'ultimo argomento nella dichiarazione di Property Let o Property Set. Nell'esempio di diagramma seguente, viene illustrato in quale modo gli argomenti della chiamata alla routine Property sono correlati agli argomenti della dichiarazione di Property Let:

Le routine Property con più argomenti vengono in genere utilizzate unicamente per la creazione di matrici di proprietà.


Chiamata di routine Sub e Function

Per eseguire una chiamata a una routine Sub da un'altra routine, digitare il nome della routine desiderata e includere i valori degli eventuali argomenti richiesti. L'istruzione Call non è obbligatoria, ma se viene utilizzata, è necessario includere gli argomenti tra parentesi.

È possibile utilizzare una routine Sub per organizzare altre routine in modo da semplificarne la comprensione e le operazioni di debug. Nell'esempio seguente, la routine Sub Main esegue una chiamata alla routine Sub MultiBeep e come argomento viene passato il valore 56. Dopo l'esecuzione di MultiBeep, il controllo viene restituito a Main, che esegue una chiamata alla routine Sub Message. Message visualizza quindi una finestra di messaggio. Quando l'utente fa clic su OK, il controllo viene restituito a Main, che viene terminata.

Sub Main()

MultiBeep 56

Message

End Sub

Sub MultiBeep(numbeeps)

For counter = 1 To numbeeps

Beep

Next counter

End Sub

Sub Message()

MsgBox "È ora di fare una pausa"

End Sub

Chiamata di routine Sub con più argomenti

Nell'esempio seguente vengono illustrati due metodi per eseguire una chiamata a una routine Sub con più argomenti. Per la seconda chiamata a HouseCalc, è necessario racchiudere gli argomenti tra parentesi poiché viene utilizzata l'istruzione Call.

Sub Main()

HouseCalc 99800, 43100

Call HouseCalc(380950, 49500)

End Sub

Sub HouseCalc(price As Single, wage As Single)

If 2.5 * wage <= 0.8 * price Then

MsgBox "Il prezzo di questa casa è troppo alto"

Else

MsgBox "Il prezzo di questa casa è equo"

End If

End Sub

Utilizzo delle parentesi nelle chiamate alle routine Function

Per utilizzare il valore restituito da una funzione, è possibile assegnare la funzione a una variabile e inserire gli argomenti tra parentesi, come è illustrato nell'esempio seguente.

Answer3 = MsgBox("Sei soddisfatto del tuo stipendio?", 4, "Domanda 3")

Se non si desidera utilizzare il valore restituito da una funzione, è possibile eseguire una chiamata alla funzione con lo stesso metodo utilizzato per la chiamata a una routine Sub. Evitare l'utilizzo delle parentesi, elencare gli argomenti e non assegnare la funzione a una variabile, come è illustrato nell'esempio seguente.

MsgBox "Attività completata", 0, "Casella delle attività"

Attenzione   Se nell'esempio precedente vengono incluse le parentesi, verrà generato un errore di sintassi.

Passaggio di argomenti predefiniti

In un'istruzione di una routine Sub o Function è possibile passare valori alle routine chiamate utilizzando argomenti predefiniti. Gli argomenti predefiniti possono comparire nell'elenco in qualsiasi ordine. Un argomento predefinito è rappresentato dal nome dell'argomento seguito da due punti e dal segno uguale (:=) e dal valore assegnato all'argomento.

Nell'esempio seguente viene eseguita una chiamata alla funzione MsgBox utilizzando argomenti predefiniti e senza che venga restituito alcun valore.

MsgBox Title:="Casella attività", Prompt:="Attività completata"

Nell'esempio seguente viene eseguita una chiamata alla funzione MsgBox utilizzando argomenti predefiniti. Il valore restituito viene assegnato alla variabile answer3.

answer3 = MsgBox(Title:="Domanda 3", _

Prompt:="Sei soddisfatto del tuo stipendio?", Buttons:=4)


Creazione di una variabile oggetto

È possibile utilizzare una variabile oggetto con gli stessi criteri utilizzati per l'oggetto a cui si riferisce. È possibile impostare o restituire le proprietà dell'oggetto oppure utilizzare uno dei metodi previsti per tale oggetto.

Per creare una variabile oggetto:

1.	Dichiarare la variabile oggetto.

2.	Assegnare la variabile oggetto a un oggetto.

Dichiarazione di una variabile oggetto

Per dichiarare una variabile oggetto, è possibile utilizzare l'istruzione Dim o una delle altre istruzioni di dichiarazione (Public, Private o Static). Una variabile che si riferisce a un oggetto deve essere del tipo Variant, Object o un tipo di oggetto specifico. Le dichiarazioni riportate nell'esempio seguente sono valide:

' Dichiara MyObject come tipo di dati Variant.

Dim MyObject

' Dichiara MyObject come tipo di dati Object.

Dim MyObject As Object

' Dichiara MyObject come tipo Font.

Dim MyObject As Font

Nota   Se una variabile oggetto viene utilizzata senza prima dichiararla, il tipo di dati della variabile oggetto sarà Variant per impostazione predefinita.

È possibile dichiarare una variabile oggetto con il tipo di dati Object quando non è possibile determinare il tipo di oggetto specifico se non durante l'esecuzione della routine. Utilizzare il tipo di dati Object per creare un riferimento generico a qualsiasi oggetto.

Se il tipo di oggetto specifico è noto, è possibile dichiarare la variabile oggetto utilizzando tale tipo di oggetto. Se l'applicazione in uso contiene, ad esempio, un tipo di oggetto Sample, è possibile dichiarare una variabile oggetto utilizzando le istruzioni di seguito riportate:

Dim MyObject As Object	' Dichiarata come oggetto generico.

Dim MyObject As Sample	' Dichiarata come oggetto Sample.

La dichiarazione di tipi di oggetti specifici consente di ottenere il controllo automatico dei tipi, un codice più rapido e maggiormente leggibile.

Assegnazione di una variabile oggetto a un oggetto

Per assegnare un oggetto a una variabile oggetto, è possibile utilizzare l'istruzione Set. È possibile assegnare un'espressione oggetto o Nothing. Le assegnazioni di variabili oggetto indicate nell'esempio sono valide:

Set MyObject = YourObject	' Assegna un riferimento di 	' oggetto.

Set MyObject = Nothing	' Interrompe l'associazione.

È possibile abbinare la dichiarazione di una variabile oggetto con l'assegnazione di un oggetto alla variabile oggetto. A tale scopo, utilizzare la parola chiave New con l'istruzione Set. Ad esempio:

Set MyObject = New Object	' Crea e assegna

Se una variabile oggetto viene impostata su Nothing, l'associazione della variabile oggetto ad un oggetto specifico verrà interrotta. Ciò consente di evitare di modificare inavvertitamente l'oggetto quando si modifica la variabile. Una variabile oggetto è sempre impostata su Nothing dopo aver chiuso l'oggetto associato e in questo modo è possibile verificare se la variabile oggetto si riferisce o meno a un oggetto valido. Ad esempio:

If Not MyObject Is Nothing Then

' La variabile si riferisce a un oggetto valido.

. . .

End If

Nel corso di tale verifica non sarà ovviamente possibile determinare con assoluta certezza se l'applicazione contenente l'oggetto a cui si riferisce la variabile oggetto è stata chiusa o meno.

Riferimento all'istanza corrente di un oggetto

Utilizzare la parola chiave Me per fare riferimento all'istanza corrente dell'oggetto in cui è in esecuzione il codice. Tutte le routine associate all'oggetto corrente hanno accesso all'oggetto a cui si fa riferimento con la parola chiave Me. L'utilizzo di tale parola chiave risulta particolarmente utile per passare informazioni relative all'istanza corrente di un oggetto a una routine in un altro modulo. Si supponga, ad esempio, che la routine seguente sia inclusa in un modulo:

Sub ChangeObjectColor(MyObjectName As Object)

MyObjectName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)

End Sub

È possibile richiamare la routine e passare l'istanza corrente dell'oggetto come argomento utilizzando la seguente istruzione:

ChangeObjectColor Me


Creazione di routine ricorsive

Per le routine è disponibile una quantità limitata si spazio per le variabili. Ogni volta che una routine richiama se stessa, viene utilizzata una quantità di spazio maggiore rispetto a quello disponibile. Questo tipo di routine viene definita routine ricorsiva. Una routine ricorsiva che richiama se stessa all'infinito genererà un errore. Ad esempio:

Function RunOut(Maximum)

RunOut = RunOut(Maximum)

End Function

Questo errore può risultare meno ovvio nel caso in cui due routine si chiamino l'un l'altra all'infinito oppure nel caso in cui non si incontri mai una condizione che limiti la ricorsione. Il processo di ricorsione ha comunque varie funzioni. La routine riportata nell'esempio seguente utilizza una funzione ricorsiva per calcolare valori fattoriali:

Function Factorial (N)

If N <= 1 Then	' Fine delle chiamate ricorsive.

Factorial = 1	' (N = 0) quindi esce dalle chiamate.

Else	' Chiama di nuovo Factorial se N > 0.

Factorial = Factorial(N - 1) * N

End If

End Function

È consigliabile verificare una routine ricorsiva per accertarsi che non richiami se stessa fino a esaurimento di memoria. Se viene generato un errore, verificare che la ricorsione non sia impostata all'infinito. Cercare inoltre di risparmiare memoria nei seguenti modi:

•	Eliminando le variabili non necessarie.

•	Utilizzando tipi di dati diversi da Variant.

•	Riesaminando la logica della routine. Una ricorsione può spesso essere sostituita da cicli nidificati.


Dichiarazione di matrici

Le matrici vengono dichiarate con gli stessi metodi utilizzati per le altre variabili, ovvero utilizzando le istruzioni Dim, Static, Private o Public. Ciò che differenzia le variabili scalari (che non sono matrici) dalle matrici è il fatto che in genere è necessario specificare la dimensione di una matrice. Le matrici con dimensione specificata sono matrici a dimensione fissa. Le matrici la cui dimensione può essere modificata mentre è in esecuzione un programma sono matrici dinamiche.

Se gli indici di una matrice vengono numerati a partire da 0 o da 1 dipende dall'impostazione dell'istruzione Option Base. Se non si specifica Option Base 1, tutti gli indici delle matrici verranno numerati a partire da zero.

Dichiarazione di una matrice fissa

Nella seguente riga di codice una matrice con dimensione fissa viene dichiarata come una matrice Integer che include 11 righe e 11 colonne:

Dim MyArray(10, 10) As Integer

Il primo argomento rappresenta le righe, il secondo argomento rappresenta le colonne.

Come accade per ogni altra dichiarazione di variabile, se non viene specificato un tipo di dati per la matrice, il tipo di dati per gli elementi di una matrice dichiarata sarà Variant. Ciascun elemento numerico Variant della matrice utilizza 16 byte. Ciascun elemento stringa Variant utilizza 22 byte. Per far sì che il codice venga scritto nel modo più compatto possibile, è consigliabile dichiarare in modo esplicito che il tipo di dati delle matrici è diverso da Variant. Nelle seguenti righe del codice vengono confrontate le dimensioni di diverse matrici:

' La matrice Integer utilizza 22 byte (11 elementi * 2 byte).

ReDim MyIntegerArray(10) As Integer

' La matrice Double utilizza 88 byte (11 elementi * 8 byte).

ReDim MyDoubleArray(10) As Double

' La matrice Variant utilizza almeno 176 byte (11 elementi * 16 byte).

ReDim MyVariantArray(10)

' La matrice Integer utilizza 100 * 100 * 2 byte (20,000 byte).

ReDim MyIntegerArray (99, 99) As Integer

' La matrice Double utilizza 100 * 100 * 8 byte (80.000 byte).

ReDim MyDoubleArray (99, 99) As Double

' La matrice Variant utilizza almeno 160.000 byte (100 * 100 * 16 byte).

ReDim MyVariantArray(99, 99)

La dimensione massima di una matrice varia a seconda del sistema operativo in uso e della memoria disponibile. L'utilizzo di matrici di dimensioni superiori alla memoria RAM disponibile nel sistema comporterà un rallentamento del funzionamento poiché i dati devono essere letti e quindi scritti su disco.

Dichiarazione di una matrice dinamica

La dichiarazione di una matrice dinamica consente di ridimensionare la matrice mentre il codice è in esecuzione. Utilizzare un'istruzione Static, Dim, Private o Public per dichiarare la matrice, lasciando le parentesi vuote, come è illustrato nell'esempio seguente.

Dim sngArray() As Single

Nota   Per dichiarare una matrice in modo implicito all'interno di una routine, è possibile utilizzare l'istruzione ReDim. Quando si utilizza questa istruzione è necessario fare attenzione a non sbagliare il nome della matrice. Sebbene l'istruzione Option Explicit sia inclusa nel modulo, verrà infatti creata una seconda matrice.

In una routine che rientra nell'area di validità della matrice, è possibile utilizzare l'istruzione ReDim per modificare il numero di dimensioni, definire il numero di elementi e il limite inferiore e superiore di ciascuna dimensione. È inoltre possibile utilizzare l'istruzione ReDim per modificare la matrice dinamica ogni volta che è necessario. In questo modo, tuttavia, ogni volta che si utilizza l'istruzione ReDim i valori esistenti nella matrice andranno perduti. Utilizzare ReDim Preserve per ingrandire una matrice senza cancellare alcun dato della matrice stessa. Nell'esempio seguente viene illustrata un'istruzione che consente di ingrandire la matrice varArray di 10 elementi senza cancellare i valori correnti degli elementi originali.

ReDim Preserve varArray(UBound(varArray) + 10)

Nota   Se viene utilizzata la parola chiave Preserve con una matrice dinamica, è possibile modificare solo il limite superiore dell'ultima dimensione e non il numero di dimensioni.


Dichiarazione di costanti

La dichiarazione di una costante consente di assegnare un nome significativo a un valore. Per dichiarare una costante e impostarne il valore, è possibile utilizzare l'istruzione Const. Non è possibile modificare o assegnare un nuovo valore a una costante dopo averla dichiarata.

È possibile dichiarare una costante all'interno di una routine o all'inizio di un modulo, nella sezione Dichiarazioni. Le costanti a livello di modulo sono private per impostazione predefinita. Per dichiarare una costante a livello di modulo pubblica, è necessario far precedere l'istruzione Const dalla parola chiave Public. Per dichiarare una costante privata in modo esplicito e semplificare quindi la lettura e l'interpretazione del codice, è possibile far precedere l'istruzione Const dalla parola chiave Private. Per ulteriori informazioni, vedere "Area di validità e visibilità" nella Guida di Visual Basic.

Nell'esempio seguente la costante Public conAge viene dichiarata come un Integer a cui viene assegnato il valore 34.

Public Const conAge As Integer = 34

Il tipo di dati di una costante dichiarata può essere: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String oppure Variant. Poiché il valore di una costante è noto, è possibile specificare il tipo di dati in un'istruzione Const. Per ulteriori informazioni sui tipi di dati, vedere "Riepilogo dei tipi di dati" nella Guida di Visual Basic.

È possibile dichiarare diverse costanti in una singola istruzione. Per specificare un tipo di dati, è necessario includere il tipo di dati per ciascuna costante. Nell'istruzione seguente, le costanti conAge e conWage vengono dichiarate come Integer.

Const conAge As Integer = 34, conWage As Currency = 35000


Dichiarazione di variabili

Per dichiarare una variabile viene in genere utilizzata un'istruzione Dim. Un'istruzione di dichiarazione può essere posizionata all'interno di una routine per creare una variabile a livello di routine oppure può essere posizionata all'inizio di un modulo, nella sezione Dichiarazioni, per creare una variabile a livello di modulo.

Nell'esempio seguente viene creata la variabile strName e viene specificato il tipo di dati String.

Dim strName As String

Se questa istruzione compare in una routine, la variabile strName potrà essere utilizzata solo in tale routine. Se compare nella sezione Dichiarazioni di un modulo, la variabile strName sarà disponibile per tutte le routine del modulo, ma non per le routine di altri moduli del progetto. Per rendere questa variabile disponibile per tutte le routine del progetto, è necessario farla precedere dall'istruzione Public, come illustrato nell'esempio seguente:

Public strName As String

Per informazioni sulla denominazione delle variabili, vedere "Convenzioni di denominazione di Visual Basic" nella Guida di Visual Basic.

Il tipo di dati delle variabili può essere: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (per stringhe di lunghezza variabile), String * lunghezza (per stringhe di lunghezza fissa), Object o Variant. Se non viene specificato un tipo di dati, verrà assegnato per impostazione predefinita il tipo di dati Variant. È inoltre possibile creare un tipo definito dall'utente utilizzando l'istruzione Type. Per ulteriori informazioni sui tipi di dati, vedere "Riepilogo dei tipi di dati" nella Guida di Visual Basic.

È possibile dichiarare diverse variabili in una singola istruzione. Per specificare un tipo di dati, è necessario includere il tipo di dati per ciascuna variabile. Nell'istruzione seguente, le variabili intX, intY e intZ vengono dichiarate di tipo Integer.

Dim intX As Integer, intY As Integer, intZ As Integer

Nell'istruzione seguente, le variabili intX e intY vengono dichiarate di tipo Variant e solo la variabile intZ viene dichiarata di tipo Integer.

Dim intX, intY, intZ As Integer

Nell'istruzione di dichiarazione non è necessario specificare il tipo di dati della variabile. Se il tipo di dati viene omesso, la variabile sarà di tipo Variant.

Utilizzo dell'istruzione Public

L'istruzione Public consente di dichiarare variabili pubbliche a livello di modulo.

Public strName As String

Le variabili pubbliche sono disponibili per tutte le routine del progetto. Se una variabile pubblica viene dichiarata in un modulo standard o in un modulo di classe, è inoltre possibile utilizzarla in tutti i progetti che fanno riferimento al progetto in cui essa viene dichiarata.

Utilizzo dell'istruzione Private

L'istruzione Private consente di dichiarare variabili private a livello di modulo.

Private MyName As String

Le variabili private sono disponibili solo per le routine del modulo in cui vengono dichiarate.

Nota   Se viene utilizzata a livello di modulo, l'istruzione Dim è equivalente all'istruzione Private. L'istruzione Private consente tuttavia di semplificare la lettura e l'interpretazione del codice.

Utilizzo dell'istruzione Static

Se invece dell'istruzione Dim viene utilizzata l'istruzione Static, il valore della variabile dichiarata verrà mantenuto tra le chiamate.

Utilizzo dell'istruzione Option Explicit

Per dichiarare una variabile in modo implicito è sufficiente utilizzarla in un'istruzione di assegnazione. Tutte le variabili dichiarate in modo implicito sono di tipo Variant. Tali variabili richiedono maggiori risorse di memoria rispetto alla maggior parte delle altre variabili. Per migliorare le prestazioni dell'applicazione, può quindi risultare utile dichiarare le variabili in modo esplicito e con un tipo di dati specifico. La dichiarazione esplicita consente infatti di ridurre gli errori per conflitti di nome e gli errori di ortografia.

Per evitare che le variabili vengano dichiarate in modo implicito, è possibile posizionare l'istruzione Option Explicit in un modulo prima di qualsiasi altra routine. Questa istruzione forza la dichiarazione esplicita di tutte le variabili del modulo. Quando in un modulo viene utilizzata l'istruzione Option Explicit e viene incontrato un nome di variabile non dichiarata o digitato in modo non corretto, verrà generato un errore in fase di compilazione.

Nell'ambiente di programmazione di Visual Basic è disponibile un'opzione che consente di includere automaticamente l'istruzione Option Explicit in tutti i nuovi moduli. Per informazioni sulla modifica delle opzioni di ambiente di Visual Basic, vedere la documentazione dell'applicazione in uso. Si noti che questa opzione non modifica il codice già scritto.

Nota   Le matrici fisse e le matrici dinamiche devono essere dichiarate in modo esplicito.

Dichiarazione di una variabile oggetto per l'automazione

Se un'applicazione viene utilizzata per gestire oggetti di un'altra applicazione, è consigliabile impostare un riferimento alla libreria dei tipi dell'altra applicazione. Dopo aver impostato un riferimento, è possibile dichiarare variabili oggetto in base al tipo più specifico. Se, ad esempio, in Microsoft Word viene impostato un riferimento alla libreria dei tipi di Microsoft Excel, è possibile dichiarare una variabile di tipo Worksheet da Microsoft Word per rappresentare un oggetto Worksheet di Microsoft Excel.

Se per gestire oggetti di Microsoft Access viene utilizzata un'altra applicazione, nella maggior parte dei casi sarà possibile dichiarare variabili oggetto in base al tipo più specifico. È inoltre possibile utilizzare la parola chiave New per creare in modo automatico una nuova istanza di un oggetto. Può risultare tuttavia necessario specificare che si tratta di un oggetto di Microsoft Access. Se, ad esempio, viene dichiarata una variabile oggetto che rappresenta una maschera di Microsoft Access, è necessario distinguere l'oggetto Form di Microsoft Access dall'oggetto Form di Visual Basic. A tale scopo, è possibile includere il nome della libreria dei tipi nella dichiarazione della variabile, come è illustrato nell'esempio seguente:

Dim frmOrders As New Access.Form

Alcune applicazioni non riconoscono i singoli tipi di oggetti di Microsoft Access. Anche se viene impostato un riferimento alla libreria dei tipi di Microsoft Access, è necessario che tutte le variabili oggetto di Microsoft Access vengano dichiarate come variabili di tipo Object. Inoltre, non è possibile utilizzare la parola chiave New per creare una nuova istanza dell'oggetto. Nell'esempio seguente viene illustrata la dichiarazione di una variabile che rappresenta un'istanza dell'oggetto Application di Microsoft Access da un'applicazione che non è in grado di riconoscere i tipi di oggetti di Microsoft Access. L'applicazione crea quindi un'istanza dell'oggetto Application.

Dim appAccess As Object

Set appAccess = CreateObject("Access.Application.7")

Per determinare la sintassi supportata da un'applicazione, vedere la relativa documentazione.


Esecuzione del codice durante l'impostazione delle proprietà

È possibile creare routine Property Let, Property Set e Property Get con lo stesso nome. In questo caso, viene creato un gruppo di routine correlate che operano insieme. Non è possibile utilizzare il nome di una routine Property per una routine Sub o Function, per una variabile o per un tipo definito dall'utente.

L'istruzione Property Let consente di creare una routine che imposta il valore della proprietà. Un esempio può essere rappresentato da una routine Property che crea una proprietà di inversione per un'immagine bitmap di un form. Nell'esempio seguente è riportata la sintassi utilizzata per richiamare la routine Property Let:

Form1.Inverted = True

L'effettiva inversione della bitmap viene eseguita all'interno della routine Property Let:

Private IsInverted As Boolean

Property Let Inverted(X As Boolean)

IsInverted = X

If IsInverted Then

…

(istruzioni)

Else

(istruzioni)

End If

End Property

L'impostazione della proprietà è memorizzata nella variabile a livello di form IsInverted. Poiché viene dichiarata come Private, può essere modificata dall'utente solo mediante la routine Property Let. Specificare un nome che consenta di verificare in modo rapido che la variabile viene utilizzata per la proprietà.

Nell'esempio seguente la routine Property Get viene utilizzata per restituire lo stato corrente della proprietà Inverted:

Property Get Inverted() As Boolean

Inverted = IsInverted

End Property

Le routine Property consentono di semplificare l'esecuzione del codice durante l'impostazione del valore di una proprietà. È possibile utilizzare le routine Property per eseguire le seguenti operazioni di elaborazione:

•	Prima di impostare una proprietà per determinare il valore della proprietà.

•	Dopo aver impostato una proprietà, in base al nuovo valore impostato.


Ripetizione ciclica del codice

L'utilizzo di istruzioni condizionali e di ripetizione ciclica (denominate anche strutture di controllo) consente di scrivere codice che è in grado di eseguire scelte e ripetere azioni. Un'altra struttura di controllo che può risultare utile è l'istruzione With, che consente di eseguire una serie di istruzioni senza dover riqualificare un oggetto.

Utilizzo di istruzioni condizionali per l'esecuzione di scelte

Le istruzioni condizionali valutano se una condizione è True o False e quindi specificano una o più istruzioni per l'esecuzione, in base al risultato ottenuto. Una condizione è in genere un'espressione che utilizza un operatore di confronto per confrontare un valore o una variabile con un altro valore o un'altra variabile.

Scelta di un'istruzione condizionale

•	If...Then...Else: Esecuzione di un passaggio quando una condizione risulta vera o falsa

•	Select Case: Selezione di un passaggio da un gruppo di condizioni

Utilizzo di cicli per la ripetizione del codice

La ripetizione ciclica consente di eseguire più volte un gruppo di istruzioni. Alcuni cicli ripetono le istruzioni fino a quando una condizione non risulta falsa. Altri ripetono le istruzioni fino a quando una condizione non risulta vera. Esistono inoltre cicli che ripetono le istruzioni per un determinato numero di volte o per ciascun oggetto di un insieme.

Scelta di un ciclo

•	Do...Loop: Esecuzione del ciclo mentre o fino a quando una condizione è True.

•	For...Next: Utilizzo di un contatore per l'esecuzione di istruzioni per un determinato numero di volte.

•	For Each...Next: Ripetizione di un gruppo di istruzioni per ciascun oggetto di un insieme.

Esecuzione di numerose istruzioni per lo stesso oggetto

In Visual Basic, è in genere necessario specificare un oggetto prima di poterne eseguire uno dei relativi metodi oppure modificarne le proprietà. Per specificare una sola volta un oggetto per un'intera serie di istruzioni, è possibile utilizzare l'istruzione With.

•	With: Esecuzione di una serie di istruzioni per lo stesso oggetto.


Velocizzazione di cicli For...Next

I valori Integer non solo utilizzano una quantità di memoria minore rispetto al tipo di dati Variant, ma consentono anche un aggiornamento più rapido. La differenza è tuttavia rilevabile solo se si eseguono migliaia di operazioni. Ad esempio:

Dim CountFaster As Integer	' Nel primo caso, utilizza Integer.

For CountFaster = 0 to 32766

Next CountFaster

Dim CountSlower As Variant	' Nel secondo caso, utilizza Variant.

For CountSlower = 0 to 32766

Next CountSlower

Nel primo caso la velocità di esecuzione è leggermente inferiore rispetto al secondo caso. Se tuttavia CountFaster supera il valore 32.767, verrà generato un errore. Per risolvere il problema, è possibile cambiare CountFaster utilizzando il tipo di dati Long, per il quale è ammessa una gamma di interi più ampia. In generale, più le dimensioni del tipo di dati sono ridotte, minore sarà il tempo richiesto per l'aggiornamento. Le espressioni Variant sono leggermente più lente rispetto al tipo di dati equivalente.


Passaggio degli argomenti in modo efficiente

Tutti gli argomenti vengono passati alle routine per riferimento, se non diversamente specificato. Questo sistema risulta particolarmente valido, in quanto in una routine il tempo necessario per il passaggio e la quantità di spazio (4 byte) sono uguali per tutti gli argomenti indipendentemente dal tipo di dati.

È possibile passare un argomento per valore includendo la parola chiave ByVal nella dichiarazione della routine. Gli argomenti passati per valore utilizzano da 2 a 16 byte nella routine, a seconda del tipo di dati dell'argomento. Il tempo richiesto per il passaggio dei tipi di dati di dimensioni più grandi è maggiore di quello per i tipi di dimensioni minori. Per questo motivo, non è consigliabile passare per valore tipi di dati String e Variant.

Il passaggio di un argomento per valore consente di copiare la variabile originale. Le modifiche apportate all'argomento all'interno della routine non verranno riportate nella variabile originale. Ad esempio:

Function Factorial (ByVal MyVar As Integer)	' Dichiarazione di funzione.

MyVar = MyVar - 1

If MyVar = 0 Then

Factorial = 1

Exit Function

End If

Factorial = Factorial(MyVar) * (MyVar + 1)

End Function

' Chiama Factorial con una variabile S.

S = 5

Print Factorial(S)	' Visualizza 120 (fattoriale di 5)

Print S	' Visualizza 5.

Se non si include ByVal nella dichiarazione di funzione, le istruzioni Print sopraindicate restituirebbero 1 e 0, poiché MyVar in questo caso sarebbe riferita alla variabile S, che viene ridotta di 1 fino a quando non risulta uguale a 0.

Poiché ByVal copia l'argomento, consente di passare un valore Variant alla funzione Factorial. Non è possibile passare un valore Variant per riferimento se la routine che dichiara l'argomento è di tipo diverso.


Restituzione di risultati di tipo String con le funzioni

Per alcune funzioni sono disponibili due versioni: una che restituisce un tipo di dati Variant e una che restituisce un tipo di dati String. È consigliabile utilizzare le versioni con risultato di tipo Variant, in quanto le espressioni Variant consentono di gestire automaticamente le conversioni tra tipi di dati diversi. Consentono inoltre di riprodurre valori Null mediante un'espressione. Le versioni con risultato di tipo String risultano più efficienti in quanto utilizzano una quantità inferiore di memoria.

È consigliabile utilizzare il tipo String nei seguenti casi:

•	Se il programma ha dimensioni notevoli e utilizza numerose variabili.

•	Se si desidera scrivere i dati direttamente in un file ad accesso casuale.

Le seguenti funzioni restituiscono variabili di tipo String quando si aggiunge il segno di dollaro ($) al nome della funzione. Queste funzioni hanno la stessa sintassi e modalità di utilizzo delle funzioni di tipo Variant equivalenti il cui nome non include il segno di dollaro.

Chr$	ChrB$	*Command$
CurDir$	Date$	Dir$
Error$	Format$	Hex$
Input$	InputB$	LCase$
Left$	LeftB$	LTrim$
Mid$	MidB$	Oct$
Right$	RightB$	RTrim$
Space$	Str$	String$
Time$	Trim$	UCase$
* È possibile che non siano disponibili in tutte le applicazioni.


Compilazione condizionale

La compilazione condizionale consente di eseguire blocchi di codice in modo selettivo allo scopo, ad esempio, di eseguire il debug delle istruzioni per il confronto della velocità di diversi approcci alla stessa attività di programmazione oppure per la localizzazione di applicazioni in lingue diverse.

È possibile utilizzare l'istruzione di compilazione #Const per dichiarare una costante di compilazione condizionale nel codice e l'istruzione #If...Then...#Else per specificare i blocchi di codice che verranno compilati in modo condizionale. Nell'esempio seguente il codice di debug o di produzione viene eseguito in base al valore della variabile conDebug.

' Dichiara costante di compilazione pubblica nella

' sezione Dichiarazioni.

#Const conDebug = 1

Sub SelectiveExecution()

#If conDebug = 1 Then

.	' Esegue codice con istruzioni di

' debug.

.

.

#Else

.	' Esegue codice normale.

.

.

#End If

End Sub


Vita utile delle variabili

La vita utile di una variabile è il periodo di tempo in cui essa conserva il proprio valore. Tale valore può variare nel corso della vita utile, ma non può tuttavia risultare annullato. Quando una variabile perde la propria area di validità, essa non avrà più un valore.

Quando inizia l'esecuzione di una routine, vengono inizializzate tutte le variabili. Le variabili numeriche vengono inizializzate su zero, le stringhe di lunghezza variabile su una stringa di lunghezza zero ("") e le stringhe di lunghezza fissa vengono riempite con il carattere rappresentato dal codice di carattere ASCII 0 o Chr(0). Le variabili di tipo Variant vengono inizializzate su Empty. Ogni elemento di una variabile di tipo definito dall'utente viene inizializzato come se fosse una variabile distinta.

Quando viene definita una variabile oggetto, viene riservato uno spazio di memoria, ma il relativo valore sarà impostato su Nothing fino a quando non viene assegnato ad essa un riferimento all'oggetto mediante l'istruzione Set.

Se il valore di una variabile non viene modificato durante l'esecuzione del codice, esso verrà conservato fino a quando la variabile non perde la propria area di validità.

Il valore di una variabile a livello di routine dichiarata mediante l'istruzione Dim viene conservato fino a quando non viene terminata l'esecuzione della routine. Se la routine richiama altre routine, il valore della variabile verrà conservato anche durante l'esecuzione delle routine.

Se nella dichiarazione di una variabile a livello di routine è inclusa la parola chiave Static, la variabile conserva il proprio valore fino a quando è in corso l'esecuzione del codice in qualsiasi modulo. Quando l'esecuzione dell'intero codice è terminata, la variabile perde la propria area di validità e il proprio valore. La vita utile della variabile è uguale a quella di una variabile a livello di modulo.

Una variabile a livello di modulo si differenzia da una variabile statica. In un modulo standard o in un modulo di classe, essa conserva il proprio valore fino a quando non viene interrotta l'esecuzione del codice. In un modulo di classe, essa conserva il proprio valore fino a quando esiste un'istanza della classe. Le variabili a livello di modulo utilizzano memoria fino a quando non vengono reimpostati i relativi valori ed è quindi consigliabile utilizzarle solo se strettamente necessario.

Se prima di un'istruzione Sub o Function viene inclusa la parola chiave Static, i valori delle variabili a livello di routine all'interno della routine vengono conservati tra le chiamate.


Argomenti predefiniti e facoltativi

Quando viene richiamata una routine Sub o Function, è possibile specificare gli argomenti in base alla relativa posizione, ovvero l'ordine in cui essi compaiono nella definizione della routine, oppure in base al nome.

Nella routine Sub seguente vengono specificati tre argomenti:

Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)

Debug.Print strName, intAge, dteBirth

End Sub

È possibile richiamare questa routine specificandone gli argomenti nella posizione corretta, ognuno delimitato da una virgola, come è illustrato nell'esempio seguente:

PassArgs "Maria", 29, #2-21-69#

È inoltre possibile richiamare questa routine fornendo argomenti predefiniti, ognuno delimitato da una virgola.

PassArgs intAge:=29, dteBirth:=#2/21/69#, strName:="Martina"

Un argomento predefinito è composto da un nome di argomento seguito da due punti e da un segno di uguale (:=) e dal relativo valore.

Gli argomenti predefiniti risultano particolarmente utili quando viene richiamata una routine con argomenti facoltativi. Se vengono utilizzati argomenti predefiniti, non è necessario includere le virgole per indicare gli argomenti di posizione mancanti. Risulta inoltre più semplice tenere traccia degli argomenti passati e di quelli omessi.

Nella definizione della routine, gli argomenti facoltativi sono preceduti dalla parola chiave Optional. È inoltre possibile specificare un valore predefinito per l'argomento facoltativo. Ad esempio:

Sub OptionalArgs(strState As String, Optional strCountry As String = "Stati Uniti")

. . .

End Sub

Quando viene richiamata una routine con un argomento facoltativo, è possibile scegliere se specificare o meno l'argomento facoltativo. Se l'argomento non viene specificato, verrà utilizzato l'eventuale valore predefinito. Se non è specificato alcun valore predefinito, verrà utilizzato l'argomento corrispondente per qualsiasi variabile del tipo specificato.

Nella seguente routine è incluso un argomento facoltativo, la variabile varCountry. La funzione IsMissing stabilisce se alla routine è stato passato o meno un argomento facoltativo.

Sub OptionalArgs(strState As String, Optional intRegion As Integer, _

Optional strCountry As String = "Stati Uniti")

If IsMissing(intRegion) And IsMissing(strCountry) Then

Debug.Print strState

ElseIf IsMissing(strCountry) Then

Debug.Print strState, intRegion

ElseIf IsMissing(intRegion) Then

Debug.Print strState, strCountry

Else

Debug.Print strState, intRegion, strCountry

End If

End Sub

È possibile richiamare questa routine utilizzando gli argomenti predefiniti come illustrato nei seguenti esempi.

OptionalArgs strCountry:="Stati Uniti", strState:="MD"

OptionalArgs strState:= "MD", intRegion:=5


Oggetti, proprietà, metodi ed eventi

Un oggetto rappresenta un elemento di un'applicazione, quale un foglio di lavoro, una cella, un grafico, una maschera o un report. Nel codice di Visual Basic, è necessario che un oggetto venga identificato prima che sia possibile applicare uno dei relativi metodi o modificare il valore di una delle relative proprietà.

Un insieme è un oggetto contenente numerosi altri oggetti che in genere, anche se non sempre, sono dello stesso tipo. L'insieme Workbooks di Microsoft Excel contiene, ad esempio, tutti gli oggetti Workbook aperti. L'insieme Forms di Visual Basic contiene tutti gli oggetti Form di un'applicazione.

È possibile identificare gli elementi di un insieme in base al numero o al nome. Ad esempio, nella seguente routine, Workbooks(1) identifica il primo oggetto Workbook aperto.

Sub CloseFirst()

Workbooks(1).Close

End Sub

Nella seguente routine viene utilizzato un nome specificato sotto forma di stringa per identificare un oggetto Form.

Sub CloseForm()

Forms("MioForm.frm").Close

End Sub

È inoltre possibile gestire un intero insieme di oggetti che condividono gli stessi metodi. La seguente routine chiude, ad esempio, tutti i form aperti.

Sub CloseAll()

Forms.Close

End Sub

Un metodo è un'azione che può essere eseguita da un oggetto. Ad esempio, Add è un metodo dell'oggetto ComboBox, poiché aggiunge una nuova voce a una casella combinata.

Nella routine seguente il metodo Add viene utilizzato per aggiungere un nuovo elemento a un oggetto ComboBox.

Sub AddEntry(newEntry as String)

Combo1.Add newEntry

End Sub

Una proprietà è un attributo di un oggetto che definisce una delle caratteristiche dell'oggetto stesso, quali la dimensione, il colore o la posizione sullo schermo oppure un aspetto del relativo funzionamento, ad esempio se è attivo o visibile. Per modificare le caratteristiche di un oggetto, è possibile modificare il valore delle relative proprietà.

Per impostare il valore di una proprietà, è possibile fare seguire il riferimento a un oggetto da un punto, il nome della proprietà, un segno di uguale (=) e il nuovo valore della proprietà. Nell'esempio di routine seguente la didascalia di un form di Visual Basic viene modificata mediante l'impostazione della proprietà Caption.

Sub ChangeName(newTitle)

myForm.Caption = newTitle

End Sub

Alcune proprietà non possono essere impostate. Nell'argomento della Guida relativo a ciascuna proprietà viene indicato se la proprietà può essere impostata (lettura/scrittura), se è di sola lettura o di sola scrittura.

È possibile recuperare informazioni su un oggetto mediante la restituzione del valore di una delle relative proprietà. Nella routine seguente viene utilizzata una finestra di messaggio per visualizzare il titolo che compare nella parte superiore del form attivo.

Sub GetFormName()

formName = Screen.ActiveForm.Caption

MsgBox formName

End Sub

Un evento è un'azione riconosciuta da un oggetto, ad esempio fare clic con il pulsante del mouse o premere un tasto, per rispondere alla quale è possibile scrivere codice. Gli eventi possono essere generati in risposta ad un'azione eseguita dall'utente o al codice del programma oppure possono essere attivati dal sistema.

Restituzione degli oggetti

In ogni applicazione sono disponibili metodi specifici per la restituzione degli oggetti. Poiché non sono tutti uguali, per sapere come restituire l'oggetto è tuttavia necessario fare riferimento all'argomento della Guida relativo all'oggetto o all'insieme utilizzato nell'applicazione.


Automazione

L'automazione (in precedenza nota come automazione OLE) è una funzione dello standard Component Object Model (COM) utilizzato dalle applicazioni per rendere accessibili i propri oggetti agli strumenti di sviluppo, ai linguaggi macro e ad altre applicazioni che supportano l'automazione. Ad esempio, un foglio elettronico può rendere accessibili oggetti quali fogli di lavoro, grafici, celle o intervalli di celle, ciascuno dei quali come un tipo di oggetto diverso. Un elaboratore di testi può rendere accessibili oggetti quali applicazioni, documenti, paragrafi, frasi, segnalibri o selezioni.

Se un'applicazione supporta l'automazione, sarà possibile accedere con Visual Basic agli oggetti in essa disponibili. In Visual Basic sarà possibile gestire tali oggetti richiamando metodi o leggendo e impostando le proprietà degli oggetti. Se è stato creato un oggetto di automazione denominato MyObj, è possibile, ad esempio, scrivere un codice come quello seguente per accedere all'oggetto:

MyObj.Insert "Salve."	' Posiziona il testo.

MyObj.Bold = True	' Formatta il testo.

If Mac = True	' Verifica la costante per la piattaforma in uso

MyObj.SaveAs  "c:\ElabTest\Doc\Oggprova.doc"	' Salva l'oggetto (Macintosh).

Else

MyObj.SaveAs  "c:\ElabTest\Doc\Oggprova.doc"	' Salva l'oggetto (Windows).

Le seguenti funzioni consentono di accedere a un oggetto di automazione:

Funzione	Descrizione
CreateObject	Crea un nuovo oggetto del tipo specificato.
GetObject	Recupera un oggetto da un file.
Per informazioni sulle proprietà e i metodi supportati da un'applicazione, vedere la documentazione relativa all'applicazione. Gli oggetti, le funzioni, le proprietà e i metodi supportati da un'applicazione vengono in genere definiti nella libreria degli oggetti dell'applicazione.


Matrici di parametri

Per passare una matrice di argomenti a una routine, è possibile utilizzare una matrice di parametri. Per la definizione della routine non è necessario conoscere il numero di elementi della matrice.

Le matrici di parametri possono essere identificate con la parola chiave ParamArray. La matrice deve essere dichiarata come di tipo Variant e deve essere l'ultimo argomento nella definizione della routine.

Nell'esempio seguente è illustrata la definizione di una routine mediante una matrice di parametri.

Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)

Dim intI As Integer

Debug.Print strName; " Punteggi"

' Utilizza la funzione UBound per definire il

' limite superiore della matrice.

For intI = 0 To UBound(intScores())

Debug.Print "          "; intScores(intI)

Next intI

End Sub

Negli esempi seguenti vengono illustrate diverse modalità di richiamo di questa routine.

AnyNumberArgs "Stefania", 10, 26, 32, 15, 22, 24, 16

AnyNumberArgs "Paola", "Alto", "Basso", "Medio", "Alto"


Area di validità e visibilità

L'area di validità si riferisce alla disponibilità di utilizzo di una variabile, di una costante o di una routine da parte di un'altra routine. Esistono tre livelli di validità: a livello di routine, a livello di modulo privato e a livello di modulo pubblico.

L'area di validità di una variabile viene specificata nella relativa dichiarazione. È consigliabile dichiarare tutte le variabili in modo esplicito, allo scopo di evitare errori di conflitto di nome tra variabili con aree di validità diverse.

Definizione dell'area di validità a livello di routine

Una variabile o costante definita all'interno di una routine non è visibile al di fuori di tale routine. Di conseguenza, una variabile può essere utilizzata solo dalla routine che contiene la relativa dichiarazione. Nell'esempio seguente, la prima routine visualizza una finestra di messaggio contenente una stringa. La seconda routine visualizza una finestra di messaggio vuota, poiché la variabile strMsg è una variabile locale della prima routine.

Sub LocalVariable()

Dim strMsg As String

strMsg = "Questa variabile non può essere utilizzata al di fuori di questa routine."

MsgBox strMsg

End Sub

Sub OutsideScope()

MsgBox strMsg

End Sub

Definizione dell'area di validità a livello di modulo privato

È possibile specificare variabili e costanti a livello di modulo nella sezione Dichiarazioni di un modulo. Le variabili a livello di modulo possono essere pubbliche o private. Le variabili pubbliche sono disponibili per tutte le routine di tutti i moduli di un progetto. Le variabili private sono disponibili solo per le routine del modulo specificato. Per impostazione predefinita, l'area di validità delle variabili dichiarate utilizzando l'istruzione Dim nella sezione Dichiarazioni è privata. Se, tuttavia, alla variabile viene fatta precedere la parola chiave Private, l'area di validità risulterà chiara nel codice.

Nell'esempio seguente, la variabile stringa strMsg è disponibile per qualsiasi routine definita nel modulo. Quando viene richiamata la seconda routine, il contenuto della variabile stringa strMsg verrà visualizzato in una finestra di dialogo.

' Aggiunge il seguente testo nella sezione

' Dichiarazioni del modulo.

Private strMsg sAs String

Sub InitializePrivateVariable()

strMsg = "Questa variabile non può essere utilizzata al di fuori di questo modulo."

End Sub

Sub UsePrivateVariable()

MsgBox strMsg

End Sub

Nota   Le routine pubbliche di un modulo standard o di un modulo di classe sono disponibili per qualsiasi progetto di riferimento. Per limitare l'area di validità di tutte le routine di un modulo al progetto corrente, è possibile aggiungere un'istruzione Option Private Module alla sezione Dichiarazioni del modulo. Le variabili e le procedure pubbliche saranno ancora disponibili per le altre routine del progetto corrente, ma non per i progetti di riferimento.

Definizione dell'area di validità a livello di modulo pubblico

Se una variabile a livello di modulo viene dichiarata come pubblica, essa sarà disponibile per tutte le routine del progetto. Nell'esempio seguente, la variabile stringa strMsg può essere utilizzata da tutte routine di tutti i moduli del progetto.

' Includere nella sezione Dichiarazioni del modulo.

Public strMsg As String

Tutte le routine sono pubbliche per impostazione predefinita, ad eccezione delle routine di eventi. Quando viene creata una routine di eventi, prima della dichiarazione di routine verrà inserita automaticamente la parola chiave Private. Per tutte le altre routine, è necessario dichiarare in modo esplicito la routine con la parola chiave Private, se si desidera che non sia pubblica.

È possibile utilizzare routine, variabili e costanti pubbliche dichiarate o definite in moduli standard o in moduli di classe da progetti di riferimento. È tuttavia necessario impostare innanzitutto un riferimento al progetto in cui vengono dichiarate o definite.

Le routine, le variabili e le costanti dichiarate o definite in moduli diversi dai moduli standard o dai moduli di classe, quali i moduli di form o i moduli di report, non sono disponibili per i progetti di riferimento, poiché tali moduli sono privati e quindi accessibili solo dal progetto in cui risiedono.


Espressioni e valori Variant

Se non si specifica un tipo di dati nella dichiarazione di una costante, una variabile o un argomento, verrà specificato automaticamente il tipo di dati Variant. Le variabili dichiarate come di tipo Variant possono contenere valori stringa, di data, di ora, Boolean o numerici e possono convertire automaticamente i valori in esse contenuti. I valori numerici Variant richiedono 16 byte di memoria (valore che diventa significativo solo in routine di grandi dimensioni o in moduli complessi) e i tempi di accesso sono più alti rispetto a tutti gli altri tipi di variabili con tipo esplicito. Per le costanti, il tipo di dati Variant viene utilizzato molto raramente. I valori stringa Variant richiedono 22 byte di memoria.

Le seguenti istruzioni creano variabili di tipo Variant:

Dim myVar

Dim yourVar As Variant

theVar = "Testo."

Nell'ultima istruzione la variabile theVar non viene dichiarata in modo esplicito, ma piuttosto in modo implicito o automatico. Le variabili dichiarate in modo implicito vengono specificate come tipo di dati Variant.

Suggerimento   Se si specifica un tipo di dati per una variabile o un argomento e quindi viene utilizzato un tipo di dati errato, verrà generato un errore. Per evitare gli errori relativi ai tipi di dati, è possibile utilizzare solo variabili implicite (tipo di dati Variant) oppure dichiarare in modo esplicito tute le variabili e quindi specificare un tipo di dati. È preferibile utilizzare quest'ultimo metodo.


Sintassi di Visual Basic

La sintassi riportata negli argomenti della Guida relativi a metodi, istruzioni o funzioni illustra tutti gli elementi necessari per utilizzare correttamente il metodo, l'istruzione o la funzione. Negli esempi seguenti viene illustrato come interpretare gli elementi della sintassi di utilizzo più frequente.

Sintassi del metodo Activate

oggetto.Activate

Nella sintassi del metodo Activate, la parola in corsivo "oggetto" è un segnaposto per le informazioni immesse dall'utente, in questo caso il codice che restituisce un oggetto. Le parole in grassetto devono essere digitate esattamente nella forma in cui compaiono. La seguente routine attiva la seconda finestra nel documento attivo.

Sub MakeActive()

Windows(2).Activate

End Sub

Sintassi della funzione MsgBox

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

Nella sintassi della funzione MsgBox, le parole in corsivo e grassetto sono argomenti predefiniti della funzione. Gli argomenti racchiusi tra parentesi quadre sono facoltativi. (Non digitare le parentesi quadre nel codice). Per la funzione MsgBox, l'unico argomento che è necessario specificare è il testo del messaggio (prompt).

Gli argomenti delle funzioni e dei metodi possono essere specificati nel codice in base alla posizione o al nome. Per specificare gli argomenti in base alla posizione, seguire l'ordine che appare nella sintassi, separando ciascun argomento con una virgola. Ad esempio:

MsgBox "La risposta è corretta",0,"Finestra delle risposte"

Per specificare un argomento in base al nome, utilizzare il nome dell'argomento seguito da due punti e dal segno di uguale (:=) e quindi dal relativo valore. È possibile specificare gli argomenti predefiniti in qualsiasi ordine. Ad esempio:

MsgBox Title:="Finestra delle risposte", Prompt:="La risposta è corretta"

Nella sintassi delle funzioni e di alcuni metodi, gli argomenti sono racchiusi tra parentesi. Tali funzioni e metodi restituiscono valori ed è quindi necessario inserire gli argomenti tra parentesi per assegnare il valore a una variabile. Se il valore restituito viene ignorato o non si desidera passare alcun argomento, è possibile non includere le parentesi. Non è necessario che gli argomenti di metodi che non restituiscono valori vengano inseriti tra parentesi. Queste regole sono valide sia per gli argomenti di posizione che per gli argomenti predefiniti.

Nell'esempio seguente, il valore restituito dalla funzione MsgBox è un numero che indica il pulsante selezionato memorizzato nella variabile myVar. Dato che il valore restituito viene utilizzato, sono richieste le parentesi. Il valore della variabile viene quindi visualizzato in un'altra finestra di messaggio.

Sub Question()

myVar = MsgBox(Prompt:="Mi piace il mio lavoro.", _

Title:="Finestra delle risposte", Buttons:="4")

MsgBox myVar

End Sub

Sintassi dell'istruzione Option

Option Compare {Binary | Text | Database}

Nella sintassi dell'istruzione Option Compare, le parentesi graffe e la barra verticale indicano una scelta obbligata tra tre elementi. (Non digitare le parentesi graffe nell'istruzione di Visual Basic). Ad esempio, la seguente istruzione specifica che, all'interno del modulo, il confronto tra le stringhe verrà eseguito in base a un tipo di ordinamento in cui non viene fatta distinzione tra maiuscole e minuscole.

Option Compare Text

Sintassi dell'istruzione Dim

Dim nomevariabile[([indici])] [As tipo] [, nomevariabile[([indici])] [As tipo]] . . .

Nella sintassi dell'istruzione Dim, la parola Dim è una parola chiave obbligatoria. L'unico elemento obbligatorio è nomevariabile. Ad esempio, l'istruzione seguente crea le tre variabili myVar, nextVar e thirdVar, che vengono automaticamente dichiarate come variabili Variant.

Dim myVar, nextVar, thirdVar

Nell'esempio seguente una variabile viene dichiarata come di tipo String. Se viene specificato un tipo di dati sarà possibile risparmiare memoria e verrà semplificata la ricerca di errori nel codice.

Dim myAnswer As String

Per dichiarare numerose variabili in un'istruzione, è possibile includere il tipo di dati per ciascuna variabile. Le variabili dichiarate senza specificare un tipo di dati vengono automaticamente dichiarate come Variant.

Dim x As Integer, y As Integer, z As Integer

Nell'istruzione seguente a x e y viene assegnato il tipo di dati Variant. Solo a z è assegnato il tipo di dati Integer.

Dim x, y, z As Integer

Se viene dichiarata una variabile matrice, è necessario includere le parentesi. Gli indici sono facoltativi. Nell'istruzione seguente viene dimensionata la matrice dinamica myArray.

Dim myArray()


Utilizzo delle matrici

È possibile dichiarare una matrice per lavorare con un gruppo di valori appartenenti allo stesso tipo di dati. Una matrice è una variabile singola che include numerose sezioni in cui è possibile memorizzare valori, mentre in genere una variabile ha un unica sezione in cui viene memorizzato un valore singolo. Per fare riferimento a tutti i valori contenuti in una matrice, è possibile fare riferimento all'intera matrice oppure ai relativi singoli elementi.

Ad esempio, se si desidera memorizzare le spese quotidiane per ogni giorno dell'anno, è possibile dichiarare una variabile matrice con 365 elementi, anziché 365 variabili. Ciascun elemento di una matrice contiene un valore. Nell'istruzione seguente viene dichiarata la variabile matrice curExpense contenente 365 elementi. Per impostazione predefinita, una matrice viene indicizzata a partire da zero e quindi il limite superiore della matrice corrisponde a 364 anziché a 365.

Dim curExpense(364) As Currency

Per impostare il valore di un elemento singolo, è possibile specificarne l'indice. Nell'esempio seguente a ciascun elemento della matrice viene assegnato un valore iniziale 20.

Sub FillArray()

Dim curExpense(364) As Currency

Dim intI As Integer

For intI = 0 to 364

curExpense(intI) = 20

Next

End Sub

Modifica del limite inferiore

Per modificare l'indice predefinito del primo elemento da 0 a 1, è possibile utilizzare l'istruzione Option Base nella parte iniziale di un modulo. Nell'esempio seguente l'istruzione Option Base modifica l'indice per il primo elemento e l'istruzione Dim dichiara la variabile matrice curExpense contenente 365 elementi.

Option Base 1

Dim curExpense(365) As Currency

Per impostare in modo esplicito il limite inferiore di una matrice è inoltre possibile utilizzare una proposizione To, come è illustrato nell'esempio seguente.

Dim curExpense(1 To 365) As Currency

Dim strWeekday(7 To 13) As String

Memorizzazione di valori Variant nelle matrici

Esistono due modi per creare matrici di valori Variant. Il primo modo consiste nel dichiarare una matrice di un tipo di dati Variant, come illustrato nell'esempio seguente:

Dim varData(3) As Variant

varData(0) = "Claudia Leocata"

varData(1) = "Via Lione 8"

varData(2) = 38

varData(3) = Format("06/09/1952", "General Date")

L'altro modo consiste nell'assegnare la matrice restituita dalla funzione Array a una variabile Variant, come illustrato nell'esempio seguente.

Dim varData As Variant

varData = Array("Massimo Guerra", "Via San Potito 35", 38, _

Format("06/09/1952", "General Date"))

Gli elementi di una matrice di valori Variant vengono identificati in base all'indice, indipendentemente dalla tecnica utilizzata per la creazione della matrice. L'istruzione seguente può, ad esempio, essere aggiunta a entrambi gli esempi precedenti.

MsgBox "I dati per " & varData(0) & " sono stati registrati."

Utilizzo di matrici multidimensionali

In Visual Basic, è possibile dichiarare matrici che includono fino a 60 dimensioni. L'istruzione seguente dichiara, ad esempio, una matrice a due dimensioni, ovvero 5 per 10.

Dim sngMulti(1 To 5, 1 To 10) As Single

Il primo argomento rappresenta le righe e il secondo le colonne.

Per elaborare le matrici multidimensionali, è possibile utilizzare istruzioni For...Next nidificate. L'istruzione seguente riempie una matrice a due dimensioni con valori Single.

Sub FillArrayMulti()

Dim intI As Integer, intJ As Integer

Dim sngMulti(1 To 5, 1 To 10) As Single

' Riempie la matrice di valori.

For intI = 1 To 5

For intJ = 1 To 10

sngMulti(intI, intJ) = intI * intJ

Debug.Print sngMulti(intI, intJ)

Next intJ

Next intI

End Sub


Utilizzo delle costanti

Il codice può spesso contenere valori costanti che ricorrono di frequente oppure può dipendere da numeri difficili da ricordare il cui significato non è immediatamente chiaro. È possibile semplificare la lettura e la gestione del codice mediante l'utilizzo delle costanti. Una costante è un nome significativo che sostituisce un numero o una stringa alla quale non vengono apportate modifiche. A differenza di quanto accade per le variabili, non è possibile modificare una costante o assegnarvi un nuovo valore.

Esistono tre tipi di costanti:

•	Le costanti intrinseche o definite dal sistema vengono fornite dalle applicazioni e dai controlli. Un elenco di costanti che è possibile utilizzare con i relativi oggetti, metodi e proprietà è fornito da altre applicazioni che dispongono di librerie degli oggetti, quali Microsoft Access, Microsoft Excel Microsoft Project e Microsoft Word. È possibile visualizzare l'elenco delle costanti fornite per le singole librerie di oggetti nel Visualizzatore oggetti.

Le costanti di Visual Basic sono elencate nelle librerie degli oggetti di Visual Basic (VB), Visual Basic, Applications Edition (VBA) e Data Access Object (DAO).

Nota   Visual Basic continua a riconoscere le costanti nelle applicazioni create nelle versioni precedenti di Visual Basic o di Visual Basic, Applications Edition. È possibile scegliere di aggiornare le costanti sostituendole con quelle elencate nel Visualizzatore oggetti. Non è necessario dichiarare nell'applicazione le costanti elencate nel Visualizzatore oggetti.

•	Le costanti simboliche o definite dall'utente vengono dichiarate tramite l'istruzione Const.

•	Le costanti di compilazione condizionale vengono dichiarate tramite l'istruzione #Const.

Nelle precedenti versioni di Visual Basic, i nomi delle costanti sono in maiuscolo con caratteri di sottolineatura. Ad esempio:

TILE_HORIZONTAL

Le costanti intrinseche vengono ora qualificate in modo da evitare di confonderle con le costanti aventi lo stesso nome ma con valore diverso esistenti in librerie degli oggetti diverse. Esistono due modi per qualificare i nomi delle costanti:

•	Tramite il prefisso

•	Tramite il riferimento alla libreria

Qualifica delle costanti tramite il prefisso

Le costanti intrinseche fornite da tutti gli oggetti hanno iniziali maiuscole e un prefisso di due caratteri minuscoli che indica la libreria degli oggetti in cui è definita la costante. Le costanti delle librerie degli oggetti per Visual Basic e Visual Basic, Applications Edition sono contraddistinte dal prefisso "vb". Le costanti della libreria degli oggetti DAO sono contraddistinte dal prefisso "db" e le costanti della libreria degli oggetti per Microsoft Excel hanno un prefisso "xl". Nell'esempio seguente viene illustrato come i prefissi per i controlli possano variare a seconda della libreria dei tipi.

•	vbTileHorizontal

•	xlDialogBorder

Qualifica delle costanti tramite il riferimento alla libreria

È inoltre possibile qualificare il riferimento ad una costante tramite la seguente sintassi:

[nomelib.] [nomemodulo.]nomecostante

La sintassi per la qualifica delle costanti è composta dalle seguenti parti:

Parte	Descrizione
nomelib	Facoltativa. Nome della libreria dei tipi che definisce la costante. Per la maggior parte dei controlli aggiuntivi, questo nome corrisponde al nome di classe del controllo Non disponibile in Macintosh. Se non si ricorda il nome del controllo, è sufficiente posizionare il puntatore del mouse sul controllo nella casella degli strumenti. Il nome di classe sarà indicato nella descrizione comandi visualizzata.
nomemodulo	Facoltativa. Nome del modulo all'interno della libreria dei tipi che definisce la costante. È possibile individuare il nome del modulo tramite il Visualizzatore oggetti.
nomecostante	Nome definito per la costante nella libreria dei tipi.
Ad esempio:

Threed.LeftJustify


Utilizzo dei tipi di dati in modo efficiente

Se non viene specificato diversamente, alle variabili non dichiarate viene assegnato il tipo di dati Variant. Questo tipo di dati semplifica la scrittura dei programmi, ma non è sempre il tipo di dati più appropriato.

È consigliabile utilizzare altri tipi di dati se:

•	Il programma è di notevoli dimensioni e utilizza numerose variabili.

•	Il programma deve essere eseguito il più rapidamente possibile.

•	I dati vengono scritti direttamente in file ad accesso casuale.

Oltre al tipo Variant, gli altri tipi di dati supportati sono: Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object e String. Utilizzare l'istruzione Dim per dichiarare una variabile di tipo specifico. Ad esempio:

Dim X As Integer

Questa istruzione dichiara che la variabile X è di tipo Integer, ovvero un numero intero compreso tra –32.768 e 32.767. Se si cerca di impostare X su un numero non incluso nell'intervallo, verrà generato un errore. Se si cerca di impostare X su una frazione, il numero verrà arrotondato. Ad esempio:

X = 32768	' Produce un errore.

X = 5.9	' Imposta x su 6.


Utilizzo di istruzioni Do...Loop

Le istruzioni Do...Loop consentono di eseguire un blocco di istruzioni per un numero indefinito di volte. Le istruzioni vengono ripetute fino a quando una condizione è True o fino a quando non diventa True.

Ripetizione delle istruzioni fino a quando una condizione è True

Per verificare una condizione all'interno di un'istruzione Do...Loop, è possibile utilizzare la parola chiave While in due modi. È possibile verificare la condizione prima di avviare il ciclo oppure dopo che il ciclo è stato eseguito almeno una volta.

Nella seguente routine ChkFirstWhile la condizione viene verificata prima dell'avvio del ciclo. Se myNum viene impostata su 9 anziché su 20, le istruzioni nel ciclo non verranno eseguite. Nella routine ChkLastWhile le istruzioni all'interno del ciclo verranno eseguite solo una volta prima che la condizione diventi False.

Sub ChkFirstWhile()

counter = 0

myNum = 20

Do While myNum > 10

myNum = myNum - 1

counter = counter + 1

Loop

MsgBox "Il ciclo è stato eseguito " & counter & " volte."

End Sub

Sub ChkLastWhile()

counter = 0

myNum = 9

Do

myNum = myNum - 1

counter = counter + 1

Loop While myNum > 10

MsgBox "Il ciclo è stato eseguito " & counter & " volte."

End Sub

Ripetizione delle istruzioni fino a quando una condizione non diventa True

Per verificare una condizione all'interno di un'istruzione Do...Loop, è possibile utilizzare la parola chiave Until in due modi. È possibile verificare la condizione prima di avviare il ciclo (come illustrato nella routine ChkFirstUntil) oppure dopo che il ciclo è stato eseguito almeno una volta (come illustrato nella routine ChkLastUntil). La ripetizione del ciclo prosegue fino a quando la condizione rimane False.

Sub ChkFirstUntil()

counter = 0

myNum = 20

Do Until myNum = 10

myNum = myNum - 1

counter = counter + 1

Loop

MsgBox "Il ciclo è stato eseguito " & counter & " volte."

End Sub

Sub ChkLastUntil()

counter = 0

myNum = 1

Do

myNum = myNum + 1

counter = counter + 1

Loop Until myNum = 10

MsgBox "Il ciclo è stato eseguito " & counter & " volte."

End Sub

Uscita da un'istruzione Do...Loop dall'interno del ciclo

Per uscire da un'istruzione Do...Loop, è possibile utilizzare l'istruzione Exit Do. Ad esempio, per uscire da un ciclo ripetuto all'infinito, è possibile utilizzare l'istruzione Exit Do nel gruppo di istruzioni True di un'istruzione If...Then...Else oppure Select Case. Se la condizione è False, il ciclo verrà eseguito come di norma.

Nell'esempio seguente a myNum viene assegnato un valore che crea un ciclo ripetuto all'infinito. L'istruzione If...Then...Else verifica la condizione e quindi esce, evitando che il ciclo venga ripetuto all'infinito.

Sub ExitExample()

counter = 0

myNum = 9

Do Until myNum = 10

myNum = myNum - 1

counter = counter + 1

If myNum < 10 Then Exit Do

Loop

MsgBox "Il ciclo è stato eseguito " & counter & " volte."

End Sub

Nota   Per interrompere un ciclo infinito, premere ESC o CTRL+INTERR.


Utilizzo di istruzioni For...Next

Le istruzioni For...Next consentono di ripetere un blocco di istruzioni per il numero di volte specificato. Nei cicli For viene utilizzata una variabile contatore il cui valore viene incrementato o diminuito ogni volta che il ciclo si ripete.

La seguente routine fa sì che nel computer venga emesso un segnale acustico 50 volte. L'istruzione For specifica la variabile contatore x e i relativi valori di inizio e di fine. L'istruzione Next incrementa la variabile contatore di 1.

Sub Beeps()

For x = 1 To 50

Beep

Next x

End Sub

La parola chiave Step consente di incrementare o diminuire la variabile contatore in base al valore specificato. Nell'esempio seguente, la variabile contatore j viene incrementata di 2 ad ogni ripetizione del ciclo. Al termine del ciclo, total rappresenta la somma di 2, 4, 6, 8 e 10.

Sub TwosTotal()

For j = 2 To 10 Step 2

total = total + j

Next j

MsgBox "Il totale è " & total

End Sub

Per diminuire la variabile contatore, è possibile utilizzare un valore Step negativo ed è necessario specificare un valore finale inferiore a quello iniziale. Nell'esempio seguente, la variabile contatore myNum viene diminuita di 2 ad ogni ripetizione del ciclo. Al termine del ciclo, total rappresenta la somma di 16, 14, 12, 10, 8, 6, 4 e 2.

Sub NewTotal()

For myNum = 16 To 2 Step -2

total = total + myNum

Next myNum

MsgBox "Il totale è " & total

End Sub

Nota   Non è necessario includere il nome della variabile contatore dopo l'istruzione Next. Negli esempi precedenti esso è stato incluso per semplificare la leggibilità.

Per uscire da istruzioni For...Next prima che il contatore raggiunga il valore finale, è possibile utilizzare l'istruzione Exit For. Ad esempio, quando viene generato un errore, utilizzare l'istruzione Exit For nel gruppo di istruzioni che danno come risultato True di un'istruzione If...Then...Else o Select Case che controlla in modo specifico l'errore. Se l'errore non viene generato, l'istruzione If…Then…Else dà come risultato False e il ciclo continuerà a essere eseguito come previsto.


Utilizzo di istruzioni For Each...Next

Le istruzioni For Each...Next consentono di ripetere un blocco di istruzioni per ogni oggetto di un insieme o per ciascun elemento di una matrice. Ogni volta che viene eseguito il ciclo, verrà impostata automaticamente una variabile. Ad esempio, la seguente routine chiude tutti i form eccetto quello contenente la routine in esecuzione.

Sub CloseForms()

For Each frm In Application.Forms

If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close

Next

End Sub

Il codice seguente imposta il valore di ciascun elemento di una matrice sul valore della variabile indice I.

Dim TestArray(10) As Integer, I As Variant

For Each I In TestArray

TestArray(I) = I

Next I

Esecuzione di cicli in intervalli di celle

L'istruzione For Each...Next consente di scorrere in modo ciclico all'interno di un intervallo di celle. La seguente routine esegue un ciclo nell'intervallo di celle A1:D10 di Sheet1 e imposta su 0 (zero) qualsiasi numero con valore assoluto inferiore a 0,01.

Sub RoundToZero()

For Each myObject in myCollection

If Abs(myObject.Value) < 0.01 Then myObject.Value = 0

Next

End Sub

Uscita da un ciclo For Each...Next prima che venga terminato

Per uscire da un ciclo For Each...Next, è possibile utilizzare l'istruzione Exit For. Se, ad esempio, viene generato un errore, utilizzare l'istruzione Exit For nel blocco di istruzioni impostate su True di un'istruzione If...Then...Else o Select Case che verifica in modo specifico la presenza dell'errore. Se non viene generato alcun errore, l'istruzione If…Then…Else sarà False e l'esecuzione del ciclo verrà proseguita nel modo previsto.

Nell'esempio seguente viene cercata la prima cella dell'intervallo A1:B5 che non contiene numeri. Se la cella viene trovata, verrà visualizzato un messaggio e l'istruzione Exit For consentirà di uscire dal ciclo.

Sub TestForNumbers()

For Each myObject In MyCollection

If IsNumeric(myObject.Value) = False Then

MsgBox "L'oggetto contiene un valore non numerico."

Exit For

End If

Next c

End Sub


Utilizzo di istruzioni If...Then...Else

Le istruzioni If...Then...Else consentono l'esecuzione di un'istruzione specifica o di un blocco di istruzioni, in base al valore di una condizione. Le istruzioni If...Then...Else possono essere nidificate fino al livello desiderato. Tuttavia, per motivi di leggibilità, è consigliabile utilizzare un'istruzione Select Case anziché più livelli di istruzioni If...Then...Else nidificate.

Esecuzione di istruzioni quando una condizione è True

Per eseguire una singola istruzione quando una condizione è True, è possibile utilizzare la sintassi a riga singola dell'istruzione If...Then...Else, illustrata nell'esempio seguente. In questo caso la parola chiave Else viene omessa.

Sub FixDate()

myDate = #2/13/95#

If myDate < Now Then myDate = Now

End Sub

Per eseguire più righe di codice, è necessario utilizzare la sintassi a blocco, che include l'istruzione End If, come illustrato nel seguente esempio:

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = "Rosso"

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

End If

End Sub

Esecuzione di determinate istruzioni se una condizione è True e di altre istruzioni se è False

Le istruzioni If...Then...Else consentono di definire due blocchi di istruzioni eseguibili. Un blocco viene eseguito se la condizione è True e l'altro blocco viene eseguito se la condizione è False.

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = vbRed

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

Else

AlertLabel.Forecolor = vbBlack

AlertLabel.Font.Bold = False

AlertLabel.Font.Italic = False

End If

End Sub

Verifica di una seconda condizione se la prima condizione è False

È possibile aggiungere a un'istruzione If...Then...Else istruzioni ElseIf che consentono di verificare una seconda condizione se la prima condizione risulta False. La seguente routine di funzioni calcola, ad esempio, un premio da assegnare in base alla classifica dei rendimenti. L'istruzione successiva all'istruzione Else viene eseguita se le condizioni di tutte le istruzioni If e ElseIf risultano False.

Function Bonus(performance, salary)

If performance = 1 Then

Bonus = salary * 0.1

ElseIf performance = 2 Then

Bonus = salary * 0.09

ElseIf performance = 3 Then

Bonus = salary * 0.07

Else

Bonus = 0

End If

End Function


Utilizzo delle parentesi nel codice

Le routine Sub, le istruzioni predefinite e alcuni metodi non restituiscono un valore e quindi gli argomenti non vengono inseriti tra parentesi. Ad esempio:

MySub "Argomentostringa", integerArgument

Le routine Function, le funzioni predefinite e alcuni metodi restituiscono un valore, che tuttavia può essere ignorato. Se il valore viene ignorato, è possibile non includere le parentesi e richiamare la funzione nello stesso modo in cui viene richiamata una routine Sub. Omettere le parentesi, elencare gli eventuali argomenti e non assegnare la funzione a una variabile. Ad esempio:

MsgBox "Attività completata", 0, "Finestra attività"

Per utilizzare il valore restituito da una funzione, è possibile inserire gli argomenti tra parentesi, come illustrato nel seguente esempio.

Answer3 = MsgBox("Ti piace il tuo lavoro?", 4, "Domanda 3")

Un'istruzione di una routine Sub o Function può passare valori a una routine specifica mediante l'utilizzo di argomenti predefiniti. Le istruzioni relative all'utilizzo delle parentesi sono valide anche in questo caso. Se vengono utilizzati argomenti predefiniti, è possibile elencarli nell'ordine desiderato e omettere gli argomenti facoltativi. Gli argomenti predefiniti sono sempre seguiti da due punti e da un segno di uguale (:=) e quindi dal relativo valore.

Nell'esempio seguente la funzione MsgBox viene richiamata utilizzando argomenti predefiniti, ma il valore restituito viene ignorato:

MsgBox Title:="Finestra attività", Prompt:="Attività completata"

Nell'esempio seguente la funzione MsgBox viene richiamata utilizzando gli argomenti predefiniti e il valore restituito viene assegnato alla variabile answer3:

answer3 = MsgBox(Title:="Domanda 3", _

Prompt:="Sei soddisfatto del tuo stipendio?", Buttons:=4)


Utilizzo di istruzioni Select Case

L'istruzione Select Case può essere utilizzata in alternativa a ElseIf in istruzioni If...Then...Else quando viene effettuato un confronto tra un'espressione e vari valori diversi. Mentre le istruzioni If...Then...Else sono in grado di valutare un'espressione diversa per ciascuna istruzione ElseIf, l'istruzione Select Case valuta un'espressione una sola volta, all'inizio della struttura di controllo.

Nell'esempio seguente, l'istruzione Select Case valuta l'argomento performance passato alla routine. Si noti che ciascuna istruzione Case può contenere più valori, un intervallo di valori e operatori di confronto. L'istruzione facoltativa Case Else viene eseguita se l'istruzione Select Case non trova un valore corrispondente in nessuna delle istruzioni Case.

Function Bonus(performance, salary)

Select Case performance

Case 1

Bonus = salary * 0.1

Case 2, 3

Bonus = salary * 0.09

Case 4 To 6

Bonus = salary * 0.07

Case Is > 8

Bonus = 100

Case Else

Bonus = 0

End Select

End Function


Utilizzo di istruzioni With

L'istruzione With consente di specificare una sola volta un oggetto o un tipo definito dall'utente per un'intera serie di istruzioni. Le istruzioni With rendono più veloci le routine e consentono di evitare la ripetitività nella digitazione.

Nell'esempio seguente un intervallo di celle viene riempito con il numero 30, viene applicata la formattazione in grassetto e viene impostato il colore giallo per la parte interna delle celle.

Sub FormatRange()

With Worksheets("Sheet1").Range("A1:C10")

.Value = 30

.Font.Bold = True

.Interior.Color = RGB(255, 255, 0)

End With

End Sub

Per migliorare il livello di efficienza, è possibile nidificare le istruzioni With. Nell'esempio seguente viene inserita una formula nella cella A1 e quindi viene formattato il tipo di carattere.

Sub MyInput()

With Workbooks("Book1").Worksheets("Sheet1").Cells(1, 1)

.Formula = "=SQRT(50)"

With .Font

.Name = "Arial"

.Bold = True

.Size = 8

End With

End With

End Sub


Convenzioni di denominazione di Visual Basic

Per la denominazione di routine, costanti, variabili e argomenti all'interno di un modulo di Visual Basic, è necessario utilizzare le seguenti regole:

•	Il primo carattere deve essere rappresentato da una lettera.

•	Nel nome non è consentito utilizzare spazi, punti (.), punti esclamativi (!) o i caratteri @, &, $, #.

•	La lunghezza del nome non può essere superiore a 255 caratteri.

•	In genere non è consigliabile utilizzare nomi uguali a quelli di funzioni, istruzioni e metodi di Visual Basic. In questo modo verrebbero creati duplicati di parole chiave uguali nel linguaggio. Per utilizzare una funzione, un'istruzione o un metodo intrinseco che entra in conflitto con un nome assegnato, è necessario identificarlo in modo esplicito. Far quindi precedere la funzione, l'istruzione o il metodo dal nome della libreria dei tipi associata. Se, ad esempio, viene utilizzata una variabile denominata Left, l'unico modo possibile per richiamare la funzione Left sarà utilizzare VBA.Left.

•	Non è possibile ripetere nomi con lo stesso livello di area di validità. Non è possibile, ad esempio, dichiarare due variabili denominate age all'interno della stessa routine. È tuttavia possibile dichiarare una variabile privata denominata age e una variabile a livello di routine denominata age all'interno dello stesso modulo.

Nota   In Visual Basic non viene fatta distinzione tra maiuscole e minuscole, ma l'uso delle maiuscole viene mantenuto nell'istruzione in cui il nome è stato dichiarato.


Utilizzo di applicazioni diverse

In Visual Basic è possibile creare nuovi oggetti e recuperare oggetti esistenti da numerose applicazioni Microsoft. Anche altre applicazioni possono includere oggetti che è possibile creare utilizzando Visual Basic. Per ulteriori informazioni, vedere la documentazione dell'applicazione specifica.

Per creare un nuovo oggetto o recuperare un oggetto esistente da un'altra applicazione, è possibile utilizzare le funzioni CreateObject o GetObject:

' Avvia Microsoft Excel e crea un nuovo oggetto

' Worksheet.

Set ExcelWorksheet = CreateObject("Excel.Sheet")

' Avvia Microsoft Excel e apre un oggetto Worksheet

' esistente.

Set ExcelWorksheet = GetObject("SHEET1.XLS")

' Avvia Microsoft Word.

Set WordBasic = CreateObject("Word.Basic")

Nella maggior parte delle applicazioni è disponibile un metodo Exit o Quit che consente di chiudere l'applicazione indipendentemente dal fatto che sia visibile o meno. Per ulteriori informazioni sugli oggetti, i metodi e le proprietà disponibili in un'applicazione, vedere la documentazione dell'applicazione specifica.

In alcune applicazioni è possibile utilizzare la parola chiave New per creare un oggetto di qualsiasi classe esistente nella libreria dei tipi corrispondente. Ad esempio:

Dim X As New Field

In questo caso, Field è un esempio di una classe disponibile nella libreria dei tipi di accesso ai dati. Questa sintassi consente di creare una nuova istanza di un oggetto Field. Per informazioni sulle classi di oggetti che è possibile creare utilizzando questa sintassi, vedere la documentazione dell'applicazione.


Scrittura di una routine Function

Una routine Function è una serie di istruzioni di Visual Basic racchiusa tra l'istruzione Function e l'istruzione End Function. Una routine Function è simile a una routine Sub, ma a differenza di quest'ultima può restituire un valore. Può inoltre includere argomenti, quali costanti, variabili o espressioni, che le vengono passati da una routine di chiamata. Se una routine Function non include alcun argomento, l'istruzione Function corrispondente deve contenere un gruppo vuoto di parentesi. Una funzione restituisce un valore se al relativo nome viene assegnato un valore in una o più istruzioni della routine.

Nell'esempio seguente, la funzione Celsius calcola i gradi Celsius dai gradi Fahrenheit. Quando la funzione viene richiamata dalla routine Main, alla funzione viene passata una variabile contenente il valore dell'argomento. Il risultato del calcolo viene restituito alla routine di chiamata e visualizzato in una finestra di messaggio.

Sub Main()

temp = Application.InputBox(Prompt:= _

"Immettere la temperatura in gradi F.", Type:=1)

MsgBox "La temperatura è " & Celsius(temp) & " gradi C."

End Sub

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function


Scrittura di una routine Property

Una routine Property è una serie di istruzioni di Visual Basic che consente allo sviluppatore di creare e gestire proprietà personalizzate.

•	Le routine Property consentono di creare proprietà di sola lettura per i form, i moduli standard e i moduli di classe.

•	È consigliabile utilizzare le routine Property anziché le variabili Public nel codice che deve essere eseguito dopo aver impostato il valore delle proprietà.

•	A differenza delle variabili Public, alle routine Property possono essere assegnate stringhe della Guida nel Visualizzatore oggetti.

Quando viene creata una routine Property, essa diventa una proprietà del modulo contenente la routine. In Visual Basic sono disponibili i tre tipi seguenti di routine Property:

Routine	Descrizione
Property Let	Routine che imposta il valore di una proprietà.
Property Get	Routine che restituisce il valore di una proprietà.
Property Set	Routine che imposta un riferimento a un oggetto.
La sintassi per la dichiarazione di una routine Property è composta dalle seguenti parti:

[Public | Private] [Static] Property {Get | Let | Set} nomeproprietà_ [(argomenti)] [As tipo]

istruzioni

End Property

Le routine Property vengono in genere utilizzate a coppie: Property Let con Property Get e Property Set con Property Get. La dichiarazione di una singola routine Property Get equivale a dichiarare una proprietà di sola lettura. L'utilizzo congiunto dei tre tipi di routine Property risulta utile solo per le variabili Variant poiché solo un tipo di dati Variant può contenere un oggetto e informazioni relative ad altri tipi di dati. Property Set è destinato all'utilizzo con gli oggetti, mentre Property Let non lo è.

Nella tabella seguente sono riportati gli argomenti obbligatori per le dichiarazioni di routine Property:

Routine	Sintassi della dichiarazione
Property Get	Property Get nomeprop(1, …, n) As type
Property Let	Property Let nomeprop(1, …,,,, n, n+1)
Property Set	Property Set nomeprop(1, …, n, n+1)
Il primo argomento e quindi il successivo, fino all'ultimo argomento (1, …, n), devono condividere gli stessi nomi e gli stessi tipi di dati in tutte le routine Property con lo stesso nome.

La dichiarazione di una routine Property Get richiede un argomento in meno rispetto alle dichiarazioni delle routine Property Let e Property Set correlate. Il tipo di dati della routine Property Get deve essere lo stesso dell'ultimo argomento (n+1) nelle dichiarazioni delle routine Property Let e Property Set correlate. Se, ad esempio, viene dichiarata la seguente routine Property Let, nella dichiarazione della routine Property Get dovranno essere utilizzati argomenti con lo stesso nome e lo stesso tipo di dati degli argomenti della routine Property Let.

Property Let Names(intX As Integer, intY As Integer, varZ As Variant)

‘ Istruzioni.

End Property

Property Get Names(intX As Integer, intY As Integer) As Variant

‘ Istruzioni.

End Property

Il tipo di dati dell'ultimo argomento nella dichiarazione di una routine Property Set deve essere un tipo di oggetto o un valore Variant.


Scrittura di una routine Sub

Una routine Sub è una serie di istruzioni di Visual Basic racchiusa tra le istruzioni Sub e End Sub e che esegue azioni ma non restituisce un valore. Può includere argomenti, quali costanti, variabili o espressioni che vengono passati da una routine di chiamata. Se una routine Sub non include alcun argomento, l'istruzione Sub corrispondente deve contenere un gruppo vuoto di parentesi.

La seguente routine Sub include commenti che forniscono spiegazioni su ciascuna riga.

' Dichiara una routine denominata GetInfo

' Questa routine Sub non include alcun argomento

Sub GetInfo()

' Dichiara una variabile stringa denominata answer

Dim answer As String

' Assegna il valore restituito dalla funzione InputBox

' ad answer

answer = InputBox(Prompt:="Come ti chiami?")

' Istruzione If...Then...Else condizionale

If answer = Empty Then

' Richiama la funzione MsgBox

MsgBox Prompt:="Non è stato immesso il nome."

Else

' La funzione MsgBox è concatenata con la variabile answer

MsgBox Prompt:="Il nome è " & answer

' Termina l'istruzione If...Then...Else

End If

' Termina la routine Sub

End Sub


Scrittura di istruzioni di assegnazione

Le istruzioni di assegnazione consentono di assegnare un valore o un'espressione a una variabile o a una costante. Includono un segno di uguale (=). Nell'esempio seguente il valore restituito dalla funzione InputBox viene assegnato alla variabile yourName.

Sub Question()

Dim yourName As String

yourName = InputBox("Come ti chiami?")

MsgBox "Il tuo nome è " & yourName

End Sub

L'istruzione Let è facoltativa e viene in genere omessa. Ad esempio, la precedente istruzione di assegnazione può essere scritta nel modo seguente:

Let yourName = InputBox("Come ti chiami?").

L'istruzione Set consente di assegnare un oggetto a una variabile che è stata dichiarata come oggetto. È richiesta la parola chiave Set. Nell'esempio seguente, l'istruzione Set assegna un intervallo di Sheet1 alla variabile oggetto myCell:

Sub ApplyFormat()

Dim myCell As Range

Set myCell = Worksheets("Sheet1").Range("A1")

With myCell.Font

.Bold = True

.Italic = True

End With

End Sub

Le istruzioni che impostano i valori di proprietà sono anch'esse istruzioni di assegnazione. Nell'esempio seguente viene impostata la proprietà Bold dell'oggetto Font per la cella attiva:

ActiveCell.Font.Bold = True


Scrittura di istruzioni di dichiarazione

Le istruzioni di dichiarazione consentono di assegnare un nome e definire routine, variabili, matrici e costanti. Quando viene dichiarata una routine, una variabile o una costante, viene inoltre definita la relativa area di validità in base alla posizione della dichiarazione e alle parole chiave utilizzate.

Nell'esempio seguente sono incluse tre dichiarazioni.

Sub ApplyFormat()

Const limit As Integer = 33

Dim myCell As Range

' Altre istruzioni

End Sub

L'istruzione Sub (con l'istruzione corrispondente End Sub) dichiara una routine denominata ApplyFormat. Tutte le istruzioni comprese tra le istruzioni Sub e End Sub vengono eseguite ogni volta che viene richiamata o eseguita la routine ApplyFormat.

•	Scrittura di una routine Sub

L'istruzione Const dichiara la costante limit e inoltre specifica un tipo di dati Integer e un valore di 33.

•	Dichiarazione di costanti

L'istruzione Dim dichiara la variabile myCell. Il tipo di dati è un oggetto, in questo caso un oggetto Range di Microsoft Excel. È possibile dichiarare una variabile come un qualsiasi oggetto disponibile nell'applicazione in uso. Le istruzioni Dim sono uno dei tipi di istruzioni utilizzati per le dichiarazioni di variabili. Tra le altre parole chiave disponibili per le dichiarazioni è possibile includere ReDim, Static, Public, Private e Const.

•	Dichiarazione di variabili


Scrittura di istruzioni eseguibili

Un'istruzione eseguibile consente di avviare un'operazione. Può, ad esempio, eseguire un metodo o una funzione e quindi spostarsi in modo ciclico o passare tra blocchi del codice. Le istruzioni eseguibili spesso includono operatori matematici o condizionali.

Nell'esempio seguente l'istruzione For Each...Next viene utilizzata per passare da una cella all'altra in un intervallo denominato MyRange del Sheet1 di una cartella di lavoro attiva di Microsoft Excel. La variabile c è una cella dell'insieme di celle incluso in MyRange.

Sub ApplyFormat()

Const limit As Integer = 33

For Each c In Worksheets("Sheet1").Range("MyRange").Cells

If c.Value > limit Then

With c.Font

.Bold = True

.Italic = True

End With

End If

Next c

MsgBox "Operazione completata"

End Sub

L'istruzione If...Then...Else nell'esempio controlla il valore della cella. Se il valore è maggiore di 33, l'istruzione With imposta le proprietà Bold e Italic dell'oggetto Font per la cella. Le istruzioni If...Then...Else vengono terminate con End If.

L'istruzione With può consentire di risparmiare immissioni poiché le istruzioni in essa contenute vengono eseguite automaticamente per l'oggetto successivo alla parola chiave With.

L'istruzione Next richiama la cella successiva nell'insieme di celle incluso in MyRange.

La funzione MsgBox (che visualizza una finestra di dialogo predefinita di Visual Basic) visualizza un messaggio che informa che l'esecuzione della routine Sub è stata completata.


Scrittura dei dati su file

Quando si utilizzano quantità considerevoli di dati, è in genere consigliabile scrivere o leggere i dati in un file. L'istruzione Open consente di creare i file e di accedervi direttamente. L'istruzione Open prevede tre tipi di accesso:

•	Accesso sequenziale (modalità Input, Output e Append), utilizzato in genere per la scrittura di semplici file di testo come registri di errori e report.

•	Accesso casuale (modalità Random), utilizzato per scrivere e leggere dati in un file senza che sia necessario chiuderlo. I file ad accesso casuale mantengono i dati in record e ciò semplifica l'individuazione delle informazioni.

•	Accesso binario (modalità Binary), utilizzato quando è necessario leggere o scrivere in ogni singolo byte di un file, ad esempio per l'archiviazione o la visualizzazione di un'immagine bitmap.

Nota   Non è consigliabile utilizzare l'istruzione Open per aprire tipi di file specifici di un'applicazione, quali un documento di Word, un foglio di lavoro di Microsoft Excel o un database di Microsoft Accesspoiché i file risulterebbero danneggiati.

Nella tabella seguente sono riportate le istruzioni in genere utilizzate per la scrittura e la lettura dei dati nei file.

Tipo di accesso	Scrittura dei dati	Lettura dei dati
Sequenziale	Print #, Write #	Input #
Casuale	Put	Get
Binario	Put	Get


Scrittura di istruzioni di Visual Basic

Un'istruzione di Visual Basic è un'istruzione completa, che può includere parole chiave, operatori, variabili, costanti e espressioni. Ogni istruzione appartiene a una delle tre categorie illustrate di seguito:

•	Istruzioni di dichiarazione, che assegnano un nome a una variabile, a una costante o a una routine e che possono inoltre specificare un tipo di dati.

Scrittura di istruzioni di dichiarazione

•	Istruzioni di assegnazione, che assegnano un valore o un'espressione a una variabile o a una costante.

Scrittura di istruzioni di assegnazione

•	Istruzioni eseguibili, che inizializzano operazioni. Queste istruzioni possono eseguire un metodo o una funzione e possono inoltre eseguire spostamenti ciclici o passaggi tra blocchi del codice. Le istruzioni eseguibili spesso includono operatori matematici o condizionali.

Scrittura di istruzioni eseguibili

Continuazione di un'istruzione su più righe

Per la scrittura di un'istruzione è in genere sufficiente una riga, ma è comunque possibile proseguire l'istruzione nella riga successiva mediante l'utilizzo di un carattere di continuazione riga. Nell'esempio seguente l'istruzione eseguibile MsgBox viene continuata su tre righe:

Sub DemoBox()  'Questa routine dichiara una variabile stringa,

' le assegna il valore Claudia e quindi

' visualizza un messaggio concatenato.

Dim myVar As String

myVar = "Claudia"

MsgBox Prompt:="Salve " & myVar, _

Title:="Finestra dei saluti", _

Buttons:=vbExclamation

End Sub

Aggiunta di commenti

L'inserimento di commenti consente di fornire spiegazioni relative a una routine o un'istruzione specifica a chiunque legga il codice. I commenti verranno ignorati dal programma durante l'esecuzione delle routine. Le righe di commento iniziano con un apostrofo (') o con Rem seguito da uno spazio e possono essere aggiunti in qualsiasi punto di una routine. Per aggiungere un commento nella stessa riga di un'istruzione, è possibile inserire un apostrofo dopo l'istruzione, seguito dal commento. Per impostazione predefinita, i commenti vengono visualizzati come testo di colore verde.

Controllo degli errori di sintassi

Se, dopo aver digitato una riga di codice, si preme INVIO e la riga viene visualizzata in colore rosso (a volte può anche comparire un messaggio di errore), è necessario verificare quale errore è stato commesso nella scrittura del codice e quindi correggerlo.


Utilizzo di Gestione aggiunte

Tramite la finestra di dialogo Gestione aggiunte è possibile caricare e scaricare aggiunte. Se si chiudono soltanto le parti visibili di un'aggiunta, ad esempio facendo doppio clic sul menu di sistema oppure clic sul pulsante di chiusura corrispondente, i form associati vengono rimossi dallo schermo, ma l'aggiunta verrà conservata in memoria fino a quando non viene scollegata tramite la finestra di dialogo Gestione aggiunte.