back to top

Guida VBA

In tutte le applicazioni della Suite di Microsoft Office, e altri prodotti tipo: Visio, Project, contengono un’implementazione di Visual Basic, denominata VBA (Visual Basic For Application). – L’unico svantaggio che ha il Visual Basic For Application, rispetto al Visual Basic, è quello di non poter essere utilizzato per la creazione di applicazioni stand-alone, sebbene esista, tra i due linguaggi di programmazione, un legame molto forte.

Il suo utilizzo, all’interno della Suite di Office, è quello di controllare tutti gli aspetti delle applicazioni e dei documenti di Office, anche da applicazioni differenti (es: da Excel si possono aprire documenti di word e leggerne i contenuti).

Per aspetto dell’applicazione intendiamo l’interfaccia grafica; attraverso VBA possiamo:

  1. manipolare Menu, barre degli strumenti (o toolbar);
  2. gestire tabelle di word, files,cartelle;
  3. gestire cartelle di lavoro di Excel;
  4. gestire l’accesso a database da qualsiasi applicazione di Office;
  5. molto altro..

Non ci resta di cominciare a imparare i principi basilari del funzionamento di VBA, il quale condivide, con il Visual Basic, gran parte dei suoi comandi e la sintassi, fermo restando l’unico svantaggio evidenziato nei paragrafi precedenti.

Le Macro

Le Macro sono una sequenza ordinata di operazioni, eseguite in modo automatico, grazie alla presenza del linguaggio di programmazione Visual Basic for Application. Abbiamo due metodi per creare una macro:

  1. attraverso lo strumento di Registratore di Macro, integrato in Word, Excel, PowerPoint;
  2. attraverso l’immissione diretta di codice VBA, all’interno dell’ambiente Visual Basic Editor. Di questo Editor ci occuperemo nei paragrafi successivi di questa guida.

L’Editor di Visual Basic è integrato in tutte le applicazioni di Office (Word, Excel, PowerPoint, Access).

Un aspetto importante legato alle macro è il livello di protezione. Ci domandiamo: perchè dobbiamo gestire il livello di protezione?.

La risposta è semplicissima: le macro, sebbene servono per aiutarci a svolgere operazioni noiose, sono potenziali virus per il nostro Personal Computer.

Aprire un documento con la presenza di macro, se il livello di protezione è basso, e per giunta non conoscessimo l’autore del documento, comporta un pericolo per il Pc:l’esecuzione automatica di macro pericolose.

Un modo, per evitare l’esecuzione automatica della macro, è quello di impostare un livello di protezione Medio.

All’interno di Word, ad esempio, per impostare il livello di protezione si va da Strumenti->Macro->Protezione:

Con il livello di protezione Medio si potrà decidere, all’apertura del documento, di poter attivare le macro contenute in esso, e quindi di poterle eseguire, oppure no.

Ecco cosa succede quando un documento viene aperto, e dovesse contenere all’interno delle macro:

Registrazione di una Macro

Abbiamo definito una macro, come una serie di operazioni ordinate, le quali vengono eseguite all’interno di un’applicazione della Suite di Office. Esse possono essere scritte con l’immissione diretta del codice VBA, attraverso l’Editor di Visual Basic integrato, oppure attraverso lo strumento di registratore macro. In questa sezione della guida spiegheremo la procedura passo passo per registrare una macro:

  1. Aprire l’applicazione di Office, dove tale strumento è attivo (Word, Excel, PowerPoint, ecc. ecc.);
  2. Andare da Strumenti->Macro->Registra nuova macro;
  1. Assegnare un nome alla macro e confermare con il pulsante Ok;
  2. Viene visualizzata una barra degli strumenti con due pulsanti:sospendi registrazione, interrompi registrazione;
  3. Eseguire delle operazioni con l’uso del mouse all’interno dell’applicativo;
  4. Premere il pulsante interrompi registrazione, al fine di esplorare con l’Editor integrato il codice generato in automatico.

Ho realizzato la registrazione di una macro per aprire un documento di Word. Ecco la procedura per vedere il codice generato:

  1. Da strumenti->Macro si possono esplorare tutte le macro registrate o create ex-novo;
  2. Premendo il pulsante Modifica si enterà nell’Editor integrato e potrete rendervi conto del codice generato.

Ecco rappresentato il codice generato dopo l’operazione di registrazione macro:

Ogni macro presenta la struttura:

Sub nomemacro
    ...
    ...
    ...
End Sub

Tra Sub ed End sub viene racchiuso il codice VBA generato oppure scritto ex-novo.

Editor integrato negli applicativi di Microsoft Office

In ogni applicativo della Suite di Office esiste un Editor integrato di Microsoft Visual Basic, attraverso il quale possiamo esplorare tutto il codice inserito, oppure registrato con lo strumento di registrazione macro.

L’Editor di Visual Basic, sebbene presenta la stessa interfaccia grafica, si presenta in tre modi differenti, a seconda dell’applicativo della Suite, che stiamo utilizzando:

Editor di Visual Basic per Word

Editor di Visual Basic per Excel

Editor di Visual Basic per Access

Risalta agli occhi un elemento di diversità: La finestra Esplora progetti, ma qui presentiamo le operazioni comuni all’interno dell’Editor integrato, partendo da quelle del Menu File.

Nel Menu file sono raccolte le seguenti azioni:

Nel menu Inserisci troviamo raccolte le azioni, per mezzo delle quali inseriremo tre oggetti fondamentali per un progetto VBA:

  1. Modulo standard:
  2. Modulo di classe:
  3. UserForm

Si definisce modulo standard, quel modulo di definizione e dichiarazione di routine o funzioni, tipi di dati, visibili a tutto il progetto per modalità predefinita.

Si definisce modulo di classe, quel modulo contenente la definizione di proprietà,metodi ed eventi per l’oggetto che sta creando.

Si definisce UserForm la c.d. ‘Maschera’ o finestra, sulla quale è possibile aggiungere dei controlli, presi da una casella degli strumenti che si attiverà.

L’altro menu chiave è quello Esegui:

Questo menu segue un comportamento particolare:

  1. Se per ipotesi non è stato aggiunto nessun modulo (standard) oppure nessuno UserForm, allora in esegui troveremo la voce Esegui Macro, altrimenti troveremo Esegui Sub/UserForm;
  2. In un’insieme di Subroutine o funzioni, se il cursore è attivo in una di queste, allora premendo, Esegui Sub/UserForm, verrà eseguita proprio quella subroutine o funzione;
  3. Se è attivo un UserForm, allora premendo il tasto di funzione F5, non sarà eseguita nessuna Subroutine, ma bensì visualizzato l’UserForm corrente.

Nel barra dei menu dell’Editor troviamo anche il punto di domanda. Cliccando sul punto di domanda abbiamo accesso alla guida in linea di riferimento per Visual Basic For Application.

Premendo il tasto di funzione F2 abbiamo accesso al Visualizzatore oggetti, utile se volessimo esplorare:

  1. tutti gli oggetti del progetto VBA creato;
  2. le librerie aggiunte come riferimento
  3. tutte le classi della libreria VBA, per mezzo della quale, premendo il tasto F1, conosceremo la sintassi di riferimento di molte istruzioni chiavi.
  4. tutto il modello ad oggetti dell’applicazione (tipo Word, Excel, Access) aperta.

Dati, tipi di dati, variabili, costanti

In ogni linguaggio di programmazione che si rispetti, ci troveremo a gestire una classe variegata di informazioni:

  1. numeri
  2. stringhe, ossia dati alfanumerici (composto da numeri e lettere);
  3. data e ora
  4. informazioni booleane (di tipo True oppure False)
  5. tipi di dati definiti dall’utente
  6. tipi di dati strutturati (array monodimensionali e pluridimensionali) Gli array pluridimensionali sono le matrici. Gli array ad una sola dimensione sono detti anche vettori.

Per gestire questo mixing di informazioni, nella creazione di programmi si richiede la memorizzazione dei valori in variabili.

Una variabile VBA è identificata da tre elementi:

  1. un nome con una serie di vincoli che poi vedremo;
  2. un valore;
  3. un tipo.

Ai fini di rendere il codice autodocumentato dobbiamo prestare attenzione a:

  1. inserire dei commenti alle procedure che stiamo realizzando. Basta inserire prima del commento un segno di apostrofo. Vedrete il commento colorato di verde;
  2. all’assegnazione di nomi alle variabili. Il nome della variabile vi deve evocare il contenuto che andrete a memorizzare. Es. areaquadrato, arearettangolo, cognome, nome, datanascita;
  3. non creare variabili a casaccio. Mi sto riferendo alla dichiarazione obbligatoria delle variabili, in modo da generare errore quando avete utilizzato una variabile e questa non sia stata dichiarata.

I vincoli ai quali si è assoggettati, per l’assegnazione di un nome ad una variabile sono:

  1. il nome non può essere superiore ai 255 caratteri;
  2. il nome non può contenere spazi o segni di punteggiatura o caratteri riservati dal linguaggio stesso (es: operatori aritmetici di cui parleremo);
  3. non può iniziare con un numero.

A differenza del linguaggio C o C++, il VBA essendo di derivazione stretta del Visual Basic, nella scrittura del nome di una variabile, possiamo editarlo maiuscolo, o minuscolo, sarà sempre riscritto come viene dichiarato. Si dice che i nomi sono considerati ‘case insensitive’.

Per dichiarare una variabile si utilizza l’istruzione Dim:

Dim Nome as Tipo

In contrapposizione con le variabili, le informazioni, che non saranno soggetti a cambiamenti nel corso di esecuzione dell’applicazione, sono denominate costanti

Per dichiarare una costante ci sono due tecniche:

Const nome=Valore

oppure

Const nome as Tipo=Valore

Questa forma permette di rendere esplicita la dichiarazione del tipo per una costante. La prima forma, anch’essa corretta, può essere utilizzata in virtù del fatto che i tipi delle costanti sono dedotti in base al valore assegnato.

E’ giunto adesso il momento di produrre una tabella riassuntiva dei tipi di dati elementari disponibili in VBA:

Tipi di dati Descrizione Dati rappresentati
Boolean Memorizza valori dell’Algebra di Boole True oppure False
Byte Memorizza valori naturali intervallo di valori compresi tra 0 e 255
Currency Memorizza valori monetari compresi 4 cifre decimali Intervallo compreso tra -922… a +922…
Date Memorizza informazioni circa data e orario compreso Dal 1 gennaio 100 al 31 dicembre 9999
Double Memorizza valori decimali a precisione doppia Intervallo numeri negativi da -1,797679E308 a -4,94065E-324
Intervallo numeri positivi da da 4,04065E-324 A 1,79679E308
Integer Valori naturali con segno Intervallo -32.768 a + 32.767
Long Valori naturali con segno Intervallo -2.147…. a + 2.147….
Object Memorizza un riferimento all’oggetto Dipende dalla natura dell’oggetto
Single Valori decimali a singola precisione Intervallo numeri negativi:
da -3,4028… a -1,4012… Intervallo numeri positivi
da 1,4012… a 3,4028…
String Memorizza stringhe alfnumeriche Memorizza qualsiasi stringa di caratteri
Variant (*) Memorizza qualsiasi tipo Il dato rappresentato dipende dal tipo rappresentato.

In VBA, come il linguaggio Visual Basic 6.0, dispone di un ‘super tipo’. Esso è denominato Variant.. La capacità di memorizzazione dipende dal tipo di dato rappresentato (stringa, object, integer, long, ecc.).

Ricordiamo che se non si utilizza la Direttiva Option Explicit che rende obbligatoria la dichiarazione delle variabili, in VBA, come in VB6, una variabile non dichiarata con l’istruzione Dim, verrà automaticamente assegnato il tipo universale ‘Variant’, con ovvio spreco di maggior memoria per l’allocazione dell’informazione.

Tipi definiti dall’utente

Nel paragrafo precedente abbiamo trattato l’argomento sulle variabili, costanti e tipi di dati. Sulle variabili sono stati correlati i seguenti concetti:

  1. si è discusso del concetto di variabile semplice che memorizza un dato elementare (una data, una stringa, un valore booleano);
  2. è stata fatta l’esortazione a tutti gli utenti di utilizzare la direttiva Option Explicit, al fine di non permettere di creare variabili a casaccio ed evitare uno spreco irrazionale della memoria, creando variabili di tipo Variant;
  3. è stata data una tabella riassuntiva dei tipi di dati elementari disponibili per VBA;

Adesso dobbiamo argomentare invece:

  1. la dichiarazione e l’utilizzazione di tipi di dati definiti dall’utente,usando l’istruzione Type;
  2. come si dichiarano i vettori (o array monodimensionali) e le matrici (o array pluridimensionali);

Il codice per dichiarare un tipo è il seguente:

Type <strong>archivio</strong>
    cognome As <strong>String*30</strong>
    nome As <strong>String*30</strong>
    credito As <strong>Double</strong>
End type

All’interno dell’istruzione type, come anche del resto, nelle istruzioni di dichiarazione Dim, le stringhe a lunghezza fissa sono dichiarate così:

cognome as String*30

dove 30 è la lunghezza caratteri.

Ricordo che avete creato un tipo di dato personalizzato. In Memoria non avete creato nessun riferimento. Al fine di creare un riferimento in memoria, dovremmo dichiarare questo tipo di dato con l’istruzione Dim.

Dim elenco As <strong>archivio</strong>

Osservate che dopo aver indicato la clausola As, grazie alla tecnologia dell’Intellinsense (o completamento automatico dell’istruzione), caratteristica insita nel linguaggio Visual Basic, troviamo, tra tutti gli oggetti, il nostro tipo di dati personalizzato.

Cognome, nome, credito immaginiamo che le abbiamo create con tre istruzioni Dim singole. Adesso per assegnare un dato, per mezzo del tipo di dato dichiarato (elenco), si procede così:

...
elenco.<strong>cognome</strong>="Rossi"
elenco.<strong>nome</strong>="Marco"
elenco.<strong>credito</strong>=302.20
...

In queste istruzioni di assegnazione:

  1. i valori alle variabili di tipo stringa vengono indicate tra doppi apici;
  2. i valori decimali sono indicati secondo la notazione inglese, usando il punto.

Come esistono le variabili semplici, per creare delle variabili strutturate, per le quali a ciascun elemento si accede con uno o più indici interi positivi, si procede così:

Dim elenco(dimensione) As <strong>TIPO</strong>

dove dimensione è possibile indicarla così 1 to 10 ad esempio, oppure solo l’indice superiore, ossia la dimensione massima di elementi memorizzabili

Dim elenco(10) As <strong>TIPO</strong>

è equivalente a:

Dim elenco(1 to 10) as <strong>TIPO</strong>

TIPO può essere uno dei tipi elementari disponibili per VBA, oppure un tipo dati personalizzato.

Con un tipo di dato definito dall’utente e le variabili strutturate è possibile costruire i cosiddetti Array di record
La dichiarazione avviene così:

Dim elenco(1 to 10) as archivio

Ad ogni elemento si accede così:

elenco(1).cognome

Operatori aritmetici, relazionali e logici

Ogni linguaggio di programmazione, al fine di legare una o più variabili, per restituire il risultato di un’operazione aritmetica, ha un set di operatori:

Operatori aritmetici Descrizione
+ Addizione
Sottrazione
* Moltiplicazione
/ Divisione
Divisione intera
Mod Resto della divisione (modulo)

Per eseguire le operazioni di confronto tra due espressioni o più espressioni, ogni linguaggio di programmazione, e quindi anche il VBA ha:

  1. Operatori relazionali
  2. Operatori logici
Operatori Relazionali Descrizione
= Operatore per effettuare il test di ugualianza
<> Diverso
< Minore
<= Minore o uguale
> Maggiore
>= Maggiore o uguale
Like Operatore per confrontare una stringa con un modello (Pattern Matching)
Is Operatore per verificare l’identità tra oggetti

Se dovessimo combinare due o più espressioni, attraverso uno o più operatori relazionali, abbiamo anche gli operatori logici. Essi li riassumiamo in questa tabella:

Operatori Logici Descrizione
Not Negazione – Il risultato del test A>B se dovesse essere uguale a true; anteporre Not a quell’espressione significherebbe eseguire una negazione. Sarebbe come effettuare il test b>a
Or Disgiunzione logica – Abbiamo due espressioni da testare. Seguendo questa tabella di verità sapremo quando il risultato dell’applicazione della disgiunzione sarà Vero
A>B=VERO B>C=VERO A>B OR B>C=VEROA>B=FALSO B>C=VERO A>B OR B>C=VEROA>B=VERO B>C=FALSO A>B OR B>C=VEROA>B=FASLO B>C=FALSO A>B OR B>C=FALSO
And Congiunzione Logica – Abbiamo due espressioni da testare. Seguendo questa tabella di verità sapremo quando il risultato dell’applicazione della congiunzione logica sarà Vero
A>B=VERO B>C=VERO A>B AND B>C=VEROA>B=FALSO B>C=VERO A>B AND B>C=FALSOA>B=VERO B>C=FALSO A>B AND B>C=FALSOA>B=FALSO B>C=FALSO A>B AND B>C=FALSO

Definiamo espressione una composizione valida di:

  1. variabili e/o costanti;
  2. valori e operatori logici o relazionali

Rammentiamo la tecnica utilizzata per il confronto tra stringhe, per mezzo degli operatori relazionali: viene valutato l’ordine dei caratteri nella codifica ASCII. Le lettere maiuscole vengono prima di quelle minuscole.

Nell’Editor di Visual Basic esiste la Finestra immediata, la quale assolve la funzione di testare l’uso degli operatori aritmetici, relazionali e logici.

Stabiliamo che esiste una regola di precedenza all’interno degli operatori: vengono prima gli operatori aritmetici, poi quelli relazionali o di confronto e alla fine quelli booleani.

All’interno degli operatori aritmetici esiste la seguente regola di precedenza: Viene eseguita prima l’operazione di divisione, poi la moltiplicazione, ed infine quella di addizione e sottrazione.

Istruzioni di controllo

Per istruzione intendiamo qualsiasi unità con sintassi completa, la quale esprime un tipo di:

  1. azione;
  2. dichiarazione o definizione;

Ogni istruzione può includere parole chiave, operatori, variabili, costanti e espressioni. Le istruzioni possono essere di tre tipologie:

  1. Istruzioni di dichiarazione – le abbiamo già viste a proposito dell’argomento sui tipi di dati, variabili, costanti;
  2. Istruzioni di assegnazione – sono istruzioni le quali permettono di assegnare valori o espressioni ad una variabile o costante;
  3. Istruzioni eseguibili – sono particolari istruzioni che inizializzano operazioni. Concretamente sono rappresentate da un metodo, funzione e possono eseguire spostamenti ciclici o passaggi tra blocchi di codice.

Quando scriveremo un programma con il linguaggio VBA, sicuramente ci troveremo spesso e volentieri in situazioni, dove dobbiamo obbligatoriamente interrompere la linearità di esecuzione del programma stesso.
Ecco perchè a tal proposito annoveriamo:

  1. Istruzioni condizionali;
  2. Istruzioni per implementare i cicli.

Le istruzioni condizionali sono particolari istruzioni eseguibili, che permettono di eseguire parti di programma, piuttosto che altre, solo al verificarsi di particolari condizioni.
Condizioni, che si sostanziano sottoforma di espressioni, e combinate con:

  1. operatori relazionali o di confronto;
  2. operatori logici And Or Not.

La sintassi dell’istruzione VBA, da usare, è:

If <espressione> Then
    <strong>Azione 1</strong>
    <strong>Azione 2</strong>
    <strong>...</strong>
    <strong>Azione N</strong>
Else
    <strong>Azione 1</strong>
    <strong>Azione 2</strong>
    <strong>...</strong>
    <strong>Azione N</strong>
End If

Questo costrutto è quello completo. Nel caso in cui non dovessimo eseguire nessun blocco di istruzioni, quando la condizione non viene verificata, allora si chiude il blocco di codice, dopo il Then, sempre con End If.

Nell’ipotesi di dover eseguire molti test di uguaglianza sul valore di una particolare variabile, utilizzeremo un’istruzione condizionale a scelta multipla. Stiamo parlando di Select Case.

La sintassi completa di questo costrutto è:

Select Case <variabile>
    Case 1:
        <strong>Azione 1</strong>
        <strong>Azione 2</strong>
        <strong>...</strong>
        <strong>Azione N</strong>
    Case 2:
        <strong>Azione 1</strong>
        <strong>Azione 2</strong>
        <strong>...</strong>
        <strong>Azione N</strong>
    Case Else:
        <strong>Azione 1</strong>
        <strong>Azione 2</strong>
        <strong>...</strong>
        <strong>Azione N</strong>
End Select

L’altra sintassi del costrutto Select Case è:

Select Case <variabile>
    Case 1 TO 10
        <strong>...</strong>
    Case 11 to 20
        <strong>...</strong>
    Case Else
        <strong>...</strong>
End Select

Nella programmazione di codice con VBA, sovente capita anche di dover eseguire un blocco di codice più volte. In questo caso occorre racchiudere quel blocco di codice all’interno di un ciclo.

Ci sono diverse tipologie di cicli, ma sono tutti caratterizzati da:

  1. una variabile iniziale, che ha la funzione di contare il numero di volte in cui il blocco di codice viene eseguito;
  2. si fissa una condizione per mezzo della quale, si possa ritenere concluso il ciclo, o bisogna continuare a ripeterlo.

In VBA ci sono tre tipologie di cicli:

  1. Ciclo For… Next
  2. Do… Loop in tutte le sue varianti
  3. For Each…Next utile nella programmazione ad oggetti, della quale si parlerà negli ultimi paragrafi di questa guida. In sostanza questo costrutto è utile per ripetere un blocco di istruzioni per ogni oggetto o insieme;

Il ciclo for presenta la seguente sintassi:

For ct = valore iniziale to valore finale 
    <strong>Azione 1</strong>
    <strong>Azione 2</strong>
    <strong>...</strong>
    <strong>Azione N</strong>
Next ct

In questo ciclo verrà incrementato unitariamente la variabile contatore ct (variabile iniziale). Si uscirà da questo ciclo for solo e solo quando la variabile iniziale, dopo successivi incrementi, raggiungerà il valore finale fissato o espresso attraverso una variabile.

Il ciclo For..Next viene utilizzato quando sappiamo a priori quante volte dobbiamo eseguire un ciclo. Nel caso non dovessimo saperlo (caso molto frequente), allora si dovrà utilizzare il ciclo Do…Loop.

Presentiamo la sua sintassi con un esempio applicativo. Dobbiamo contare in modo indefinito il numero di volte in cui verrà eseguito il blocco di istruzioni.

Dim Risp as String
Dim Ct as Integer
Risp="S"
Do While Risp="S"
    Ct=Ct+1
    Risp=Inputbox("Vuoi uscire dal ciclo S/N")
Loop
Msgbox("Numero di volte eseguito:" & Ct)
  1. E’ stata inizializzata la variabile Risp di tipo stringa con il valore "S", in modo che il blocco di codice racchiuso tra Do While… Loop possa essere eseguito;
  2. Viene incrementato unitariamente il valore della variabile ct;
  3. Viene acquisita, tramite l’istruzione Inputbox, la scelta dell’utente di eseguire o meno il blocco di codice definito;
  4. Nel caso la variabile Risp sia uguale ancora al valore inizializzato il ciclo viene rieseguito;

Solo quando la variabile Risp assume valore "N" (scelta dell’utente), acquisita sempre tramite l’istruzione InputBox, sapremmo quanto vale il valore della variabile ct.

Il blocco di codice racchiuso sarà eseguito per vero, ossia solo se, ad ogni inizio ciclo, la variabile Risp sia sempre uguale ad "S".

Nel caso in cui la variabile Risp non sia uguale ad "S", già prima di entrare nel ciclo, allora non verrà eseguito neanche una volta.

Presentiamo la seconda variante del ciclo Do…Loop, ossia Do..Loop Until <condizione>

Dim Risp As String
Dim Ct as Integer
Do
    ct=ct+1
    Risp=Inputbox("Vuoi uscire dal ciclo S/N:")
Loop Until Risp="N"
Msgbox("Numero di volte eseguito:" & ct)

Rispetto alla prima versione la condizione è stata collocata all’uscita del ciclo (vedi Loop Until…). Il blocco di codice viene eseguito finchè la condizione di uscita non diventi True.

Usciti dal ciclo (quando finalmente l’utente sceglierà di non eseguirlo più) sapremmo sempre il valore di ct quanto vale.

E’ possibile uscire anticipatamente da un ciclo impostato in questo modo, utilizzando l’istruzione Exit Do.

Funzioni e Procedure

Le funzioni e le procedure sono lo strumento per permetterci di organizzare meglio il codice, in modo da specializzare parti di codice secondo la funzione che assolvono.

In progetti molto estesi pensare a questo tipo di organizzazione è utile, sopratutto se in un progetto ci sono procedure richieste per più circostanze. Riscrivere ogni volta quella parte di codice sarebbe una perdita di tempo.

Ad esempio, se dovessimo gestire (inserimento,ordinamento, modifica, cancellazione) di un archivio clienti, scrivere una procedura dedicata ad eseguire l’ordinamento per qualsiasi set di clienti (10, 100, 1000) è fondamentale.

Una procedura (tecnicamente chiamata anche Subroutine) si differenzia da una funzione, in quanto la prima permette di isolare ed eseguire un blocco di istruzioni particolari.

La funzione viene invocata se volessimo restituire al programma stesso un valore utile per le successive elaborazioni da parte di altre subroutine o altre funzioni stesse.

Domanda: Come si crea una procedura o funzione? La procedura è la stessa, a prescindere dall’applicativo della Suite di Office, per la quale stiamo creando il progetto VBA:

  1. aprire dal menu di Start uno degli applicativi della Suite;
  2. premere da tastiera la combinazione di tasti ALT+F11;
  3. dalla finestra progetto fare tasto destro sul nome del progetto e selezionare Inserisci modulo;

Eseguite queste operazioni abbiamo:

Dal Menu Inserisci, dell’Editor di Visual Basic, selezioniamo la voce Routine.

Da questa finestra di dialogo possiamo creare anche funzioni o subroutine. Decidere se le stesse debbono essere visibili a tutto il progetto oppure no. In questa ultima situazione si sceglierà l’opzione private.

Funzioni avanzate del linguaggio VBA

Siamo arrivati ad argomentare le Funzioni avanzate del linguaggio VBA.
In alcuni esempi, dove è stato spiegato l’uso del ciclo Do..Loop, implicitamente si è fatto cenno alle modalità di acquisizione e visualizzazioni delle informazioni. Stiamo parlando di:

  1. Uso di Msgbox come funzione o istruzione;
  2. Uso dell’istruzione InputBox;

Diamo la sintassi di MsgBox come istruzione:

L’istruzione Msgbox presenta i seguenti argomenti:

  1. Prompt – Messaggio testuale che compare all’interno della finestra di dialogo;
  2. Costante di MsgBoxStyle;
  3. Title per impostare un titolo per la finestra di dialogo;
  4. Help e Context per impostare un file di guida e un indice per accedere velocemente all’argomento interessato al suo interno. Sarà visualizzato un pulsante con un "punto di domanda"

La sintassi di Msgbox, come funzione, è la seguente:

Utilizzando l’istruzione Msgbox come funzione, essa restituirà un valore corrispondente ad una delle seguenti costanti intrinseche:

Costanti enumerative di MsgboxResult Descrizione
VbAbort Costante uguale al valore 3; viene utilizzata, quando nella finestra di dialogo MsgBox si utilizza la costante VbAbortRetryIgnore per l’argomento MsgBoxStyle
VbCancel Costante uguale al valore 2; viene utilizzata, quando nella finestra di dialogo Msgbox si utilizza la costante VbOKCancel per l’argomento MsgboxStyle
VbIgnore Costante uguale al valore 5; viene utilizzata, quando nella finestra di dialogo Msgbox si utilizza la costante VbAbortRetryIgnore per l’argomento MsgboxStyle
VbNo Costante uguale al valore 7; viene utilizzata, quando nella finestra di dialogo Msgbox si utilizza la costante VbYesNo o VbYesNoCancel per l’argomento MsgboxStyle
VbOk Costante uguale al valore 1; viene utilizzata, quando nella finestra di dialogo Msgbox si utilizza la costante VBOkOnly oppure VBOKCancel per l’argomento MsgBoxStyle
VbRetry Costante uguale al valore 4; viene utilizza, quando nella finestra di dialogo Msgbox si utilizza la costante VbAbortRetryIgnore per l’argomento MsgboxStyle
VbYes Costante uguale al valore 6; viene utilizzata, quando nella finestra di dialogo Msgbox si utilizza la costante VbYesNo oppure VbYesNoCancel per l’argomento MsgboxStyle

Esempio:

Dim R as MsgboxResult
r=Msgbox("Vuoi continuare S/N:",VbYesNo,"Messaggio")
If r=VbYes Then
    Msgbox("Hai deciso di continuare")
Else
    Msgbox("Stai per uscire dall'applicazione")
End If

Le informazioni prima di essere visualizzate vanno acquisite e successivamente elaborate. L’istruzione che permette di acquisire informazioni da parte dell’utente è InputBox.
Gli argomenti di questa istruzione sono:

  1. Prompt – Argomento di tipo stringa per visualizzare un messaggio; esso compare nella finestra di dialogo;
  2. Title – Titolo assegnato alla finestra di dialogo;
  3. Default – Valore predefinito che compare nella casella di inserimento;
  4. Coordinate (PosX e PosY per la posizione di tale finestra sullo schermo);
  5. HelpFile e Context già spiegati nella sintassi dell’istruzione MsgBox.

Esempio:

Public a As Integer
Public b as Integer
Function Addizione()
    Addizione=A+b
End Function
Sub Main
    Dim S as Integer
    a=Inputbox("Valore di a=","Immetti A")
    b=Inputbox("Valore di b=","Immetti B")
    s=Addizione()
    Msgbox("Risultato A+B" & s)
End Sub

Eseguiamo con il tasto F8 la routine Main:

Immettiamo il primo valore:

Immettiamo il secondo valore:

Confermando il pulsante Ok all’interno della seconda casella di inserimento, sarà eseguita la funzione Addizione. Essa restituirà un valore e sarà assegnato alla variabile "s". Ecco visualizzato il messaggio di risultato:

Introduciamo le funzioni avanzate di conversione dei tipi di dati.

All’interno dell’Editor di Visual Basic premiamo il Tasto di funzione F2, e notiamo che le funzioni di conversione fanno parte della libreria VBA:

Rappresentiamo una tabella, che permette di comprendere questo: ad ogni tipo di dato elementare corrisponde una funzione di conversione:

Funzioni conversione Tipo dato
Cbool Boolean
Cbyte Byte
CCur Currency
CDate Date
CDbl Double
CDec Decimal
CInt Integer
CLng Long
CSng Single
CStr String
CVar Variant

Esempio: Proviamo a convertire "casa" in Csng:

Dim s As String
dim dato as Single
s="Casa"
dato=Csng(s)

Queste righe di codice genereranno un errore durante l’esecuzione del codice:

Dovessimo premere il pulsante di domanda, nel messaggio di errore visualizzato, verrà visualizzato l’argomento associato per i dettagli dell’errore intercettato.

Nella gestione di dati di tipo stringa, l’operazione applicata a questa tipologia di dato è denominata Manipolazione delle stringhe. Per manipolare le stringhe abbiamo un set di funzioni, catalogate nella classe STRINGS, della libreria VBA:

Attraverso queste funzioni potremmo svolgere svariate operazioni, tipo:

  1. Conoscere la lunghezza dei caratteri di una stringa funzione Len;
  2. Convertire in Maiuscolo o in Minuscolo una stringa funzione UCASE e LCASE;
  3. Ottenere una stringa eliminando gli spazi iniziali o finali di una determinata stringa Ltrim Rtrim;
  4. Restituire un certo numero di caratteri da una stringa partendo da destra funzione Right;
  5. Restituire un certo numero di caratteri da una stringa partendo da sinistra funzione Left;
  6. Restituire a lettere il mese partendo da un numero compreso tra 1 e 12 funzione MonthName;
  7. Restituire a lettere il giorno della settimana partendo da un numero compreso tra 1 e 7 funzione WeekDayName;

e tanti altri utilizzi, leggendo attentamente la guida in linea, accessibile dall’Editor di Visual Basic, oppure attendendo una guida avanzata di VBA su mrwebmaster.it.

Una classe della libreria VBA è dedicata alla manipolazione delle date Un valore di tipo Date viene così memorizzato:

Dim miadata as Date
d=#12/22/2006 17:36PM#

Quando memorizza una data con le istruzioni di assegnazione, essa viene racchiusa da due cancelletti. Viene indicato prima il giorno e poi il mese, seguendo le notazioni standard dei paesi anglosassoni.

Ecco le funzioni che permettono la manipolazione delle date. Le presentiamo direttamente dal visualizzatore degli Oggetti (Tasto di funzione F2 all’interno dell’Editor VB).

La data di sistema viene recuperata in questo modo:

Dim datasistema as Date
datasistema=Date()
Msgbox(datasistema)

Per recuperare la data comprensiva anche dell’orario useremo la funzione Now():

Dim dataeorario as Date
dataeorario=Now()
msgbox(dataeorario)

Una funzione, dedicata al recupero solo dell’orario di sistema, è Time(). La funzione Timer restituisce il numero dei secondi passati dalla mezzanotte.

Le componenti estraibili dalle date sono:

  1. Mese
  2. Anno
  3. Giorno
  4. Ore
  5. Minuti
  6. Secondi
Componenti di una data funzione VBA da usare
Mese Month(data)
Anno Year(data)
Giorno Day(data)
Ore Hour(data)
Minuti Minute(data)
Secondi Second(data)

La WeekDay(data) restituisce il progressivo del giorno. Presentiamo la demo in cui acquisita la data di sistema, si possa restituire il messaggio Oggi è:

  1. Domenica;
  2. Lunedì;
  3. Martedì;
  4. Mercoledì;
  5. Giovedì;
  6. Venerdì;
  7. Sabato;

La demo consta delle seguenti righe di codice:

Dim datasistema As Date
Dim costante As Integer
Dim vettoregiorni(1 To 7) As String
vettoregiorni(1) = "Lunedì"
vettoregiorni(2) = "Martedì"
vettoregiorni(3) = "Mercoledì"
vettoregiorni(4) = "Giovedì"
vettoregiorni(5) = "Venerdì"
vettoregiorni(6) = "Sabato"
vettoregiorni(7) = "Domenica"
costante = Weekday(Date, vbUseSystemDayOfWeek)
Select Case costante
    Case 1 To 7 : MsgBox ("Oggi è:" & vettoregiorni(costante))
End Select

Per chiudere l’argomento presentiamo la classe VBA Maths. Racchiude un set di funzioni, le quali ci permettono di manipolare i numeri.

Dato un numero per ottenere la rappresentazione esadecimale dobbiamo utilizzare la funzione Hex

La rappresentazione esadecimale è:

Il codice è:

Sub Main()
    Dim numero As Integer
    Dim stringa As String
    numero = InputBox("Valore in base dieci:")
    stringa = Hex(numero)
    MsgBox ("rappresentazione esadecimale:" & stringa)
End Sub

La programmazione ad oggetti con VBA

Nei paragrafi precedenti della guida abbiamo argomentato la creazione di un tipo dati definito dall’utente.

L’unica limitazione, la diciamo adesso, è quella di rappresentare solo dati. Se volessimo associare al tipo di dato definito procedure e/o funzioni specifiche non potremmo farlo.

Tale limitazione viene superata se si comincia a studiare VBA programmando per oggetti.

Un oggetto presenta le seguenti caratteristiche:

  1. ha un set di proprietà;
  2. ha un set di funzioni/procedure chiamati metodi;
  3. può aver associati anche degli eventi

In un’ipotesi futura, dove approfondiremo meglio come programmare in Excel, Access, esamineremo nei dettagli l’ultima caratteristica. Diciamo brevemente che un evento è utilizzato dagli oggetti grafici, al fine di rispondere alle azioni degli utenti.

Nell’intendo di aver delineato le basi del VBA, si potrebbero aprire nuove chiavi di lettura:

  1. Approfondimento del VBA per Excel;
  2. Approfondimento del VBA per Access;
  3. Approfondimento del VBA per Word.

L’obiettivo di questi approfondimenti è quello di estendere le funzionalità base degli applicativi in elenco, con quelle proprie della programmazione ad oggetti con VBA.

Per poter approfondire tutto ciò dobbiamo attendere la programmazione di nuove guide sull’argomento su Mr. Webmaster oppure un corso integrale.

Corso nel quale si può dare maggior spazio ai riferimenti del linguaggio VBA per i diversi applicativi, comprendendo anche il modello ad oggetti di ciascuna libreria per Word, Excel, Access.

Pubblicitร 

Leggi anche...

Radice quadrata in C: vediamo come calcolarla in diversi modi

La radice quadrata è un'operazione matematica piuttosto comune (in...

Sperimentare la sequenza di Collatz in C++

Vediamo come verificare la congettura di Collatz con C++....

Calcolare la radice quadrata con Python

In Python è possibile calcolare la radice quadrata usando...

12 film che ogni programmatore dovrebbe guardare (per trovare ispirazione e creatività)

Molti ragazzi hanno deciso di intraprendere una carriera da...

Cartonizzare una foto con Python e la libreria OpenCV

La cartoonization è una procedura grafica che consente di...

Creare flowchart (diagrammi di flusso) online: 5 strumenti gratuiti

Hai bisogno di realizzare una flow chart ma non...
Pubblicitร