Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Le formule
Le formule sono espressioni aritmetiche del tipo 10+5.
Una formula viene digitata in una cella nella forma del tipo: =10+5.
Il segno uguale segnala al programma che i caratteri seguenti danno vita a una
formula.
Dopo la conferma (tasto Invio) la cella visualizza il valore 15.
Gli OPERATORI ARITMETICI - noti come PIÙ, MENO, PER, DIVISO – in un
PC assumono la seguente forma: +, -, *, /.
L’espressione: =10+5*2 dà come risultato 20. L’espressione: =(10+5)*2 dà
come risultato 30.
Una formula può anche gestire valori di testo. Se la cella A1 contiene il nome
Modello, introducendo la formula =A1 in un’altra cella, anch’essa visualizzerà
Modello. Questo è un valore stringa.
Riferimenti
Nell’uso corretto di Excel le formule non devono contenere quasi mai i valori,
ma i riferimenti ai valori. Si introducano nella cella C1 il valore 10, in C2 il
valore 5, infine in C3 il valore 2. Digitando in un’altra cella la formula =C1+C2*C3
si ottiene il valore 20. Questa modalità permette di variare il risultato al variare
dei valori nelle celle a cui la cella del risultato fa riferimento. La variazione
automatica del risultato avviene se in menu Strumenti, voce Opzioni, scheda
Calcolo è abilitata l’opzione Ricalcolo automatico (di default). Altrimenti si può
disabilitare il ricalcolo automatico e rendere attivo il Ricalcolo manuale. In
questo caso, una volta variati gli input della formula, occorre premere F9 per
aggiornare il risultato.
In base all’operazione che si desidera eseguire, è possibile scegliere tra i
riferimenti relativi, misti o assoluti. Se la cella B1 contiene il valore 10 e la cella
A2 contiene la formula =B1, in A2 è riportato il valore 10. Questo è un esempio
di riferimento relativo. Quando si trascina o copia una formula che utilizza i
riferimenti relativi, i riferimenti della formula trascinata o incollata vengono
modificati automaticamente per adeguarsi alla nuova posizione della formula.
Se A2 contiene la formula =B1, B1 contiene 10, B2 contiene 15, trascinando o
copiando la formula di A2 in A3, questa mostra 15.
I riferimenti assoluti invece non vengono adeguati durante il trascinamento o la
copia di una formula in una cella differente. Se in A3 è contenuto 10, in C3 5, in
C4 2, e in B1 la formula =A3*C3, B1 mostra 50. Trascinando la cella B1 in B2 si
ottiene 0, ovvero il risultato della formula =A4*C4. Questo trascinamento
rappresenta un errore. Per bloccare il riferimento ad A3 occorre trasformare la
formula della cella B1 in =$A$3*C4. Il risultato in B2 sarà così 20.
Un riferimento assoluto del tipo =$A$3 impedisce l’adeguamento dei riferimenti
sia che si operi un trascinamento verticale che orizzontale. I riferimenti misti
consentono di bloccare verticalmente, ma non orizzontalmente, o viceversa.
Nella formula =A$3*$C5 con =A$3 si permettono gli adeguamenti orizzontali,
Nomi
È possibile utilizzare un nome per rappresentare una formula o un valore
costante tramite la Casella del nome, a sinistra della Barra della formula.
Digitare il nome desiderato e premere INVIO. Se si denominano Bob e Dilan le
celle C2 e B4, che contengono i valori 10 e 5, si può ottenere il risultato della
somma in A1, digitando in questa cella la formula =Bob+Dilan. Fare uso dei
nomi equivale all’utilizzo di un riferimento assoluto. Per rimuovere un nome di
cella, ad esempio Dilan, si opera dal menu Inserisci/Nome, voce Definisci
nome, dalla quale si seleziona Dilan e poi si clicca sul pulsante Elimina.
Un nome, oltre che a una cella può essere attribuito anche a una costante. Un
esempio è il calcolo in Euro. Dal menu Inserisci/Nome si sceglie la voce
Definisci. Nella casella Nomi della cartella di lavoro: si digita euro e si clicca
Aggiungi, mentre nella casella Riferito a: si digita =1936.27 e si conferma con
OK. Se ora in una cella qualsiasi si digita =euro, viene restituito 1936.27, se si
digita =10*euro si ottiene 19362.7, ecc.
La tecnica di attribuire i nomi alle celle può anche riguardare intervalli di celle.
Tridimensionalità
La tridimensionalità è una operazione tipica di Excel. Word infatti è un
programma bidimensionale: i suoi documenti hanno sempre uno sviluppo
orizzontale e verticale. Diversamente Excel si può sviluppare anche in
profondità, cioè su più fogli contemporaneamente. Tra le implicazioni della
tridimensionalità c’è il consolidamento dei dati.
Si nominino 12 fogli con i riferimenti ai mesi dell’anno (Gen, Feb, Mar, …) più
un foglio di riepilogo. Ad esempio se di un modello di auto sono stati venduti 10
esemplari a gennaio, 15 a febbraio, 5 a dicembre, si vuole ottenere il totale
delle vendite nel foglio riepilogativo. Il numero di vetture è riportato nella cella
F10 dei tre fogli mensili. Per ottenere il totale nella cella B3 del foglio
riepilogativo, si procede come segue:
• posizionarsi nella cella B3 del foglio riepilogativo e digitare =;
• attivare il foglio Gen e cliccare sulla cella F10;
• premere il tasto + , attivare il foglio Feb e poi la cella F10;
• premere il tasto + , attivare il foglio Dic e poi la cella F10;
• finiti i fogli dei quali si vogliono sommare i valori, si conferma
l’immissione della formula con un INVIO.
Il risultato ottenuto nella cella B3, 30, corrisponde alla formula:
=Gen!F10+Feb!10+Dic!10. Il punto esclamativo permette a Excel di capire che il
nome che lo precede appartiene a un foglio di lavoro.
Se si modifica il valore in F10 del foglio Gen, da 10 a 20, il risultato in B3 del
foglio riepilogativo diventa 40. La possibilità di creare formule che operano su
più fogli prende il nome di Consolidamento tridimensionale dei dati.
Le funzioni
Le funzioni sono formule predefinite che rendono più veloci operazioni ripetitive
(es., sommare il contenuto di più celle) o più facili operazioni complesse (es.,
un’analisi statistica).
La sintassi generale delle funzioni è del tipo: =NomeFunzione(Argomenti).
Anziché digitare direttamente una funzione in una cella si può ricorrere agli
automatismi del comando Inserisci funzione, richiamabile dalla barra degli
strumenti Standard. Si tratta di una metodologia non molto efficiente ma che
costituisce un potente strumento conoscitivo per esplorare e studiare la
notevole quantità di funzioni messe a disposizioni da Excel.
Funzioni di base
La funzione SOMMA rappresenta uno degli elementi fondamentali di Excel.
Volendo sommare nella cella A6 le prime quattro celle della colonna A, si digita
in A6: =SOMMA(A1:A4). Per sommare le prime quattro celle della colonna A e
della colonna C si digita: =SOMMA(A1:A4;C1:C4). Per sommare tutti i numeri
presenti nelle prime quattro celle delle colonne A, B e C si digita:
=SOMMA(A1:C4). La funzione Somma serve anche ad addizionare valori
contenuti in fogli diversi. Se dodici fogli sono nominati con i riferimenti dei mesi
(Gen, …, Dic) e si volessero sommare i valori contenuti nella cella A1 di tutti i
fogli la formula diventa: =SOMMA(Gen:Dic!A1). Analogamente si possono
sommare anche intervalli di celle di cartelle diverse. La funzione che segue
effettua la somma dell’intervallo di celle A1:C3 locato nel Foglio2 dellla cartella
Comuni.xls: =SOMMA([Comuni.xls]Foglio2!$A$1:$C$3).
Le funzioni MAX, MIN, MEDIA sono le tre funzioni statistiche più semplici. Le
funzioni =MAX(A1:C4), =MIN(A1:C4), MEDIA(A1:C4) restituiscono,
rispettivamente, il valore massimo, minimo e medio dei valori contenuti nelle
prime quattro celle delle colonne A, B e C.
Altre due semplici funzioni statistiche sono MODA, che restituisce il valore più
ricorrente di un intervallo di dati, e MEDIANA, che restituisce il numero che
occupa la posizione centrale di un insieme di numeri.
OPERATORI DI CONFRONTO
Maggiore > Diverso <>
Minore < Maggiore o uguale >=
Uguale = Minore o uguale <=
=E(Vero,Vero) VERO
=E(Vero,Falso) FALSO
=E(Falso,Falso) FALSO
=O(Vero,Vero) VERO
=O(Vero,Falso) VERO
=O(Falso,Falso) FALSO
Premesse
Molti programmatori non considerano l’ipotesi di programmare in BASIC. Il nome
stesso (acronimo di Beginner’s All-purpose Symbolic Instruction Code) indica che
non è un linguaggio professionale. BASIC venne sviluppato per la prima volta agli
inizi degli anni ‘60 come metodologia per insegnare tecniche di programmazione a
studenti universitari. Successivamente, BASIC ha preso piede velocemente ed ora è
disponibile in svariati linguaggi per molti tipi di computers.
All’inizio BASIC era un interprete di linguaggio con delle prestazioni particolarmente
lente poichè ogni linea di codice doveva essere interpretata prima di poter essere
eseguita. I linguaggi più moderni di BASIC permettono la compilazione del codice,
risultando così molto più veloci.
BASIC si guadagnò piena stima nel 1991 quando la Microsoft realizzò Visual Basic
per Applicazioni (VBA), rendendo particolarmente semplice lo sviluppo di applicazioni
per Windows. Visual Basic ha veramente molto poco in comune con le prime versioni
di BASIC, nonostante BASIC sia il fondamento sul quale VBA è stato costruito e
sviluppato.
Con Excel 5, Visual Basic per Applicazioni è stato per la prima volta reso disponibile
sul mercato. VBA costituisce il miglior esempio di linguaggio disponibile nelle
applicazioni Microsoft e viene oggi incluso in tutte le applicazioni di Office 2002,
perfino in applicazioni di altri produttori di software. Il VBA appartiene alla famiglia del
linguaggio di programmazione Visual Basic (VB), con cui condivide sintassi e
struttura, ma da cui si differenzia per contenere gli oggetti peculiari di una
applicazione Windows. Per esempio, il connubio Excel e VBA offre la possibilità di
creare potenti strumenti informativi completamente automatizzati utilizzando gli
oggetti di un foglio elettronico. Infatti, in Excel esistono numerosi oggetti come fogli di
lavoro, grafici, tabelle pivot, scenari, funzioni matematiche, finanziarie, ecc.
Progressivamente (a partire da Office 97) il VBA è stato esteso a tutte le applicazioni
Microsoft, in modo da diventare un unico linguaggio di programmazione nella
specificità dei rispettivi ambienti di lavoro e favorire così la sinergia tra diversi
programmi (ad esempio tra Access ed Excel).
Esempi brevi
In questo capitolo vengono riportati alcuni brevi esempi sull’uso di VBA. I concetti di
base sono qui solo accennati e saranno approfonditi nei capitoli successivi, dove
esamineremo i rudimenti della programmazione in VBA. Lo scopo è quindi solo
quello di un primo approccio che consenta di vedere alcune funzionalità di Excel
abitualmente ignorate dagli utenti.
Sub Comunicare()
.
.
.
End Sub
End Sub
Immettere l’istruzione MsgBox "Ciao!". Il codice compelto risulta:
Private Sub Workbook_Open()
MsgBox "Ciao!"
End Sub
End Sub
Immettere l’istruzione Range("A1") = Now. Il codice completo risulta:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As
Boolean)
Range("A1") = Now
End Sub
L’esecuzione della macro assegna alla cella A1 la data corrente nel formato
gg/mm/aaaa hh:mm AM (o PM).
Esempio 13 – Funzioni
La creazione di funzioni complesse può essere fatta in modo più semplice
utilizzando il codice invece che il foglio elettronico. Nell’esempio riportato viene
calcolata una imposta sul reddito usando la dichiarazione Select Case in base
al seguente scenario:
- i primi 5000 euro non sono tassabili;
- i successivi 2500 euro sono tassati al 22%;
- ogni importo superiore a 7500 euro è tassato al 25%.
Digitare in A1 Reddito e in B1 il relativo ammontare, per esempio 20000. In A2
digitare Imposta e in B2 =tax(B1).
Il codice è il seguente:
Public Function tax(income As Single)
Select Case income
Case Is <= 5000
tax = 0
Case Is <= 7500
tax = (7500 - 5000) * 0.22
'in questo caso è 550
Case Else
tax = (income - 7500) * 0.25 + 550
End Select
End Function
Il risultato in B2 è 3675 euro: (7500–5000)*22%+(20000-7500)*25%.
Uso avanzato di MS Excel 16
Le basi di VBA
L’elenco che segue è un breve sommario di tutto quello che riguarda VBA:
Con VBA scrivi (o registri) il codice che viene mantenuto in un modulo VBA.
I moduli vengono memorizzati in un libro di lavoro Excel, che puoi vedere o
aprire usando il Visual Basic Editor (VBE).
Oltre alle procedure Sub, un modulo VBA può anche avere procedure
Function.
Una procedura Function restituisce un valore singolo (o un vettore). Una
funzione può essere chiamata da un’altra procedura VBA, o usata in una
formula di foglio di lavoro. Qui c’è un esempio di una funzione chiamata
AddTwo:
Function AddTwo(arg1 , arg2)
AddTwo = arg1 + arg2
End Function
Interesse = Worksheets(“Foglio1”).Range(“A1”).Value
Fino qui è stata fornita una descrizione a grandi linee di VBA. Ora è il momento di
entrare nel dettaglio.
I moduli VBA non sono visibili a meno che VBE non venga attivato.
Attivazione di VBE
Quando si lavora in Excel, si può passare a VBE in uno dei seguenti modi:
Premendo Alt+F11.
Selezionando Strumenti/Macro/Visual Basic Editor.
Ciccando il pulsante Visual Basic Editor ( ), posto nella barra degli
strumenti di Visual Basic.
Barra menu
La barra del menu di VBE funziona come ogni altra barra di menu. Essa contiene
comandi che si usano per lavorare con le varie componenti di VBE. Inoltre esistono
delle opzioni veloci per molti comandi del menu VBE. Per esempio, il comando
Visualizza/Finestra Immediata ha come via breve Ctrl+G.
Si preme Ctrl+R per rendere visibile una finestra. Per nascondere la finestra si preme
il pulsante Chiudi nel titolo della sua barra (o premi col destro in una qualsiasi parte
della finestra di Gestione progetti e seleziona Nascondi dal menu di scelta rapida).
Finestra codice
La finestra codice (anche conosciuta come finestra modulo) contiene il codice VBA.
Ogni voce nel progetto ha una sua finestra di codice associata. Per vedere la finestra
del codice di un oggetto, si preme due volte l’oggetto nella finestra Gestione progetti.
Per esempio per vedere la finestra di codice dell’oggetto Foglio 1, si clicca due volte
Foglio1 nella finestra Gestione progetti.
Finestra immediata
La finestra immediata è la più utile per eseguire direttamente espressioni VBA,
testarle e controllarne gli errori nel codice. Questa finestra può essere visibile o
meno. Se non è immediatamente visibile, si preme Ctrl+G. Per chiudere la finestra si
Uso avanzato di MS Excel 20
preme il bottone Chiudi nel titolo della sua barra (o clicca col destro in qualsiasi posto
nella finestra immediata e seleziona Nascondi dal menu di scelta rapida).
Gestione progetti
Quando si lavora in VBE, ogni libro di lavoro Excel, comprese le componenti
aggiuntive in quello che è il lavoro corrente è considerato un progetto. Si può
immaginare un progetto come una collezione di oggetti disposti in modo ordinato. Si
può espandere un progetto cliccando il segno più (+) alla sinistra del nome del
progetto nella finestra di Gestione progetti. Si può ridurre il progetto cliccando il
segno meno (-) a sinistra del nome del progetto. Si può anche usare il pulsante
Espandi/comprimi cartelle nella barra in cima alla finestra Gestione progetti per
espandere o ridurre il progetto. Se si prova a espandere un progetto protetto, viene
richiesta la password.
Quando si attiva VBE, non è detto che il codice del modulo che viene
mostrato corrisponda all’oggetto evidenziato nella finestra Gestione
progetti. Per essere sicuri di lavorare nel codice del modulo giusto,
cliccare due volte l’oggetto nella finestra di Gestione progetti.
Se sono aperti molti libri di lavoro, la finestra di Gestione progetti può risultare un po’
schiacciata. Sfortunatamente, non è possibile nascondere il progetto nella finestra di
Gestione progetti.
Ogni progetto espanso mostra i capitoli di ogni libro di lavoro (ogni foglio è
considerato un oggetto), e un altro oggetto chiamato ThisWorkbook (il quale
rappresenta l’oggetto ActiveWorkbook). Se il progetto ha qualche modulo VBA, il
progetto elencato mostra pure l’elenco dei moduli. Un progetto può anche contenere
gli oggetti denominati UserForm (anche conosciuti come finestre di dialogo). Se il
progetto ha moduli di classe, mostrerà anche un elenco dei moduli di classe.
Per importare un file in un progetto si seleziona il nome del progetto nella finestra
Gestione progetti e si sceglie File/Importa file. Si ottiene una finestra di dialogo che
richiede il nome del file. Si può importare solo un file che è stato esportato usando il
comando File/Esporta file.
Le finestre di codice
A ogni oggetto è associata una finestra di codice. Tali oggetti possono essere:
Le finestre di codice sono molto simili alle finestre del foglio di lavoro in Excel. Si
possono minimizzare, massimizzare, nascondere, riarrangiare e così via. Molti utenti
trovano più efficiente massimizzare la finestra di codice nella stanno lavorando. Per
massimizzare la finestra di codice, cliccare il pulsante Ingrandisci nel titolo della barra
o fare un doppio clic nel titolo della barra. Per ripristinare la finestra di codice,
cliccare sul tasto Ripristina nel titolo della sua barra.
Alle volte, può essere utile avere due o più finestre di codice visibili, ad esempio per
comparare il codice di due moduli, o copiare codice da un modulo all’altro.
Minimizzando una finestra di codice essa si localizza nella parte bassa dello
schermo. Premendo il tasto Chiudi nel titolo della barra della finestra di codice la
finestra si chiude completamente. Per aprirla nuovamente cliccare due volte l’oggetto
appropriato dalla finestra di Gestione progetti.
VBE non permette di chiudere un libro di lavoro. Occorre richiamare Excel e fare la
chiusura da qui. Comunque si può usare la Finestra Immediata per chiudere un libro
di lavoro o aggiungerne uno. Appena attivata la Finestra Immediata, digitare
un’espressione VBA simile a quella di seguito e premere Invio.
Un singolo modulo VBA può mantenere qualunque passo di procedura Sub, Function
e dichiarazione. Come organizzare un modulo VBA è compito dell’utente. Alcuni
utenti preferiscono tenere tutto il loro codice VBA per una applicazione in un singolo
modulo VBA; ad altri piace suddividere il codice in numerosi differenti moduli.
Entrando nel codice nella vecchia maniera e cioè digitandolo sulla tastiera.
Usando il registratore di macro di Excel per registrare le azioni e convertirle
nel codice VBA.
Copiando il codice da un altro modulo e incollandolo nel modulo in cui si sta
lavorando.
Provare quanto segue: inserire un modulo VBA in un progetto, e poi entrare nella
seguente procedura nella finestra di codice del modulo:
Sub TuoNome( )
Msg = “Il tuo nome è “ & Application.UserName & “?”
Ans = MsgBox(Msg, vbYesNo)
If Ans = vbNo Then
MsgBox “Oh, mi dispiace.”
Else
MsgBox “Devo essere telepatico!”
End If
End Sub
Entra nel codice si nota che VBE fa alcuni aggiustamento sul testo.
Esempio, se si omette lo spazio prima e dopo il segno uguale, VBE lo
inserisce. Inoltre, il colore di parte dei testi è cambiato. Questo è
normale, e sarà apprezzato più avanti.
Premere F5.
Selezionare Esegui dal menu e scegliere il comando Esegui Sub/UserForm.
Premere il pulsante Esegui Sub/UserForm ( ) sulla barra degli strumenti
standard.
Per dare uno sguardo alla macro, attivare il VBE (Alt+F11) e trovare il progetto
relativo nella finestra Gestione progetti. Cliccare il Modulo1 per mostrare la finestra di
codice (se il progetto ha già un Modulo1, la nuova macro sarà Modulo2). Il codice
generato da un singolo comando è mostrato nella Lista 1. Per coloro che usano una
versione di Excel che non è Excel2002, il codice può variare leggermente.
Sub Macro1()
'
' Macro1 Macro
' Macro registrata il 18/11/2002 da MAESTRINI
'
'
With ActiveSheet.PageSetup
.PrintTitleRows = ""
.PrintTitleColumns = ""
End With
ActiveSheet.PageSetup.PrintArea = ""
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = ""
.RightFooter = ""
.LeftMargin = Application.InchesToPoints(0.787401575)
.RightMargin = Application.InchesToPoints(0.787401575)
.TopMargin = Application.InchesToPoints(0.984251969)
.BottomMargin = Application.InchesToPoints(0.984251969)
.HeaderMargin = Application.InchesToPoints(0.5)
.FooterMargin = Application.InchesToPoints(0.5)
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintQuality = 300
.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlLandscape
.Draft = False
.PaperSize = xlPaperA4
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = 100
.PrintErrors = xlPrintErrorsDisplayed
End With
End Sub
Sub Macro1()
With ActiveSheet.PageSetup
.Orientation = xlLandscape
End With
End Sub
È stato cancellato tutto il codice in eccesso mediante l’istruzione che setta la
proprietà Orientation. In realtà, questa macro può essere semplificata ancora di più
Uso avanzato di MS Excel 28
perché la costruzione With-EndWith non è necessaria quando si modifica una sola
proprietà:
Sub Macro1( )
ActiveSheet.PageSetup.Orientation = xlLandscape
End Sub
Sub Macro1( )
ActiveSheet.PageSetup.Orientation = 2
End Sub
La scheda Editor
La figura seguente mostra le opzioni a cui si può accedere cliccando il tab Editor
dalla finestra di dialogo Opzioni.
Option Explicit
Se ciò appare, è obbligatorio definire ogni variabile che viene usata. Questa è una
eccellente abitudine da prendere, benchè richieda alcuni sforzi in più da parte
dell’utente. Se le variabili non vengono dichiarate, tutti i dati sonodi di tipo Variant, e
ciò non è efficiente.
Rientro automatico
Il settaggio Rientro automatico determina se VBE automaticamente deve far rientrare
ogni nuova linea di codice alla stessa maniera come la linea precedente. È possibile
specificare il numero di caratteri di rientro (di default sono 4).
Separa routine
Quando l’opzione Separa routine è attivata, vengono mostrate linee di separazione
alla fine di ogni procedura nella finestra di codice.
Tipo di carattere
L’opzione Tipo di carattere permette di impostare il carattere del testo che si usa nei
moduli VBA.
Dimensione
Specifica la grandezza del carattere nei moduli VBA.
Barra indicatori
Questa opzione controlla la disposizione del margine verticale dell’indicatore della
barra nei moduli.
La scheda Generale
La figura seguente mostra le opzioni disponibili sotto lo schema Generale nella
finestra di dialogo delle opzioni. Quasi in ogni caso i settaggi di default sono
adeguati.
La scheda Ancoraggio
La figura seguente mostra la scheda Ancoraggio della finsetra di dialogo delle
Opzioni. Queste opzioni determinano il comportamento delle diverse finestre in VBE.
Quando una finestra è ancorata, viene fissata lungo uno dei margini della finestra di
Oggetti e Collezioni
In questa sezione sono riportato maggiori dettagli rispetto ai precedenti capitoli
relativamente agli oggetti e alle collezioni di oggetti.
Gli oggetti vanno immaginati in termini di gerarchia. In cima alla gerarchia c’è
l’oggetto Application – nel nostro caso Excel stesso. Ma se si programma in VBA
usando Microsoft Word, l’oggetto Application è Word.
L’oggetto gerarchia
L’oggetto Application (che è Excel) contiene altri oggetti. Qui ci sono solo pochi
esempi di oggetti contenuti nell’oggetto Application:
Alcuni oggetti contengono altri oggetti. Per esempio, la collezione Workbooks consiste
di tutti gli oggetti Workbook aperti, e l’oggetto Workbook contiene altri oggetti, alcuni
dei quali sono i seguenti:
Worksheets (una collezione di oggetti Worksheet)
Charts (una collezione di oggetti Chart)
Names (una collezione di oggetti Name)
Ognuno di questi oggetti, a sua volta, può contenere altri oggetti. La collezione
Worksheets consiste di tutti gli oggetti Worksheet in un Workbook. Un oggetto
Worksheet contiene molti altri oggetti, i quali includono i seguenti:
Le collezioni
Un altro concetto chiave nella programmazione di VBA è rappresentato dalle
collezioni. Una collezione è un insieme di oggetti della stessa classe (e una
collezione è anch’essa un oggetto). Come scritto sopra, Workbooks è una collezione
di tutti gli oggetti Workbook, correntemente aperti. Worksheets è una collezione di tutti
gli oggetti Worksheet contenuti in un particolare oggetto Workbook. Si può lavorare
con una intera collezione di oggetti o con un oggetto individuale di una collezione.
Per fare riferimento ad un singolo oggetto di una collezione, mettere il nome
dell’oggetto o il numero di indice fra parentesi dopo il nome della collezione, come
segue:
Worsheets(“Sheet1”)
Worksheets(1)
Foglio(1)
Riferimento all’oggetto
Quando ci si riferisce ad un oggetto usando VBA, spesso si deve qualificare l’oggetto
connettendo i nomi dell’oggetto con un periodo (anche conosciuto come “operatore
punto”). Per esempio, si hanno due libri di lavoro aperti ed in entrambi è contenuto
un foglio di lavoro chiamato Foglio1. Il singolo foglio si identifica facendo riferimento
al contenitore dell’oggetto, come segue:
Workbooks(“Book1”).Worksheets(“Foglio1”)
Senza il libro di lavoro qualificatore, VBA vedrebbe Foglio1 nel libro di lavoro attivo.
Per far riferimento ad uno specifico intervallo (come può essere la cella A1) su un
foglio di lavoro chiamato Foglio1 in un libro di lavoro chiamato Book1, si può usare la
seguente espressione:
Workbooks(“Book1”).Worksheets(“Foglio1”).Range(“A1”)
Application.Workbooks(“Book1”).Worksheets(“Foglio1”).Range(“A1”)
Worksheets(“Foglio1”).Range(“A1”)
Ancora, se Foglio1 è il foglio di lavoro attivo, si può usare una espressione ancora
più semplificata:
Range(“A1”)
I semplici riferimenti agli oggetti (come in questi esempi) non comportanoo alcuna
esecuzione. Per permettere esecuzioni, occorre associare ad un oggetto le sue
proprietà, o specificare un metodo che deve essere usato con quell’oggetto.
Proprietà e Metodi
In questa sezione descriveremo come accedere alle proprietà e ai metodi degli
oggetti.
Sub ShowValue( )
MsgBox Worksheets(“Foglio1”).Range(“A1”).Value
End Sub
MsgBox è una funzione utile per mostrare risultati mentre il codice VBA
è in esecuzione.
Il codice nel precedente esempio mostra il settaggio corrente della proprietà Value di
una cella specifica: cella A1 nel foglio di lavoro chiamato Foglio1 nel libro di lavoro
attivo. Nota che se il libro di lavoro attivo non ha un foglio chiamato Foglio1, la
macro genererà un errore.
La seguente procedura cambia il valore mostrato nella cella A1 cambiando la
proprietà Value della cella.
Sub ChangeValue( )
Worksheets(“Foglio1”).Range(“A1”).Value = 123
Dopo l’esecuzione di questo processo, la cella A1 sul foglio 1 assume il valore 123.
Sub ZapRange()
Worksheets("Foglio1").Range("A1:C3").Clear
End Sub
Sub CopyOne()
Worksheets("Foglio1").Range("A1").Copy Worksheets("Foglio1").Range("B1")
End Sub
La proprietà Range
La proprietà Range restituisce l’oggetto Range. Questa proprietà ha due sintassi:
object.Range(cell1)
object.Range(cell1, cell2)
La proprietà Range si applica per due tipi di oggetti, l’oggetto Worksheet o l’oggetto
Range. Qui cell1 e cell2 si riferiscono allo spazio che identifica l’intervallo (una cella
nel primo caso, più celle nel secondo caso). Di seguito ci sono alcuni esempi sull’uso
del metodo Range.
Worksheets(“Foglio1”).Range(“A1”).Value = 1
La proprietà Range riconosce anche i nomi definiti in un libro di lavoro. Perciò se una
cella è chiamata “Input”, si può usare la seguente espressione per entrare nel valore
della cella così denominata:
Worksheets(“Foglio1”).Range(“Input”).Value = 1
ActiveSheet.Range(“A1:B10”).Value = 2
Range(“A1”, “B10”) = 2
Il foglio di riferimento è tralasciato, così viene preso il foglio attivo. Anche la proprietà
valore è tralasciata e lascia il posto alla proprietà di default (nel caso di oggetto Range
è Value). Questo esempio usa anche la seconda sintassi per la proprietà Range. Con
questa sintassi, il primo argomento è la cella in alto a sinistra dell’ intervallo e il
secondo argomento è la cella in basso a destra dell’intervallo.
L’esempio seguente usa l’operatore di intersezione di range di Excel (uno spazio) per
restituire l’intersezione di due intervalli. In questo caso, l’intersezione è una singola
cella, C6. Perciò, l’espressione pone 3 nella cella C6:
Range(“C1:C10 A6:E6”) = 3
Tutti gli esempi hanno usato la proprietà Range su un oggetto Worksheet. Ti ricordo
che puoi anche usare la proprietà Range su un oggetto Range.
Quel che segue è un esempio di uso della proprietà Range su oggetto Range (in
questo caso, l’oggetto Range è la cella attiva). Questo esempio tratta l’oggetto Range
come se fosse la cella superiore a sinistra nel foglio di lavoro, e poi pone il valore 5
nella cella che sarebbe la cella B2. In altre parole, il riferimento restituito è relativo
all’angolo superiore sinistro dell’oggetto Range. Perciò, l’espressione che segue pone
il valore 5 nella cella direttamente alla destra e una riga sotto la cella attiva:
ActiveCell.Range(“B2”) = 5
Ci sono molte modalità per accedere a celle relative a intervalli, chiamate proprietà
Offset, di cui si parlerà più avanti.
object.Cells(rowIndex, columnIndex)
object.Cells(rowIndex)
object.Cells
Mostreremo alcuni esempi sull’uso della proprietà Cells. Il primo esempio riceve il
valore 9 nella cella 1 sul foglio 1. In questo caso, si usa la prima sintassi, che accetta
il numero di indice di riga (da 1 a 65536) e di colonna (da 1 a 256):
Worksheets(“Foglio1”).Cells(1, 1) = 9
Segue un esempio che riporta il valore 7 nella cella D3 (che è, riga 3, colonna 4) nel
foglio di lavoro attivo:
ActiveSheet.Cells(3, 4) = 7
Si può anche usare la proprietà Cells su un oggetto Range. Così facendo, l’oggetto
Range restituito dalla proprietà Cells è relativo alla cella in alto a sinistra del
riferimento Range. Per esempio, la seguente istruzione registra il valore 5 nella cella
attiva. In questo caso la cella attiva è trattata come se fosse la cella A1 nel foglio di
lavoro:
ActiveCell.Cells(1, 1) = 5
Per registrare il valore 5 nella cella direttamente sotto la cella attiva, si può usare
l’istruzione:
ActiveCell.Cells(2, 1) = 5
Il precedente esempio recita: “Inizia con la cella attiva e considera questa cella come
cella A1. Registra la cella nella seconda riga e nella prima colonna”.
La seconda sintassi del metodo Cells usa un singolo argomento con intervallo da 1
a 16777216. Questo numero corrisponde al numero delle celle in un foglio di lavoro
(65536 righe per 256 colonne). Le celle sono numerate partendo da A1 e
continuando a destra e poi sotto nella riga successiva. La 256ma cella è IV1 e la
257ma è A2.
Il prossimo esempio registra il valore 2 nella cella H3 (la quale è la 520ma cella nel
foglio di lavoro) del foglio di lavoro attivo:
ActiveSheet.Cells(520) = 2
Per mostrare il valore nell’ultima cella del foglio di lavoro (IV65536) usa questa
espressione:
MsgBox ActiveSheet.Cells(16777216)
La terza sintassi per la proprietà Cells restituisce tutte le celle sul foglio di lavoro di
riferimento. Al contrario delle altre due sintassi, in questa, i dati non sono restituiti in
una singola cella. Questo esempio usa il metodo ClearContents sull’intervallo
restituito usando la proprietà Cells su un foglio di lavoro attivo. Il risultato è che i
contenuti di ogni cella sul foglio di lavoro vengono cancellati:
ActiveSheet.Cells.ClearContents
Range(“A1”).Font.Bold = True
Workbooks(“Sales.xls”).Worksheets(“Summary”)
Workbooks(1).Worksheets(1)
Workbooks(1).Foglio(1)
Application.ActiveWorkbook.ActiveSheet
ActiveWorkbook.ActiveSheet
ActiveSheet
Se per esempio ci sono più libri di lavoro aperti, il secondo e il terzo metodo
non sono realizzabile. Se si vuole lavorare con il foglio attivo (qualunque esso
sia), non sono utilizzabili gli ultimi tre metodi. Per essere assolutamente sicuri
di riferirsi ad un determinato foglio in un determinato libro di lavoro, il primo
metodo è quello migliore.
Questo capitolo riporta alcuni elementi chiave del linguaggio e i concetti della
programmazione in VBA.
Sub VBA_Demo ( )
‘ Questo è un semplice esempio VBA
Dim Totale As Integer, I As Integer
Totale = 0
For i = 1 to 100
Totale = Totale + i
Next i
MsgBox Totale
End Sub
Commenti
Un commento è un testo descrittivo impresso all’interno del codice. Il testo di un
commento è completamente ignorato dal VBA. È buona cosa usare commenti
liberamente per descrivere cosa si sta facendo (l’istruzione con cui si intende fare
qualcosa non è sempre così ovvia).
Si possono utilizzare linee intere per il commento o inserire un commento dopo una
istruzione sulla stessa linea. Un commento viene indicato con un apostrofo. VBA non
prende in considerazione il testo che segue un apostrofo – eccetto quando
l’apostrofo si trova fra virgolette – fino a fine linea. Per esempio, la seguente
affermazione non contiene un commento, sebbene contenga un apostrofo:
Sub Commenti ( )
‘ Questa procedura non restituisce valori
x = 0 ‘x rappresenta il nulla
‘ Mostra i risultati
MsgBox x
End Sub
Sub CattiviCommenti ( )
‘ Dichiara le variabili
Dim x As Integer
Dim y As Integer
Dim z As Integer
‘ Inizia la routine
x = 100 ‘ Assign 100 to x
y = 200 ‘ Assign 200 to y
‘ Aggiungi x e y e metti in z
z = x + y
‘ Mostra i risultati
MsgBox z
End Sub
Inserisce spazi tra operatori. Se si scrive Ans=1+2 (senza spazi), per esempio,
VBA converte in
Ans = 1 + 2
VBA ordina il tipo di lettere per parole chiave, proprietà e metodi. Se si registra
il seguente testo:
Results=activesheet.range (“a1”).value=12
VBA converte in:
Results = ActiveSheet.Range (“a1”).Value = 12
Da notare che il testo che si trova tra le virgolette (in questo caso a1) non è
cambiato.
VBA esamina attentamente l’istruzione per verificare che non ci siano errori di
sintassi. Se VBA trova un errore, automaticamente cambia il colore della linea
e può visualizzare un messaggio che sta a significare che c’è un problema.
Utilizzare il comando VBE Strumenti/Opzioni per visualizzare la casella di
dialogo delle opzioni, dove si controlla il colore dell’errore e dove ogni
messaggio di errore viene visualizzato (usare l’opzione Controllo automatico
sintassi della scheda Editor).
La barra di apertura degli strumenti di VBE contiene due utili pulsanti. Selezionare un
gruppo di istruzioni e poi utilizza il pulsante Commento per convertire le istruzioni in
commenti. Il pulsante Rimuovi commento, al contrario, converte un gruppo di
commenti in istruzioni.
La seguente lista contiene alcuni esempi di dichiarazioni che usano diverse tipologie
di variabili. I nome delle variabili sono alla sinistra dei segni di uguale. Ogni
dichiarazione assegna al valore alla destra del segno di uguale la variabile a sinistra.
Es.:
X = 1
TassoInteresse = 0.075
RataAffitto = 243089
IngressoDati = False
X = x + 1
MioNumero = TuoNumero * 1.25
NomeUtente = “Bob Johnson”
DataInizio = #3/14/98#
Next = 132
Generalmente è meglio usare tipo di dati che utilizzano il minor numero di bytes
perché ancora possa manipolare tutti i dati ad esso affidati. Quando VBA lavora con
dati, la velocità di esecuzione è in funzione del numero di bytes che ha a sua
disposizione. In altre parole, meno sono i bytes utilizzati per i dati, più veloce è VBA
nell’accedere ai dati e e manipolarli.
Dichiarazione di variabili
Se non si dichiari il tipo di dati per una variabile utilizzata in una routine, VBA usa i
tipi di dati di default, Variant. I dati archiviati come Variant cambiano tipologia in
funzione di come vengono utilizzati. La seguente procedura dimostra come una
variabile possa assumere differenti tipi di dato.
Sub VariantDemo ( )
MyVar = “123”
MyVar = MyVar / 2
MyVar = “Answer: “ & MyVar
MsgBox MyVar
End Sub
Nella procedura VariantDemo, MyVar comincia come stringa a tre caratteri. Quindi la
“stringa” è divisa in due ed inizia con dati di tipo numerico. Successivamente, MyVar è
apposta ad una stringa, convertendo MyVar si ritorna alla stringa. Il MsgBox mostra sul
display la stringa finale: Answer: 61.5
Per dimostrare ulteriormente i possibili problemi dati dal tipo di dati variant, proviamo
ad eseguire questa procedura:
Sub VariantDemo2 ()
MyVar = “123”
MyVar = MyVar + MyVar
MyVar = “Risposta: “ & MyVar
MsgBox MyVar
End Sub
Il messaggio che verrà visualizzato sarà: “Risposta: 123123”. Quando si tratta con
dati Variant che contengono stringhe di testo, l’operatore + esegue una stringa di
concatenamento.
Sub TimeTest()
Dim x As Integer, y As Integer
Dim A As Integer, B As Integer, C As Integer
Dim i As Integer, j As Integer
Dim TempoInizio As Date, TempoFine As Date
'Avvio
TempoInizio = Timer
'Esegui i calcoli
x = 0
y = 0
For i = 1 To 5000
For j = 1 To 1000
A = x + y + i
B = y - x - i
C = x - y - i
Next j
Next i
'Fine
TempoFine = Timer
'Visualizza il tempo totale in secondi
MsgBox Format(TempoFine - TempoInizio, "0.0")
End Sub
Sub VariantDemo2 ( )
MyVar = “123”
MyVar = TypeName (MyVar)
MsgBox TypeName (MyVar)
MyVar = “Risposta: “ & MyVar
MsgBox TypeName (MyVar)
MsgBox MyVar
End Sub
Grazie a VBA, la conversione del tipo di dati di variabili non dichiarate è automatico.
Questo processo può sembrare una strada semplice, ma avviene sacrificando
velocità e memoria.
È buona abitudine dichiarare ogni variabile in una procedura prima che di usarla.
Dichiarando una variabile si danno informazioni a VBA circa il suo nome ed il tipo di
dato. Dichiarare le variabili offre due principali vantaggi:
Il tuo programma partirà più velocemente e userà memoria con più efficienza.
Il tipo di dati di default, Variant, causa ripetizione di esecuzione in VBA,
sprecando del tempo a controllare e riserva più memoria del necessario. Se
VBA conosce il tipo di dati, non ha necessità di controllare e può così riservare
abbastanza memoria per immagazzinare dati.
Il programmatore evita di coinvolgersi in digitazioni sbagliare del nome di una
variabile. Ciò presuppone che l’uso di Option Explicit per forzare la
Option Explicit
Questa opzione causa l’arresto del programma ogni volta VBA incontra il nome di
una variabile non dichiarata. VBA lancia un messaggio di errore, e occcrre dichiarare
la variabile prima di procedere.
Variabili local
Una variabile local è una variabile dichiarata all’interno della procedura. Variabili local
possono essere usate solo nelle procedure nelle quali sono dichiarate. Quando la
procedura termina, la variabile non permane a lungo, ed Excel la fa uscire dalla
memoria.
La modalità più comune per dichiarare una variabile local è di collocare Dim tra Sub
ed End Sub. La dichiarazione Dim è normalmente posta a destra dopo la
dichiarazione Sub, prima del codice della procedura.
Dim è una forma contratta di Dimension. Nella vecchia versione di BASIC, questa
dichiarazione era usata esclusivamente per dichiarare le dimensioni per un vettore.
In VBA la parola chiave Dim viene usata per dichiarare variabili, non soltanto vettori.
Sub MySub ( )
Dim x As Integre
Dim Primo As Long
Dim TassoInteresse As Single
Dim DataOggi As Date
Dim NameUtente As String * 20
Dim MioValore
- [Il codice della procedura va qui] -
End Sub
Notare che l’ultimo Dim nel precedente esempio non dichiara un tipo di dati; è
semplicemente il nome della variabile. Come risultato, quella variabile diventa una
Variant.
Tuttavia, si possono anche dichiarare numerose variabili con un singolo Dim. Per
esempio:
Dim MyVar%
I caratteri di dichiarazione tipo esistono per molti tipi di dati VBA (tipi di dati non in
elenco non hanno i caratteri di dichiarazione tipo).
Questo metodo di tipologia di dati è essenzialmente un rimando dal BASIC; per cui è
meglio dichiarare le variabili usando le tecniche descritte in questo capitolo.
Dim i, j, k As Integer
Se una variabile è dichiarata a scopo locale, altre procedure nello stesso modulo
possono usare lo stesso nome di variabile, ma ogni dichiarazione della variabile fa
riferimento alla sua propria procedura.
In generale, le variabili local sono molto efficienti perché VBA libera memoria che
esse usano quando la procedura è conclusa.
Variabili modulewide
A si vorrebbe che una variabile fosse disponibile per tutte le procedure in un modulo.
In tal caso, dichiarare la variabile prima della procedura dell primo modulo (al di fuori
di ogni altra procedura o funzione).
Nel seguente esempio, la dichiarazione Dim è la prima istruzione nel modulo.
Entrambi MySub e YourSub hanno accesso alla variabile CurrentValue.
Sub MySub ( )
1 - [Il codice va qui] –
End Sub
Sub YourSub ( )
- [Il codice va qui] –
- End Sub
Variabili public
Per rendere una variabile disponibile a tutte le procedure in tutti i moduli VBA in un
progetto, dichiarare la variabile a livello del modulo usando la parola chiave Public
piuttosto che Dim. Qui c’è un esempio:
Sub MySub ( )
Static Counter as Integer
- [Il codice va qui] -
End Sub
Dichiarazione di costanti
Si possono dichiarare le costanti utilizzando l’espressione Const. Qui di seguito
alcuni esempi:
Utilizzare costanti in ogni parte del codice al posto di valori di difficile codificazione o
stringhe è una eccellente pratica di programmazione. Per esempio, se una procedura
ha bisogno di riferirsi ad uno specifico valore, come può essere un tasso di interesse,
molte volte è meglio dichiarare il valore come costante e usare il nome della costante
piuttosto che il suo valore nelle espressioni. Questa tecnica non solo rende il codice
più leggibile, ma anche più facile la modifica del valore se fosse necessario – si
cambierebbe solo una istruzione piuttosto che molte.
Sub SettaInOrizzontale ( )
ActiveSheet.PageSetup.Orientation = xlLandscape
End Sub
Le stringhe
Come Excel, VBA può manipolare sia numeri sia testo (stringhe). Ci sono due tipi di
stringhe in VBA:
Ogni carattere in una stringa richiede 1 byte per l’immagazzinamento, e una piccola
aggiunta usata per la testata di ogni stringa. Quando si dichiara una stringa variabile
con l’espressione Dim, si può specificare la sua lunghezza se si conosce (questa è
una stringa di lunghezza fissa: fixed-length-string), o si può lasciare che VBA la
manipoli dinamicamente (stringa di lunghezza variabile: variable-length-string).
Lavorando con stringhe di lunghezze fisse viene riduce l’efficienza in termini di
memoria utilizzata.
Nel seguente esempio, la variabile MyString è dichiarata per essere una stringa con
una lunghezza massima di 50 caratteri. YourString è anch’essa una stringa, ma la
sua lunghezza non viene definita.
Le date
Naturalmente, si può usare una stringa variabile per conservare una data, ma non si
possono eseguire calcoli con date. Il tipo Date è la modalità migliore per lavorare con
le date.
Una variabile definita come Date utilizza 8 bytes per l’immagazzinamento e può
contenere un intervallo di date compreso dal 1 Gennaio A.D. 100 al 31 Dicembre
9999. Questo è circa un periodo di 10.000 anni. Il dato Date è anche utile per il
mantenimento di dati legati al tempo. Nel VBA si specificano date e tempo
includendoli fra due segni di cancelletto (#), come mostrato di seguito.
Dichiarazioni di assegnazione
La dichiarazioni di assegnazione è una istruzione VBA che fa un controllo
matematico e assegna il risultato ad una variabile o ad un oggetto. L’help in linea di
Excel definisce una espressione come: combinazione di parole chiave, operatori,
variabili e costanti che producono stringhe, numeri e oggetti. Una espressione può
eseguire un calcolo, manipolare caratteri o testare dati.
Molto del lavoro in VBA implica lo sviluppo di espressioni (e il controllo degli errori).
Chi sa come creare formule in Excel non troverà problemi nel creare espressioni in
VBA. Con una formula in un foglio di lavoro, Excel mostra il risultato in una cella. Una
dichiarazione VBA può essere assegnata ad una variabile o usata come valore di
una proprietà.
VBA usa il segno di uguale (=) come il suo operatore di assegnazione. Quelli di
seguito sono esempi di espressioni di incarico (le espressioni sono a destra del del
segno di uguaglianza):
x = 1
x = x + 1
x = (y * 2) / (z * 2)
FileOpen = True
FileOpen = Not FileOpen
Range (“Anno”).Value = 2001
17 Mod 3
ActiveWindow.DisplayGridlines = _
Not ActiveWindow.DisplayGridlines
Vettori
Un vettore è un gruppo di elementi dello stesso tipo che hanno un nome comune. Ci
si può riferire a uno specifico elemento nel vettore usando il nome del vettore e un
numero di indice. Per esempio, si può definire un vettore di 12 variabili stringa così
che ogni variabile corrisponda al nome di un mese. Se si denomina il vettore
MonthNames, ci si può riferire al primo elemento del vettore come MonthNames(0), al
secondo elemento come MonthNames (1), e così via, fino a MonthNames(11).
Dichiarare vettori
Si dichiara un vettore con Dim o Public, proprio come una variabile. Si può anche
specificare il numero di elementi nel vettore specificando il primo numero in indice, la
parola chiave To, e l’ultimo numero in indice – tutti all’interno di parentesi. Per
esempio, ecco come esprimere un vettore compreso esattamente fra 100 interi:
Se si preferisce che VBA assuma 1 come valore minimo per tutti i vettori ove si
dichiara il solo valore massimo, includere la seguente istruzione prima di qualsiasi
procedura in un modulo:
Option Base 1
Prima di poter usare un vettore dinamico nel codice, va usata la dichiarazione ReDim
per informare VBA sul numero di elementi nel vettore (o ReDim Preserve per
consercare i valori del vettore). Si può usare la dichiarazione ReDim un numero
qualsiasi di volte, modificando in tal modo l’ampiezza del vettore tutte le volte che se
ne ha bisogno.
I vettori appariranno più tardi in questo capitolo, quando si parlerà di looping.
Variabili oggetto
Una variabile oggetto rappresenta un oggetto completo, come un intervallo di celle o
un foglio di lavoro. Le variabili oggetto sono importanti per due ragioni:
Sub NoObjVar ( )
Worksheets(“Foglio1”).Range(“A1”).Value = 124
Worksheets(“Foglio1”).Range(“A1”).Font.Bold = True
WorkSheets(“Foglio1”).Range(“A1”).Font.Italic = True
End Sub
Questa normale procedura registra un valore (124) nella cella A1 di Foglio1 del libro
di lavoro attivo e poi trasforma il contenuto della cella in grassetto e corsivo. Questo
è uno dei tanti tipi. Si può condensare il tutto con una variabile oggetto:
Sub ObjVar ( )
Dim MyCell As Range
Set MyCell = Worksheets (“Foglio1”).Range(“A1”)
MyCell.Value = 124
MyCell.Font.Bold = True
MyCell.Font.Italic = True
End Sub
Dopo che la variabile MyCell è dichiarata come un oggetto Range, l’istruzione Set
assegna ad esso un oggetto. Le espressioni seguenti possono quindi usare il
riferimento più semplice MyCell al posto del riferimento più lungo Worksheets
(“Foglio1”).Range(“A1”).
Il valore delle variabili oggetto apparirà più chiaro più avanti in questo capitolo
quando discuteremo del looping.
Type CustomerInfo
Company As String * 25
Contact As String * 15
RegionCode As Integer
Sales As Long
End Type
Dopo aver creato un tipo di dati ad definito dall’utente, usare Dim per dichiarare una
variabile di questo tipo. Normalmente si definisci un vettore. Per esempio:
Ciascuno dei 100 elementi del seguente vettore consiste di 4 componenti (come
specificato dal tipo di dati definito dal’utente, CustomerInfo). Ci si può riferire ad una
particolare componente della registrazione come segue:
Customers(2) = Customers(1)
Customers(2).Company = Customers(1).Company
Customers(2).Contact = Customers(1).Contact
Customers(2).RegionCode = Customers(1).RegionCode
Customers(2).Sales = Customers(1).Sales
Funzioni built-in
Come molti linguaggi di programmazione, VBA offre una varietà di funzioni built-in
che semplificano calcoli ed operazioni. Spesso, le funzioni abilitano all’esecuzione di
operazioni che sarebbero oltremodo difficoltose, o perfino impossibili. Molte delle
funzioni VBA sono simili (o identiche) alle funzioni dei fogli di lavoro Excel. Per
esempio, la funzione VBA Ucase, che converte una stringa di argomenti in carattere
maiuscolo è equivalente alla funzione del foglio di lavoro Excel UPPER.
Per lo più le funzioni si utilizzano nelle espressioni VBA allo stesso modo in cui si
utilizzano nelle formule dei fogli di lavoro.
Quella che segue è una semplice procedura che calcola la radice quadrata di 25
usando la funzione VBA Sqr, immagazzina il risultato in un’altra variabile, poi mostra
il risultato:
Sub ShowRoot ( )
MyValue = 25
RadiceQuadrata = Sqr(MyValue)
MsgBox RadiceQuadrata
End Sub
Application.WorksheetFunction
L’esempio seguente mostra come usare una funzione del foglio di lavoro Excel in
una procedura VBA. La funzione ROMAN di Excel, usata raramente, converte un
numero arabo in un numero romano:
Molte funzioni restituiscono un valore singolo, il quale può essere assegnato ad una
variabile. La funzione MsgBox non solo restituisce un valore, ma mostra anche una
finestra di dialogo a cui l’utente può rispondere. Il valore restituito dalla funzione
MsgBox rappresenta la risposta dell’utente al dialogo. Si può usare la funzione MsgBox
anche quando non si è interessati alle risposte dell’utente ma si vuole trarre
vantaggio dal messaggio mostrato.
La sintassi ufficiale della funzione MsgBox ha cinque argomenti (quelli nelle parentesi
quadre sono opzionali):
Notare che è stata usata la somma di due costanti built-in (vbYesNo + vbQuestion)
per l’argomento tasti. Usando vbYesNo mostra due tasti nella finestra di dialogo: uno
etichettato Yes e l’altro etichettato No. Aggiungendo vbQuestion all’argomento inoltre
si mostra di icona di domanda (vedere la figura accompagnata). Quando la prima
espressione è eseguita, Ans contiene uno dei due valori, rappresentato dalle costanti
vbYes o vbNo. In questo esempio, se l’utente clicca sul pulsante No, la procedura si
conclude.
Quando si esegue questa procedura, la funzione MsgBox mostra la stringa MMI. Excel
non ha una funzione per convertire un numero romano nel suo equivalente decimale.
È importante capire che non si possono usare le funzioni dei fogli di lavoro che
hanno una funzione equivalente in VBA. Per esempio, VBA non può accedere alla
funzione della pagina di lavoro di Excel SQRT, perché VBA ha una sua versione di
questa funzione; Sqr. Perciò, la seguente espressione genera un errore:
VBA offre due importanti costrutti che possono semplificare il lavoro con oggetti e
collezioni:
Sub ChangeFont1 ( )
Selection.Font.Name = “Time New Roman”
Selection.Font.FontStyle = “Bold Italic”
Selection.Font.Size = 12
Selection.Font.Underline = xlUnderlineStyleSingle
Selection.Font.ColorIndex = 5
End Sub
Sub ChangeFont2()
With Selection.Font
.Name = “Times New Roman”
.FontStyle = “Bold Italic”
.Size = 12
.Underline = xlUnderlineStyleSingle
.ColorIndex = 5
End With
End Sub
Qualora si registri una macro VBA, Excel usa le istruzioni With-End With
in ogni opportunità. Per vedere un buon esempio, provare a registrare
l’azione di modifica dell’impostazione di pagina, scegliendo i comandi
File/Impostazione pagina.
Istruzioni Each-Next
Si fa richiamo al precedente capitolo che una collection è un gruppo di oggetti
relazionati. Per esempio, la collezione Workbooks è una collezione di tutti gli oggetti
Workbook aperti. Ci sono molte altre collezioni con cui si può lavorare.
Supponiamo che si vogliano eseguire alcune azioni su tutti gli oggetti di una
collezione. O supponiamo che si voglia valutare tutti gli oggetti di una collezione ed
eseguire un’azione in certe condizioni. Queste sono occasioni perfette per l’uso delle
istruzioni For Each-Next.
La sintassi della costruzione For Each-Next è:
La procedura seguente usa la costruzione For Each-Next per riferirsi ad ognuno dei
singoli membri di un vettore di lunghezza fissa, uno alla volta:
Sub Macro1( )
Dim MyArray (5)
For i = 0 To 5
MyArray(i) = Rnd
Next i
For Each n In MyArray
Debug.Pring n
Next n
End Sub
Sub ContaFogli( )
Dim Item as WorkSheet
For Each Item In ActiveWorkbook.WorkSheets
MsgBox Item.Name
Next Item
End Sub
Il prossimo esempio usa For Each-Next per passare attraverso tutti gli oggetti nella
collezione di Windows:
Sub HiddenWindows()
Dim TuttiVisibili As Boolean
Dim Item As Window
AllVisible = True
For Each Item In Windows
If Item.Visible = False Then
TuttiVisibili = False
Exit For
End If
Next Item
MsgBox TuttiVisibili
End Sub
Sub CloseInActive( )
Dim Libro as Workbook
For Each Libro in Workbooks
If Libro.Name <> ActiveWorkbook.Name then Libro.Close
Next Libro
End Sub
L’esempio finale For Each-Next è designato per essere eseguito dopo che l’utente
ha selezionato un intervallo di celle. Qui l’oggetto Selection agisce come una
collezione costituita da oggetti Range perché ogni cella nella selezione è un oggetto
Range.
La procedura controlla ogni cella e usa la funzione UCase di VBA per convertire il suo
contenuto in caratteri maiuscoli (non riguarda valori numerici).
Sub MakeUpperCase()
Dim Cella As Range
For Each Cella In Selection
Cella.Value = UCase(Cella.Value)
Next Cella
End Sub
GoTo dichiarazioni
If-Then istruzioni
Select Case istruzioni
For-Next loop
Do While loop
Do Until loop
Dichiarazione GoTo
Il modo più semplice per modificare l’esecuzione del programma è quella di utilizzare
l’espressione GoTo. Questa dichiarazione trasferisce l’esecuzione di un programma
ad una nuova istruzione, la quale deve essere preceduta da una etichetta (una
stringa di testo seguita dai due punti, o un numero senza i due punti). La procedura
VBA può contenere un qualunque numero di etichette, e un’espressione GoTo non
può ramificarsi al di fuori della procedura.
La seguente procedura, usata dalla funzione VBA InputBox, prende il nome da chi la
usa. Se il nome non è Howard, la procedura si ramifica all’etichetta WrongName e
termina. Altrimenti la procedura esegue del codice addizionali. L’espressione Exit
Sub causa la chiusura del processo.
Sub GoToDemo()
UserName = InputBox("Digita il tuo nome:")
If UserName <> "Howard" Then GoTo WrongName
MsgBox ("Benvenuto Howard!")
' -[Più codice qui] -
Exit Sub
WrongName:
MsgBox "Mi dispiace. Solo Howard può eseguire questa procedura."
End Sub
Istruzioni If-Then
Forse il più comune gruppo di istruzioni utilizzato in VBA è If-Then.
Queste istruzioni dotano l’applicazione della capacità di prendere decisioni. Prendere
una buona decisione è la chiave per scrivere programmi di successo. Una
applicazione Excel di successo essenzialmente prende decisioni ed agisce su di
esse.
Sub GreetMe1( )
If Time < 0.5 Then MsgBox “Buon giorno”
End Sub
Sub GreetMe2( )
If Time < 0.5 Then MsgBox “Buon giorno”
If Time >= 0.5 Then MsgBox “Buon pomeriggio”
End Sub
Sub GreetMe3( )
If Time < 0.5 Then MsgBox “Buon giorno” Else _
MsgBox “Buon pomeriggio”
End Sub
Sub GreetMe4()
If Time < 0.5 Then MsgBox "Buon giorno"
If Time >= 0.5 And Time < 0.75 Then MsgBox "Buon pomeriggio"
If Time >= 0.75 Then MsgBox "Buona sera"
End Sub
Il valore 0.75 rappresenta le 6:00 p.m. – tre quarti di giorno passati e quindi è sera.
Nei precedenti esempi, ogni istruzione nella procedura viene eseguita anche al
mattino. Una procedura più efficiente includerebbe una struttura che termini la sua
esecuzione quando la condizione trovata è vera. Per esempio, può apparire il
messaggio Buon giorno al mattino per poi uscire senza calcolare le altre che sono
condizioni superflue. Con una piccola procedura come questa la differenza in
Uso avanzato di MS Excel 68
velocità è irrilevante. Ma per applicazioni più complesse, è opportuna un’altra
sintassi:
If condition Then
[true_instructions]
[Elself condition-n Then
[alternate_instructions]]
[Else
[default_instructions]]
End If
Sub GreetMe5()
If Time < 0.5 Then
MsgBox “Buon giorno”
ElseIf Time >= 0.5 And Time < 0.75 Then
Msg Box “Buon pomeriggip”
ElseIf Time >= 0.75 Then
MsgBox “Buona sera”
End If
End Sub
Con questa sintassi, quando una condizione è vera, le espressioni condizionali sono
eseguite e la costruzione If-Then termina. In altre parole, le condizione estranee non
sono valutate. Sebbene questa sintassi risulti enormemente efficiente, alcuni
possono trovare il codice più difficile da capire.
La seguente procedura mostra tuttavia un'altra modalità per codificare questo
esempio. Viene usata la costruzione nidificata If-Then-Else (senza l’uso di ElseIf).
Questa procedura è efficiente e di facile apprendimento. Notare che ciascuna
istruzione If ha una espressione corrispondente End If.
Sub Sconto1()
Quantità = InputBox("Digita una quantità: ")
If Quantità = "" Then Exit Sub
If Quantità >= 0 Then Sconto = 0.1
If Quantità >= 25 Then Sconto = 0.15
If Quantità >= 50 Then Sconto = 0.2
If Quantità >= 75 Then Sconto = 0.25
MsgBox "Sconto: " & Sconto
End Sub
Notare che ogni istruzione If-Then nella procedura è sempre eseguita e il valore per
Sconto può cambiare. Questo valore finale, comunque, è il valore desiderato.
La seguente procedura è sostitutiva della precedente (cambia la sintassi). In questo
caso, la procedura termina dopo l’esecuzione del blocco di istruzioni True.
Sub Sconto2()
Quantità = InputBox("Digita una quantità: ")
If Quantità = "" Then Exit Sub
If Quantità >= 0 And Quantità < 25 Then
Sconto = 0.1
ElseIf Quantità < 50 Then
Sconto = 0.15
ElseIf Sconto < 75 Then
Sconto = 0.2
ElseIf Quantità >= 75 Then
Sconto = 0.25
End If
MsgBox "Sconto: " & Sconto
End Sub
MsgBox IIf(n = 0, 0, 1 / n)
L’esempio che segue di una istruzione Select Case mostra un’altra modalità per
codificare l’esempio GreetMe presentato nella sezione precedente:
Sub GreetMe()
Select Case Time
Case Is < 0.5
Msg = "Buon giorno"
Case 0.5 To 0.75
Msg = "Buon pomeriggio"
Case Else
Msg = "Buona sera"
End Select
MsgBox Msg
End Sub
L’istruzione Case può anche usare l’operatore Or. Il seguente processo usa la
funzione di VBA WeekDay per determinare se il giorno corrente è un giorno di
weekend; poi mostra un messaggio appropriato. Notare l’uso dell’operatore Or, il
quale controlla per un sabato o una domenica:
Sub GreetUser()
Select Case WeekDay(Now)
Case 1 Or 7
MsgBox “Siamo nel weekend”
Case Else
MsgBox “Non siamo nel weekend”
End Select
End Sub
Sub GreetUser( )
Select Case Weekday(Now)
Case 2, 3, 4, 5, 6
MsgBox “Non siamo nel weekend”
Case Else
MsgBox “Siamo nel weekend”
End Select
End Sub
Qualunque numero di istruzioni può essere scritto sotto una istruzione Case, e tutte
sono eseguiti se la condizione è vera. Se si usa solo una istruzione per caso, come
nel precedente esempio, si può inserire l’istruzione nella stessa linea come la parola
chiave Case (senza dimenticare il carattere separatore della dichiarazione di VBA, i
due punti). Questa tecnica rende il codice più compatto. Per esempio:
Sub Sconto3( )
Quantità = InputBox(“Digita quantità: “)
Select Case Quantità
Case “”: Exit Sub
Case 0 To 24: Sconto = 0.1
Case 25 To 49: Sconto = 0.15
Case 50 To 74: Sconto = 0.20
Case Is >= 75: Sconto = 0.25
Sub AppWindow()
Select Case Application.WindowState
Case xlMaximized: MsgBox "Applicazione massimizzata"
Case xlMinimized: MsgBox "Applicazione minimizzata"
Case xlNormal: MsgBox "Applicazione normale"
Select Case ActiveWindow.WindowState
Case xlMaximized: MsgBox "Libro massimizzato"
Case xlMinimized: MsgBox "Libro minimizzato"
Case xlNormal: MsgBox "Libro normale"
End Select
End Select
End Sub
La procedura seguente dimostra l’importanza di usare il rientro nel codice per dare
chiarezza alla struttura. Per esempio, guardare l’identica procedura senza rientri:
Sub AppWindow()
Select Case Application.WindowState
Case xlMaximized: MsgBox “Applicazione massimizzata”
Case xlMinimized: MsgBox “Applicazione minimizzata”
Case xlNormal: MsgBox “Applicazione normale”
Select Case ActiveWindow.WindowState
Case xlMaximized: MsgBox “Libro massimized”
Case xlMinimized: MsgBox “Libro minimizzato”
Case xlNormal: MsgBox “Libro normale”
End Select
End Select
End Sub
Sub BadLoop()
StartVal = 1
NumToFill = 100
ActiveCell.Value = StartVal
Cnt = 1
DoAnother:
ActiveCell.Offset(Cnt, 0).Value = StartVal + Cnt
Cnt = Cnt + 1
If Cnt < NumToFill Then GoTo DoAnother Else Exit Sub
End Sub
Questa procedura lavora come inteso, però è un esempio di cattivo looping. Usare
GoTo per eseguire il loop è contrario al concetto di codice strutturato (vedere “Che
cosa è una Programmazione Strutturata?”). Infatti, la dichiarazione GoTo rende il
codice molto più difficile alla lettura, ed è quasi impossibile rappresentare un loop
usando linee rientranti. In più questo tipo di loop astrutturato rende la procedura più
suscettibile di errore. Inoltre usa molte etichette e il codice che appare ha una
minima o nessuna struttura.
Affinché VBA abbia parecchi comandi di looping strutturato, non avere mai (o quasi
mai) fiducia della dichiarazione GoTo per prendere decisioni.
Loops For-Next
Il più buon tipo di loop è For-Next, già usato in precedenti esempi. La sintassi è:
Così che cosa è una programmazione strutturata? E si può fare con VBA?
La premessa base è che una routine o segmento di codice può avere solo un punto
di entrata e solo un punto di uscita. In altre parole, il corpo del codice potrebbe
mantenersi unito da solo e il controllo del programma non potrebbe saltare in uscita
dal mezzo di questa unità. Come risultato, la programmazione strutturata domina la
dichiarazione GoTo. Quando si scrivi codice strutturato, il programma progredisce in
maniera ordinata ed è facile da seguire.
Sub SommaRadiciQuadrate()
Dim Somma As Double, Conta As Integer
Sum = 0
For Conta = 1 To 100
Somma = Somma + Sqr(Conta)
Next Conta
MsgBox Somma
End Sub
In questo esempio, Conta (lo sviluppo della variabile di conteggio) iniziata come 1 e
aumenta di uno alla volta la ripetizione del loop. La variabile Somma semplicemente
accumula le radici quadrate per ogni valore di Conta.
Si può anche usare il valore Step per saltare alcuni valori nel loop. Segue la stessa
procedura riscritta per sommare le radici quadrate dei numeri dispari tra 1 e 100.
Sub SommamDispariRadiciQuadrate()
Somma = 0
For Conta = 1 To 100 Step 2
Somma = Somma + Sqr(Conta)
Next Conta
MsgBox Somma
End Sub
Sub GoodLoop( )
StartVal = 1
NumToFill = 100
ActiveCell.Value = StartVal
For Cnt = 0 To NumToFill – 1
ActiveCell.Offset(Cnt, 0).Value = StartVal + Cnt
Next Cnt
End Sub
Sub ExitForDemo()
MaxVal = Application.WorksheetFunction.Max(Range("A:A"))
For Row = 1 To 65536
Set TheCell = Range("A1").Offset(Row - 1, 0)
If TheCell.Value = MaxVal Then
MsgBox "Max value is in Row " & Row
TheCell.Activate
Exit For
End If
Next Row
End Sub
Il massimo valore nella colonna è calcolato usando la funzione di Excel MAX. Questo
valore è poi assegnato alla variabile MaxVal. Il loop For-Next controlla ogni cella e
ogni colonna. Se la cella creata controllata è uguale a MaxVal, l’espressione Exit For
conclude la procedura. Prima del termine del loop, la procedura informa l’utente circa
l’ubicazione della cella.
La ExitForDemo viene presentata per dimostrare come si esce da un loop For-Next.
Comunque, non è la strada più efficiente per attivare il più ampio valore in un
intervallo. Infatti, una singola dichiarazione eseguirà:
Range(“A:A”).Find(Application.WorksheetFunction.Max _
(Range(“A:A”))).Activate
Sub NestedLoops( )
Dim MyArray(1 to 10, 1 to 10, 1 to 10)
Dim I As Integer, j As Integer, k As Integer
For I = 1 To 10
For j = 1 To 10
For k = 1 To 10
MyArray(I, j, k) = -1
Next k
Next j
Next i
End Sub
Loops Do While
Il loop Do While è un’altro tipo di looping strutturato disponibile in VBA. Diversamente
da For-Next, Do While esegue mentre si incontra una specifica condizione. I loop Do
While possono avere due sintassi:
oppure
Do [instructions]
[Exit Do]
[instructions]
Loop [While condition]
Come si può vedere VBA permette di mettere la condizione While all’inizio o alla fine
del loop. Le differenze tra le due sintassi indica il momento in cui la condizione è
controllata. Nella prima sintassi, i contenuti del loop non possono essere mai
eseguiti. Nella seconda sintassi, i contenuti del loop sono sempre eseguiti almeno
una volta.
Il seguente esempio usa Do While con la prima sintassi.
Sub DoWhileDemo()
Do While Not IsEmpty(ActiveCell)
ActiveCell.Value = 0
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Questa procedura usa la cella attiva come punto di inizio e prosegue verso il basso
nella colonna, inserendo uno 0 nella cella attiva. Ogni volta che il loop si ripete, la
cella successiva nella colonna diventa attiva. Il loop continua fino a quando la
funzione VBA IsEmpty rileva che la cella attiva non è vuota.
La seguente procedura usa la seconda sintassi di Do While. Il loop vuole sempre
essere eseguito almeno una volta, anche se la cella iniziale attiva è vuota.
Sub DoWhileDemo2()
Do
ActiveCell.Value = 0
ActiveCell.Offset(1, 0).Select
Loop While Not IsEmpty(ActiveCell)
End Sub
Sub DoWhileDemo1()
Open “c:\data\textfile.txt” For Input As #1
LineCt = 0
Do While Not EOF(1)
Line Input #1, LineOfText
Range(“A1”).Offset(LineCt, 0) = Ucase(LineOfText)
LineCt = LineCt + 1
Loop
Do While può anche contenere una o più espressioni Exit Do. Quando una
espressione Exit Do viene incontrata, il loop termina immediatamente.
Loops Do Until
La struttura del loop Do Until è molto simile alla struttura di Do While. La differenza è
evidente solo quando la condizione è testata. Nel loop Do While, il loop viene
eseguito mentre la condizione è vera. Nel loop Do Until, il loop viene eseguito finché
la condizione è vera.
Do Until ha due sintassi:
Do[Until condition]
[instructions]
[Exit Do]
[instructions]
Loop
oppure
Do
[instructions]
[Exit Do]
[instructions]
Loop [Until condition]
Sub DoUntilDemo1()
Open “c:\data\textfile.txt” For Input As #1
LineCt = 0
Do Until EOF(1)
Line Input #1, LineOfText
Range (“A1”).Offset(LineCt, 0) = Ucase(LineOfText)
LineCt = LineCt + 1
Loop
Close #1
End Sub
Adesso vogliamo vedere quali oggetti, e quindi quali metodi e quali proprietà, ci
mette a disposizione questa DLL. Sempre dall’ambiente VBA, con il tasto F2,
attiviamo l’object browser. Selezioniamo la libreria PAR_CSVB6, e questo ci fa
vedere le classi contenute nella libreria. Clicchiamo sulla classe CS_Met, e questo ci
mostrerà i membri della classe. Cerchiamo e selezioniamo il metodo ReadMetFile, e
possiamo vedere la sintassi del metodo in basso (Function ReadMetFile(….) as long)
Leggiamo che il metodo ReadMetFile serve per leggere i dati da un file meteo, e che,
a lettura avvenuta, i dati ed alcune elaborazioni sono rese disponibili attraverso le
proprietà della classe. Sempre nel file di help, leggeremo quale deve essere il
formato del file con i dati meteorologici (un file di esempio è fornito con
l’applicazione). Bene, non ci resta che scrivere poche linee di codice per utilizzare le
capacità della classe CS_Met.
With CommonDialog1
.Filter = "CS met files (*.dat, *.gen)|*.dat;*.gen"
.ShowOpen
fname= .Filename
End With
'write daily
With Foglio1 ‘scrive valori giornalieri su foglio1
For iIndx = 1 To 366
.Cells(iIndx + 5, 1).Value = iIndx
.Cells(iIndx + 5, 2).Value = dat.Rain(iIndx)
.Cells(iIndx + 5, 3).Value = dat.Tmax(iIndx)
.Cells(iIndx + 5, 4).Value = dat.Tmin(iIndx)
.Cells(iIndx + 5, 5).Value = dat.Rad(iIndx)
.Cells(iIndx + 5, 6).Value = dat.Hmax(iIndx)
.Cells(iIndx + 5, 7).Value = dat.Hmin(iIndx)
.Cells(iIndx + 5, 8).Value = dat.WSpeed(iIndx)
Next iIndx
End With
End Sub
With ActiveWorkbook.Worksheets(1)
If .Cells(2, 2).Value = "PENMAN_MONTEITH" Then
ET_input.ET_method = PENMAN_MONTEITH
Else
ET_input.ET_method = PRIESTLEY_TAYLOR
End If
ET_input.DOY = .Cells(3, 2).Value
Assumiamo che i valori che sono assegnati dalle celle siano corrispondenti ai valori
richiesti delle variabili, altrimenti (per esempio, una stringa al posto di una variabile
numerica) avremo un errore durante l’esecuzione.
Sempre nel visualizzatore di oggetti nella finestra VBA della nostra cartella, adesso
clicchiamo sulla classe ETCS_dll, e poi sul metodo start_PET:
Notate che l’input previsto per start_PET è ET_CSinputs. Quindi, quando faremo una
chiamata al metodo start_PET, passeremo un tipo ET_CSinputs che avremo prima
Dim ob As ETCS_dll
Dim FReturnLong As Long
Dim ET_input As ET_CSinputs
With ActiveWorkbook.Worksheets(1)
If .Cells(2, 2).Value = "PENMAN_MONTEITH" Then
ET_input.ET_method = PENMAN_MONTEITH
Else
ET_input.ET_method = PRIESTLEY_TAYLOR
End If
ET_input.DOY = .Cells(3, 2).Value
ET_input.Tmax = .Cells(4, 2).Value
ET_input.Tmin = .Cells(5, 2).Value
ET_input.Tdew = .Cells(18, 2).Value
ET_input.RAD = .Cells(6, 2).Value
ET_input.WSpeed = .Cells(7, 2).Value
ET_input.Hmax = .Cells(8, 2).Value
ET_input.Hmin = .Cells(9, 2).Value
ET_input.WMeasHeight = .Cells(10, 2).Value
ET_input.LAI = .Cells(11, 2).Value
ET_input.kc = .Cells(12, 2).Value
ET_input.k = .Cells(13, 2).Value
ET_input.PTconstant = .Cells(14, 2).Value
ET_input.aridity_factor = .Cells(15, 2).Value
ET_input.latitude = .Cells(16, 2).Value
ET_input.Elevation = .Cells(17, 2).Value
End With
FReturn = ob.start_PET(ET_input)
With ActiveWorkbook.Worksheets(1)
.Cells(2, 7).Value = Format(ob.get_refPET, "#0.00")
.Cells(3, 7).Value = Format(ob.get_cropPET, "#0.00")
.Cells(4, 7).Value = Format(ob.get_PTR, "#0.00")
.Cells(5, 7).Value = Format(ob.get_PEV, "#0.00")
.Cells(6, 7).Value = Format(ob.get_Aereoynamic_Resistance, "#0.00")
.Cells(7, 7).Value = Format(ob.get_Isothermal_LWNR, "#0.00")
.Cells(8, 7).Value = Format(ob.get_Latent_Heat_Vapour, "#0.00")
.Cells(9, 7).Value = Format(ob.get_LightInterception, "#0.00")
.Cells(10, 7).Value = Format(ob.get_NetRadiation, "#0.00")
.Cells(11, 7).Value = Format(ob.get_PotRad, "#0.00")
.Cells(12, 7).Value = Format(ob.get_DayLenght, "#0.00")
.Cells(13, 7).Value = Format(ob.get_SVP, "#0.00")
.Cells(14, 7).Value = Format(ob.get_slopeSVP, "#0.00")
.Cells(15, 7).Value = Format(ob.get_Vol_Heat_Capacity, "0.00000")
.Cells(16, 7).Value = Format(ob.get_VPD, "#0.00")
.Cells(17, 7).Value = Format(ob.get_VPDmax, "#0.00")
.Cells(18, 7).Value = Format(ob.get_AirHumidityCorrFact, "#0.00")
.Cells(19, 7).Value = Format(ob.get_ActualVapourPressure, "#0.00")
End With
Set ob = Nothing
End Sub
With ActiveWorkbook.Worksheets(1)
For i = 1 To 365
Dati.Estimated(i, 1) = .Cells(i, 1)
Dati.Measured(i, 1) = .Cells(i, 2)
Next i
End With
Nel presente esempio, si assume di aver già pronto l’oggetto “Dati” creato
nell’esempio precedente, contenente una serie di stimati e misurati.
With ActiveWorkbook.Worksheets(1)
.Cells(1, 4).Value = Risultati.Intercept(1)
.Cells(2, 4).Value = Risultati.Intercept_StandError(1)
.Cells(3, 4).Value = Risultati.Intercept_Prob_Tvs0(1)
.Cells(4, 4).Value = Risultati.Intercept_Tvs0(1)
.Cells(5, 4).Value = Risultati.Slope(1)
.Cells(6, 4).Value = Risultati.Slope_Tvs0(1)
.Cells(7, 4).Value = Risultati.Slope_Tvs1(1)
.Cells(8, 4).Value = Risultati.Slope_Prob_Tvs0(1)
.Cells(9, 4).Value = Risultati.Slope_Prob_Tvs1(1)
.Cells(10, 4).Value = Risultati.F(1)
.Cells(11, 4).Value = Risultati.Prob_F(1)
End With
With ActiveWorkbook.Worksheets(1)
For i = 1 To 15
Dati.Estimated(i, 1) = .Cells(i + 1, 1)
Dati.Measured(i, 1) = .Cells(i + 1, 2)
Next i
End With
La nostra procedura è finalmente pronta. Uscire dal VBA editor, uscire dalla modalità
progettazione, e cliccare sul pulsante “Calcola”. Il risultato dovrebbe apparire
nell’apposita casella.