Il vba è il linguaggio disponibile in Office per la realizzazione di macro, procedure con cui possiamo automatizzare i nostri fogli Excel. Il vba è un linguaggio a oggetti. Cosa significa? Cos’è la programmazione a oggetti? Come funziona? Ne parliamo in questo post su Excel, vba e la programmazione a oggetti.
Introduzione agli oggetti
Excel, Vba. Excel è un ambiente di lavoro composto da oggetti e il linguaggio Vba essenzialmente lavora su questi oggetti. Gli oggetti in Excel possono essere visti come contenitori strutturati di dati, che possono contenere o essere composti da altri oggetti, e che quindi hanno una gerarchia. Gli oggetti possiedono numerose caratteristiche o proprietà, possono realizzare attività grazie a un set di comandi chiamate metodi, e possono essere associati a eventi.
Per esempio, oggetti sono il foglio di lavoro, il pulsante di comando, le pagine, le tabelle, gli intervalli di celle, i grafici, eccetera.
Cosa sono le proprietà di un oggetto?
Le proprietà rappresentano gli attributi e le caratteristiche che definiscono l’oggetto e lo distinguono dagli altri oggetti simili (es: grandezza del font, colore della cella, altezza della riga, tipo del grafico, nome della pagina, ecc). Ogni oggetto ha una lista di proprietà che lo descrivono.
Cosa sono i metodi?
Sono le funzionalità degli oggetti, cioè l’elenco delle azioni che l’oggetto può compiere o può subire, per esempio l’apertura di un foglio, il suo salvataggio, la selezione di una tabella, l’attivazione di una pagina, eccetera. Ogni oggetto ha una lista di metodi che lo riguardano.
Cosa sono gli eventi?
Sono momenti e situazioni generate da certe condizioni, conseguenze delle attività dell’operatore, a cui è possibile associare metodi che modificano proprietà di oggetti e non solo. Per esempio evento è l’apertura di un foglio excel, l’attivazione di una pagina, la selezione di un oggetto, il clic del mouse su un controllo e via dicendo.
Cosa sono le gerarchie di oggetti e gli insiemi di oggetti?
Gli insiemi sono gruppi di oggetti con le stesse caratteristiche, per esempio la pagina “Dati” fa parte dell’insieme delle pagine del foglio di lavoro. Ogni volta che possono esserci oggetti simili, allora si possono definire degli insiemi di questi oggetti, dove i singoli componenti possono essere distinguibili e richiamabili usandone il nome. Si può dichiarare il singolo oggetto dell’insieme indicandone tra parantesi il nome, per esempio: “Workbooks(“Budget”) è il foglio Budget.
Cos’è la gerarchia degli oggetti?
La gerarchia definisce il rapporto tra gli oggetti, cioè a quale oggetto più “grande” appartengono o di cui fanno parte, quali oggetti contengono, o li compongono. Puoi vedere la gerarchia come il rapporto dei diversi elementi di una matrioska. Per esempio, la pagina di excel (worksheet) è un elemento dell’oggetto foglio di lavoro (workbook) che è un elemento di Excel (application). Application è l’oggetto più grande e di più alto livello che contiene tutti gli altri.
Conoscere gli insiemi e la gerarchia degli oggetti è importante per la comprensione e la scrittura del Vba.
Riassumiamo tutto con un esempio: una pagina di excel (worksheet) è un oggetto parte di un insieme di pagine (worksheets), contenute nel foglio di lavoro (workbook), ed è composta e contiene oggetti come intervalli di celle (range), tabelle (listobject, pivottables, ecc) e grafici (chartobjects), per esempio. Tutti questi oggetti hanno una lista di proprietà, per esempio il valore delle celle (cells.value), o il nome delle pagine (worksheet.name), e una lista di funzionalità, i metodi, con cui è possibile agire sugli oggetti e sulle loro proprietà, come per esempio aggiungere una pagina (worksheets.add), selezionarla (worksheets.select), copiarla (worksheets.copy) e via dicendo. Infine l’oggetto, per esempio la pagina, dispone di eventi specifici (activate, change, ecc) a cui è possibile associare codice vba, per esempio per aggiornare le tabelle pivot contenute.
Come si scrive il codice?
Partendo da questo, il codice che agisce sugli oggetti viene scritto come dichiarazioni che descrivono l’oggetto, o un insieme di oggetti, e la gerarchia relativa, di cui si modifica o richiama una proprietà, o su cui si esercita un metodo, per esempio in questi modi:
- Oggetto.Proprietà
(es: Activesheet.Name, mostra il nome della pagina attiva); - Oggetto.Metodo
(es: Activesheet.Delete, rimuove la pagina attiva); - Insieme(oggetto).Proprietà
(Application.Workbooks.Count, conta i fogli Excel aperti); - Insieme(oggetto).Metodo
(es: Worksheets(“Foglio1”).Activate, attiva la pagina “Foglio1”); - Insieme(oggetto).Proprietà
(es: Worksheets(1).Name, restituisce il nome della pagina con indice 1); - Insieme(oggetto).Metodo
(es: Workbooks.Close, chiude tutti i fogli di lavoro aperti); - Insieme(oggetto). Insieme(oggetto).Proprietà
(es: Worksheets(“Report”).Range(“A2:F40”).Font.Bold, imposta il grassetto nell’intervallo di celle selezionato); - Insieme(oggetto). Insieme(oggetto).Metodo
(es: worksbooks(“Db Kpi Prod”).Worksheets(“Dboard”).PrintOut, stampa la pagina dashboard);
Come? Tutti questi modi? Come faccio a sapere quale usare, quando e come?
L’omissione degli oggetti padri e l’oggetto attivo
Il modo corretto per dichiarare un oggetto è in realtà:
Application.Insieme(OGGETTO).Insieme(OGGETTO).OGGETTO
Cioè un’espressione che parte dall’oggetto che contiene tutti, cioè Excel (application), per poi dichiarare gli altri oggetti fino a quello su cui vuoi agire o di cui vuoi richiamare o modificare una proprietà. Per esempio per riferisi a un intervallo di celle preciso, la notazione corretta dovrebbe essere:
Application.Workbooks(“RepProd”).Worksheets(“Dati”).Range(“C1:C10”)
In realtà farlo ogni volta sarebbe una perdita di tempo, perciò il vba permette di omettere gli oggetti se il codice si riferisce agli oggetti attivi. Cioè in pratica si omette quasi sempre Application, ma anche tutti gli oggetti che seguono se sono attivi.
Prendiamo l’ultimo esempio, possiamo scriverlo solo come Worksheets(“Dati”).Range(“C1:C10”) se ci stiamo riferendo a un range di una pagina precisa (Dati) del foglio di lavoro. Ma potremmo scrivere solo Range(“C1:C10”) se siamo all’interno della pagina, o sarebbe meglio dire se la macro verrà lanciata e agirà all’interno della pagina mantenendola attiva, cioè senza cambiare focus o selezione.
Da un altro punto di vista, sarebbe più corretto dire che quando Excel non trova l’indicazione degli oggetti padre, interpreta il codice come se si riferisse a quelli attivi.
Quindi è importante quando progetti e scrivi il codice avere sempre chiaro il focus, cioè quale foglio è o dovrebbe attivo. Uno degli errori classici dei principianti è dimenticarselo e far lavorare il codice sulle pagine attive anche se non sono quelle su cui deve realmente agire.
Nel codice vba in realtà ci sono oggetti specifici per indicare gli oggetti attivi (es: ActiveWorkbook, ActiveSheet, Activecell, ecc) che però vanno usati con attenzione e precisione. Per esempio, “ActiveSheet.Name” restituisce il nome della pagina attiva, mentre “ActiveWorkbook.Save” salva il foglio Excel attivo.
In realtà potresti omettere questi oggetti se ti riferisci a un oggetto figlio, per esempio” ActiveSheet .Range(“C1:C10”)” e “Range(“C1:C10”)” sono equivalenti.
Questa regola dell’omissione è generale, ma ha delle eccezioni nel caso di macro inserite in moduli associati a oggetti, in particolare:
- se ometti la pagina in una macro in un modulo pagina (“sheets”), excel dedurrà che ti stai riferendo alla pagina della macro e non a quella attiva;
- se ometti il foglio nel modulo foglio (ThisWorkbook), excel penserà che ti stai riferendo al foglio che contiene la macro e non a quello attivo.
Quali sono gli oggetti principali di Excel e Vba?
Gli oggetti fondamentali di Excel e vba sono i seguenti:
Application
indica la sessione di Excel, quindi tutti i fogli aperti. Di solito la vedi poco nel codice, perché nella maggior parte dei casi si lavora su oggetti più piccoli e come abbiamo visto viene omessa nelle espressioni degli oggetti. I richiami più frequenti riguardano la modifica di solito temporanea di alcune proprietà come DisplayAlerts, ScreenUpdating, Calculation, eccetera (es: Application.DisplayAlerts sospende gli allarmi di excel, mentre Application.ScreenUpdating sospende l’aggiornamento dello schermo).
Workbook
rappresenta una cartella di lavoro di Excel, ed è un elemento dell’insieme workbooks. Questo oggetto contiene quasi tutti gli oggetti di Excel (pagine, range, celle, colonne, tabelle, pivot, controlli, grafici, eccetera) e viene usato poco, soprattutto nel caso di attività che coinvolgono più fogli di lavoro.
Worksheet
rappresenta la singola pagina excel che a sua volta contiene celle, colonne, righe, tabelle, grafici, eccetera. In realtà worksheets descrive solo uno dei 4 tipi di pagine supportate da Excel: pagina standard (worksheet), grafici (chart), pagina macro (macro Xlm) e pagine di dialogo (finestra di dialogo Excel 5.0). Di fatto gli ultimi due tipi sono caduti in disuso lasciando il campo ai soli Worksheet e Chart. Worksheet fa parte dell’insieme Worksheets e Sheets e contiene tutti gli oggetti della pagina, per esempio range, cells, colonne, righe, tabelle, eccetera.
Range
rappresenta un intervallo di celle, quindi dalla singola cella, righe e colonne, fino a una matrice di celle. È uno degli oggetti più richiamati, viene dichiarato come “Range(“CELLA”)” per la singola cella, oppure “Range(“CELLA:CELLA”)” per l’intervallo di celle. Per esempio: Worksheets(1).Range(“A1”).Value = “Titolo della pagina” inserisce la stringa nella cella A1. È l’oggetto che possiede più proprietà e metodi ed è più complesso di quello che appare a prima vista.
Chart
rappresenta un grafico o diagramma ed è parte dell’insieme Charts, ma anche dell’insieme Sheets. Come worksheet è un oggetto “pagina”, ma invece di presentare celle e oggetti incorporati, mostra solo un grafico specifico. È un oggetto poco utilizzato rispetto a worksheet, ma è il modo più efficace per visualizzare un grafico. Per esempio “Charts(1).Name = “Produttività” cambia il nome del grafico 1, mentre “Charts(1).PrintOut” lo stampa.
ChartObject
è un oggetto che rappresenta anch’esso un grafico, ma incorporato nella pagina (worksheet) ed è membro dell’insieme ChartObjects. I grafici sono strutture complesse e sono caratterizzati da molte proprietà per gestirne i diversi elementi e le loro caratteristiche. Quando i grafici sono installati nella pagina, per esempio per realizzare dashboard o report, allora è necessario usare questo oggetto.
ListObject
rappresenta una tabella Excel presente in una pagina (worksheets) ed è membro dell’insieme ListObjects. È a sua volta caratterizzato da numerose proprietà che identificano tra l’altro le molte parti di una tabella (es: listcolumns, listrows, databodyrange, headerrowrange, totalrowrange, ecc), oltre che permetterne di gestire strumenti e impostazioni (es: autofilter, showautofilter, ecc).
La gestione di questi oggetti richiede precisione, ma è meno complessa di quello che può apparire. Per esempio, “Worksheets(1).ListObjects(“ResaR1”). DataBodyRange.Select” seleziona il corpo della tabelle senza intestazioni e totali, “Worksheets(1).ListObjects(“ResaR1”). ShowTotals = True” mostra la riga dei totali in fondo alla tabella.PivotTable
rappresenta una tabella pivot installata in una pagina (worksheets) ed è membro dell’insieme PivotTables. È l’oggetto da cui partire per scrivere codice che gestisca le tabelle pivot in automatico. Considerato la facilità e la velocità con cui si realizzano e si gestiscono, considerato che sono dinamiche e interattive, ha senso gestire le pivot con il codice? Sì, per esempio per preimpostarle in automatico, per copiarle, modificarle e molto altro. D’altra parte il codice per gestire le pivot può essere complesso e spesso si preferisce non automatizzarle, o usare il registratore di macro per scrivere la parte operativa.
Selection
è un oggetto speciale che memorizza o meglio indirizza all’oggetto selezionato con il metodo Select. Di solito associato è a un intervallo di celle, viene ampiamente usato per semplificare la scrittura del codice quando si deve intervenire ripetutamente sulle proprietà della selezione, per esempio per impostare la formattazione, valori e formule, ma può essere utilizzato per tutto. È importante gestire con attenzione il focus.
Quali sono gli insiemi fondamentali?
Gli insiemi fondamentali sono quelli composti dagli oggetti più comuni e basilari, in particolare:
- Workbooks che contiene tutti gli oggetti Workbook aperti in Excel. Ricordo che si può dichiarare il singolo oggetto dell’insieme indicando tra parantesi il nome (es: Workbooks(“Dashboard”) ). Si può agire sull’intero insieme di fogli con i metodi relativi, per esempio “Workbooks.Close” chiuderà tutti i fogli Excel aperti.
- Worksheets è l’insieme di tutti gli oggetti Worksheet nella cartella di lavoro specificata o attiva. Usando i metodi relativi si può agire sull’intero insieme (“Worksheets.Add” aggiunge una nuova pagina), o su un elemento specifico dell’insieme indicandone il nome o il riferimento/indice, per esempio: Worksheets(“NOME”).Select, oppure Worksheets(INDICE).Select porterà la pagina relativa in primo piano.
- Sheets è l’insieme di tutte le pagine del foglio di lavoro attivo o specificato e contiene sia oggetti Worksheet, pagine standard, che Chart, cioè pagine che contengono grafici e grafici incorporati. Vale quanto detto sopra per l’indicazione del singolo oggetto e per l’applicazione dei metodi relativi (es: Sheets.PrintOut stampa tutte le pagine, Sheets(“Report”).PrintOut stampa solo la pagina “Report”).
- Charts è l’insieme delle pagine dedicate ai grafici (Chart), è parte dell’insieme Sheets appena descritto ed è il cugino di Worksheets.
- ChartObjects è l’insieme dei grafici incorporati nella pagina e quindi parte di Worksheets, anche per lui vale quanto visto finora su metodi e singoli oggetti. Per esempio “Worksheets(1).ChartObjects.Delete” cancellerà tutti i grafici della pagina 1.
- ListObjects è l’insieme delle tabelle presenti nelle pagine Excel, quindi parte di worksheets, ed è molto utile nella gestione automatica delle tabelle. Vale quanto detto finora.
- PivotTables è l’insieme delle tabelle pivot presenti nella pagina ed è l’analogo di ListObjects. Vale quanto ripetuto finora. Per esempio “Worksheets(2).PivotTables.Count” restituisce il numero di tabelle pivot presenti nella pagina.
Ora passiamo alle proprietà.
Quali sono le proprietà più comuni?
Le proprietà sono centinaia, alcune proprietà di certi oggetti hanno lo stesso nome di altri oggetti, alcune esistono solo per quell’oggetto, mentre altre sono presenti nella lista delle proprietà di decine di oggetti (es: select). Questa breve lista è un estratto e vuole essere solo un esempio:
Name
è forse la proprietà più comune, tutti gli oggetti hanno un nome che può essere modificato o assegnato. Alcuni oggetti ne hanno perfino due, per esempio le pagine (worksheet) hanno un nome “indicizzato” dell’oggetto che è quello che appare quando ne creiamo di nuove (Foglio1, Foglio2, ecc) e corrisponde al nome “etichetta” finché non lo modifichiamo. Per esempio, ActiveWorkbook.Worksheets (“Foglio1”). Name = “Dati”, modifica il nome della pagina da Foglio1 a Dati.
Value
è una delle proprietà più usate e ripetute nel codice, associata di solito a Range e Cells, e usata per l’inserimento di valori nelle celle. Per esempio, Worksheets(1).Range(“B2”).Value = 32, assegna il valore 32 alla cella B2.
Visible
è una proprietà con cui si può nascondere l’oggetto, di solito una pagina. Con Worksheets(1).Visible = False si nasconde la pagina 1, con Worksheets(1).Visible = True la si rende nuovamente visibile.
Formula
è una proprietà simile a Value, ma che invece di inserire un valore inserisce una formula con notazione standard Excel. Per esempio, Worksheets(1).Range(“D1”).Formula = “=SE(B2=“”; “”; B2)”, imposta la formula tra virgolette nella cella D1.
FormulaR1C1
è analoga alla precedente, ma inserisce le formule con notazione R1C1. Per esempio, Worksheets(1).Range(“D1”).FormulaR1C1 = “=SE(R2C2=“”; “”; R2C2)”.
Font
è una proprietà di Range che definisce il font impiegato dall’intervallo di celle relativo. Font è anche un oggetto che contiene gli attributi dei font. Per esempio, Range(“A1”).Font.Name restituisce il nome del font.
Count
è una proprietà di tutti gli insiemi di oggetti e restituisce il numero di oggetti relativi presenti. Per esempio Workbooks.Count restituisce il numero di fogli excel aperti, Worksheets.Count il numero di pagine presenti nel foglio attivo.
End
è una proprietà di Range e rappresenta la fine della regione di celle in cui è presente la cella selezionata, in una delle 4 direzioni possibili. Equivale alla pressione di Ctrl+Direzione. Per esempio, “Range(“A1″).End(xlDown).Select” seleziona l’ultima cella della regione che contiene A1 (es: una tabella). Le costanti sono naturalmente xlUp, xlDown, xlRight e xlLeft.
Offset
è una proprietà di Range che restituisce una posizione vicina alla cella selezionata, indicando direzione e coordinate relative (riga e colonna). Per esempio, Range(“A1”).Offset(1, 0).Select seleziona la cella A2.
Cells
è una proprietà di Worksheets, Range, Sheet e altri che non fa altro che restituire una cella. La sintassi è Cells(riga, colonna), per esempio Cells(3, 5) corrisponde alla cella E3. Può sostituire l’oggetto range nell’indicare le singole celle.
UsedRange
è una proprietà di Worksheet che identifica l’area di lavoro della pagina, cioè l’intervallo in cui abbiamo agito, inserito, manipolato, modificato, eccetera. Per esempio, ActiveSheet.UsedRange.Select seleziona l’area di lavoro.
DisplayAlerts
una proprietà di Application che ci permette di sospendere gli allarmi automatici del sistema. Utile per evitare conferme inutili che bloccherebbero l’esecuzione delle macro facendoci perdere tempo. È importante fare attenzione a come la usiamo e dobbiamo ricordarci sempre di ripristinare gli allarmi di Excel prima di chiudere la macro (Application.DisplayAlerts = False). Gli allarmi non sono lì per caso.
Chiudiamo qui questo assaggio delle proprietà. So cosa stai pensando: ma devo impararmi a memoria tutta sta roba? Ma sono centinaia di termini associati con decine di oggetti e dove capire come funzionano uno alla volta? La risposta è: sì. Punto. Il vba è un linguaggio e come una lingua devi studiare e impegnarti finché non la impari.
Passiamo ai metodi.
Quali sono i metodi più usati?
I metodi sono le azioni, le attività che possiamo eseguire con e sugli oggetti, sono molti, ma non come le proprietà, alcuni sono specifici di certi oggetti, altri sono generali e condivisi da molti oggetti (es: select, copy, ecc). Questi sono alcuni tra i metodi più usati:
Select
è uno dei metodi più diffusi tra gli oggetti (es: worksheet, cells, rows, columns, range, ecc). Il metodo porta in primo piano la pagina, sposta il cursore sulla selezione, evidenzia l’oggetto e lo rende richiamabile con Selection (es: Selection. ClearContents cancellerà il contenuto delle celle selezionate). L’oggetto più associato a questo metodo è Range, l’intervallo di celle (e i suoi “parenti”, cells, rows, columns). Per esempio, Range(“A:A”).Select seleziona l’intera colonna A.
Activate
è il metodo che porta in primo piano gli oggetti, usato di solito per Workbook e Worksheet, la sintassi è semplicemente “Oggetto.Activate”. Per esempio, Worksheets(“Report”).Activate porta in primo piano la pagina Report. È opportuno sottolineare che Select e Activate sono due azioni diverse. Select serve a selezionare uno o più oggetti per poter poi agire su di essi, mentre Activate porta in primo piano l’oggetto indicato.
Add
è il metodo usato per creare nuovi oggetti come fogli di lavoro e pagine, es: Worksheets.Add. Il metodo ha come sintassi: Add(Before, After, Count, Type), tutti gli argomenti sono opzionali, cioè non necessari. Before specifica la pagina prima della quale si desidera aggiungere il nuovo foglio, After dopo quale pagina si desidera aggiungere il nuovo foglio, Count specifica il numero di fogli che si vuole aggiungere, uno di default, Type specifica il tipo di foglio da aggiungere (XlSheetType, xlWorksheet, xlChart, xlExcel4MacroSheet, xlExcel4IntlMacroSheet o xlDialogSheet). Per esempio, ActiveSheets.Add Count:=3 aggiunge 3 nuove pagine.
Copy
è un metodo che copia un oggetto per crearne uno nuovo, o copia le sue proprietà per trasferirle a un altro oggetto analogo. Per sempio, con Worksheets(“Dati”).Copy After:=Worksheets(“Report”) crei una copia della pagina Dati posizionata a destra di Report. Ma è un metodo usato spesso per copiare le celle, valori e formati. Per esempio, “Worksheets(1).Range(“C1:D3”).Copy Destination:= Worksheets(“MedieStoriche”).Range(A11)Range(A11)” copia le celle indicate in una pagina diversa. Ti faccio notare che con un solo comando si può copiare e incollare. Se non si indica la destinazione, allora l’oggetto verrà copiano nella clipboard e avrà bisogno di un comando Paste per essere portato a destinazione.
Paste
quindi serve per incollare quello che abbiamo salvato nella clipboard. Per esempio Worksheets(“MedieStoriche”).Paste Destination:= Activesheet.Range(A11) incolla quello che è stato copiato nell’esempio precedente.
Delete
è il metodo per eliminare o rimuovere gli oggetti, per esempio Worksheets(1).Delete rimuoverà la pagina 1. Prima di farlo excel chiederà conferma con un’apposita finestra di dialogo. Questa può essere evitata agendo sulla proprietà DisplayAlerts di Application, per bloccare la funzionalità di Excel (Application.DisplayAlerts = False).
Close
è un metodo di Workbook, preve alcuni parametri tra cui il più usato è Savechanges per gestire il salvataggio. Per esempio, ActiveWorkbook.Close SaveChanges:=True chiude il foglio salvando in automatico senza chiederlo.
Save
è uno dei metodi classici dei fogli di lavoro e dell’insieme relativo con cui si salva il foglio di lavoro. Per esempio: Workbooks.Save salva tutti i fogli di lavoro aperti. Simile ma più complesso è il metodo SaveAs che salva il foglio come un file diverso e quindi richiede una serie di parametri, es: il nome del nuovo file.
PrintOut
metodo di tutti gli oggetti stampabili, stampa l’oggetto specificato con le impostazioni di default o predefinite. Per esempio, ActiveSheet.PrintOut stampa la pagina attiva, oppure, Charts.PrintOut stampa tutti i grafici.
ClearContents
è un metodo che cancella il contenuto delle celle selezionate, qualunque sia, formule e valori. Per esempio Worksheets(1).Range(“A:A”).ClearContents, cancella la colonna A intera.
Autofill
è un medoto dell’oggetto Range che riempie in automatico le celle dell’intervallo dichiarato a partire dal contenuto di alcune celle. È l’analogo dello strumento di excel che possiamo richiamare con un doppio clic sul quadratino in basso a destra della selezione. Si può usare anche con il vba, per esempio: Worksheets(1).Range(“C1:C2”).AutoFill Destination:= Worksheets(1).Range(“C1:C10”), riempie le 10 celle della destinazione a partire dai valori delle prime 2 celle.
Anche i metodi devono essere studiati con attenzione, anche maggiore delle proprietà in quanto i metodi manipolano gli oggetti o le loro caratteristiche. Quindi devi metterci impegno e all’inizio pazienza per studiare un poco alla volta i metodi che ti servono. Usa l’help del vbe, usa i motori di ricerca, le guide, gli strumenti del Vbe e un poco alla volta ti accorgerai di scrivere più velocemente, di non doverti impegnare a ricordare o cercare le parole. È solo questione di tempo.
Ora parliamo brevemente delle funzioni del vba.
Le funzioni del vba
Il linguaggio vba non è composto solo da oggetti, proprietà e metodi, ma anche da funzioni con cui si può controllare l’esecuzione del codice (es: cicli per ripetere il codice), con cui si possono richiamare strumenti appositi (es: le finestre di dialogo con cui interagire con l’operatore) e altre funzioni specifiche.
Le funzioni hanno un nome e regole precise che devono essere rispettate, per esempio una funzione che ripete il codice, come il ciclo For/Next, richiede una variabile come contatore e l’indicazione di un inizio e una fine. Una funzione di salto, come Goto, richiede un punto di arrivo con un nome univoco e una dichiarazione di salto che la punta. Una funzione di test come If/Then, che verifica condizioni precise per decidere se eseguire una parte del codice piuttosto che un’altra, richiede sempre il controllo di una condizione e operatori per testarla. E via dicendo.
Queste funzioni sono strumenti fondamentali per scrivere il codice, devono essere imparate a memoria e bene. Le funzioni più importanti sono decine, eccone alcuni esempi:
For/Next
I cicli sono tra gli strumenti più utilizzati del vba, in quanto permettono di modificare il flusso del codice, ripetendo più volte porzioni dello stesso. Ci sono molte funzioni del vba che generano cicli (loop), ma For/Next è quella più usata perché permette un elevato controllo sulle modalità di uscita dal ciclo.
In breve For/Next genera un ciclo a interazione fissa, cioè esegue le istruzioni un numero impostato di volte, definito e conteggiato da un indicatore. La maggior parte delle funzioni di ciclo (es: Do/Loop) invece determina l’uscita dal ciclo attraverso la verifica di una o più condizioni logiche, generando quindi un numero di ripetizioni varabile e non definito.
La sintassi è questa:
For VARIABILE_CONTATORE = inizio To fine [Step passo]
…Istruzioni da eseguire
Next VARIABILE_CONTATORE
La variabile contatore è numerica e di solito di tipo Integer o Long, di cui viene definito un valore iniziale e un valore finale. Questo può essere fatto con un numero, una formula, una variabile, eccetera. Di solito le variabili usate come contatori sono nominate con una singola lettera (es: I, J, K, ecc) e di default VBA incrementa il contatore di 1 ogni volta che esegue le istruzioni di un ciclo. Next è il marcatore di fine ciclo.
Quando viene eseguito il ciclo For, prima viene assegnato il valore iniziale alla variabile, quindi vengono eseguite tutte le istruzioni fino a Next, poi viene incrementato il valore della variabile e il focus ritorna all’inizio del ciclo dove viene confrontato il valore della variabile col valore finale. Se il contatore è minore o uguale a fine, la funzione esegue nuovamente il ciclo. Se invece contatore è maggiore di fine, il ciclo finisce e continua l’esecuzione della macro dopo Next.
È possibile specificare un valore diverso per l’incremento del contatore aggiungendo Step e il passo, l’incremento del contatore. Per esempio:
For I = 10 To 1 Step -1
… istruzioni
Next I
esegui il ciclo, ma con un conteggio inverso. Utile per esempio quando è necessario rimuovere righe da una tabella ed è più opportuno farlo in senso inverso.
I cicli sono strumenti potenti che permettono la ripetizione delle istruzioni ed è necessario conoscerli bene per averne il massimo controllo ed evitare errori anche gravi sull’esecuzione del codice.
If/Then
Questa funzione serve a controllare l’esecuzione del codice attraverso la verifica preliminare di una o più condizioni. Il suo funzionamento di base è piuttosto semplice: se la condizione risulta vera allora verranno eseguite le istruzioni, o eventualmente ne verranno eseguite altre.
La sintassi può variare da una versione minima su una singola riga:
If CONDIZIONE=Vera Then Istruzione
dove la funzione controlla se la condizione è vera e in caso affermativo esegue l’istruzione dopo lo “Then”. Per esempio “If Età<18 Then Minorenne =True”.
Ma può estendersi alla classica sintassi multiriga con una singola condizione che gestisce due blocchi di codice alternativi:
If CONDIZIONE=Vera Then
… Istruzioni
Else
… istruzioni alternative
End If
Per esempio, queste istruzioni verificano se è stato assegnato un nome dall’operatore e in caso alternativo ne assegnano uno di deafult:
If nomepaginadati = “” Then
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = “Dati”
Else
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = nomepaginadati
End If
Questa funzione può arrivare fino a una complessa sequenza di condizioni da verificare, come nella seguente sintassi:
If CONDIZIONE=Vera Then
… Istruzioni
ElseIf CONDIZIONE2=Vera Then
… Istruzioni
ElseIf CONDIZIONE3=Vera Then
… Istruzioni
Else
… istruzioni alternative
End If
Strutture di questo genere sono usate per gestire decisioni relativamente complesse senza l’intervento dell’operatore.
Bisogna sottolineare che la funzione ha la possibilità di verificare non una singola condizione, ma più condizioni contemporaneamente usando gli operatori booleani (And, Or, Not). Per esempio, “If Età>13 And Età <19 Then Adolescente=True”.
Queste funzioni “condizionali” sono una componente fondamentale per realizzare controlli, per prendere decisioni come per gestire le decisioni dell’operatore, per gestire gli errori e gli imprevisti e più in generale per realizzare codice intelligente e predittivo.
Richiedono una conoscenza approfondita dell’uso degli operatori (matematici, booleani, di confronto, ecc), per la definizione efficace delle condizioni, e della gestione delle variabili coinvolte, e richiedono esperienza per gestire strutture annidate e strutture miste con i cicli senza incorrere in errori.
Msgbox
La funzione MsgBox() richiama una finestra di dialogo con cui è possibile comunicare informazioni all’operatore e ricevere conferme, o raccogliere le sue decisioni su quesiti a risposta chiusa.
Viene usata in moltissime situazioni nelle diverse fasi di esecuzione della macro:
- all’inizio per chiederli conferma dell’esecuzione,
- dopo i controlli preliminari per comunicargli imprevisti o la mancanza delle condizioni per l’esecuzione del codice,
- nella gestione degli errori per comunicare il problema, ma anche per chiedergli se e come proseguire il codice,
- prima dell’esecuzione di operazioni irreversibili (rimozioni, cancellazioni, ecc),
- alla fine della macro per comunicargli l’avvenuta esecuzione,
- durante l’esecuzione delle attività per chiedergli di prendere una decisione precisa,
e in molte altre occasioni.
La sintassi della funzione è piuttosto semplice:
MsgBox(prompt, [buttons], [title], [helpfile], [context])
dove “prompt” è il messaggio che sarà visualizzato nella finestra di dialogo scritto tra virgolette (“”), “buttons” è il tipo di pulsanti da visualizzare nella finestra di dialogo, scelti da una lista di costanti tipo “vbOkOnly”, “vbYesNo”, ecc, “title” è il titolo della finestra di dialogo scritto tra virgolette (“”), “helpfile” identifica il file della guida da usare e “context” indica il punto della guida a cui puntare.
Non possiamo controllare la posizione e la grandezza della finestra di dialogo, ma possiamo controllarne contenuto e titolo, possiamo assegnargli uno tra numerosi set di pulsanti e possiamo scegliere l’icona che appare nella finestra.
Se vogliamo una finestra di dialogo completamente configurabile e controllabile dobbiamo creare una maschera apposita, attività che richiede molte competenze e tempo, mentre Msgbox è uno strumento pronto e facilmente configurabile.
Per esempio, se vogliamo usare la finestra dei messaggi per comunicare un’informazione all’operatore, basterà scrivere qualcosa tipo:
MsgBox “MESSAGGIO”, vbQuestion + vbOKOnly, “TITOLO”
come vedi senza parentesi, variabili o altro.
Se invece vuoi avere conferme o decisioni dall’operatore:
NOME_VARIABILE = MsgBox(“MESSAGGIO E DOMANDA”, vbYesNo, “TITOLO”)
dove è necessario raccogliere l’interazione dell’operatore con i pulsanti della finestra di dialogo per poi andare a verificare la scelta presa e agire di conseguenza.
Le finestre di dialogo, sia quella dei messaggi (Msgbox) che degli input (Inputbox), sono strumenti potenti e flessibili con cui possiamo ottenere risultati notevoli e che quindi vale la pena conoscere alla perfezione per sfruttarne gli innumerevoli vantaggi. L’argomento è ampio e complesso, quindi approfondiremo l’argomento in altri post dedicati.
Concludendo
No, non concludiamo qui, non ancora. Nel post precedente abbiamo visto cos’è il vba. In questo post abbiamo avuto un assaggio del linguaggio e della programmazione ad oggetti. Nel prossimo post vediamo come si usa il vba per realizzare macro.
Qui trovi il post precedente, qui puoi trovare il terzo post di questa guida e qui l’ultimo.
Ti piacerebbe imparare molto di più sull’automazione di Excel?
Questo corso ti guida da zero all’automazione dei tuoi fogli:
Grazie dell’attenzione e a presto ;D
PS: Se questo post ti è piaciuto o ti è stato utile, condividilo con gli amici sui social.
Puoi farlo attraverso i pulsanti qui di seguito. Grazie