SlideShare a Scribd company logo
Management Analytics
VBA per Excel
Giovanni Della Lunga
Agenda
» Excel come Piattaforma di Sviluppo
Excel può essere molto più di un semplice foglio di calcolo
» Le Macro di Excel
Come utilizzare il registratore di Macro per imparare il VBA
» La Sintassi del Visual Basic
Gli elementi base del linguaggio di programmazione
» Gestire l’interazione con Excel
Il modello ad oggetti di Excel ed il suo utilizzo con VBA
Excel come Piattaforma di Sviluppo
Excel può essere molto più di un semplice foglio di calcolo
Excel come piattaforma di sviluppo
» Microsoft Excel è molto più di un semplice
spreadsheet.
» A partire dall’introduzione dell’editor VBA
con Excel 2007 fino ai recenti miglioramenti
di stabilità e performance di Excel 2016,
possiamo dire che tale applicativo è
diventato un’interessante piattaforma di
sviluppo per reporting e presentation oltre
che per analisi preliminari di dati e test di
procedure di calcolo.
Excel come piattaforma di sviluppo
» Se pensiamo ad Excel non come ad
un semplice spreadsheet ma come
una piattaforma di sviluppo,
possiamo individuare almeno 4 idee
fondamentali che possiamo
utilizzare con successo nelle nostre
applicazioni.
Cartelle di lavoro come interfacce utente
e presentation layer per data entry e
reporting
Cartelle di lavoro viste come linguaggio
di programmazione «dichiarativo»
Modello ad oggetti di Excel
Ambiente di Sviluppo VBA
Excel come piattaforma di sviluppo
• Possiamo pensare i fogli di Excel
come un sistema efficiente di
interfaccia utente per data entry;
• L’utilizzo delle proprietà di
formattazione e validazione dei dati,
tipici delle celle Excel, permette la
realizzazione di interfacce di livello
professionale con pochissimo sforzo;
• Gli elementi grafici di Excel
permettono altresì la realizzazione di
eccellenti output per qualunque tipo
di reporting;
Cartelle di lavoro come interfacce
utente e presentation layer per
data entry e reporting
Excel come piattaforma di sviluppo
» Venduti = 1000
» Prezzo = 10.99
» Ricavato = Venduti * Prezzo
» D1 = 1000
» D2 = 10.99
» D3 = D1 * D2
• Un foglio Excel è di fatto un
linguaggio di programmazione di
per se;
• Invece di definire un insieme di
operazioni che vengono eseguite
linea per linea, noi
«programmiamo» in questo
linguaggio definendo una serie di
dichiarazioni (scrivendo formule e
inserendo valori nelle celle); D1 ha il valore 1000
D2 ha il valore 10.99
D3 è il prodotto di D1 per D2
Cartelle di lavoro viste come
linguaggio di programmazione
«dichiarativo»
Excel come piattaforma di sviluppo
• Quasi tutto quello che può
essere fatto direttamente sui
fogli Excel può essere riprodotto
in VBA attraverso il ricco
modello ad oggetti messo a
disposizione dall’ambiente di
programmazione
Modello ad oggetti di Excel
Excel come piattaforma di sviluppo
• Il linguaggio di
programmazione di Excel:
VBA (Visual Basic for
Application);
• Condiviso da tutta la
piattaforma MS Office;
Le Macro di Excel
L’Ambiente di Sviluppo
La Sintassi del VBA
Interagire con Excel
Le Macro di Excel
Come utilizzare il registratore di Macro per imparare il VBA
Le prime due regole della programmazione
»Prima regola della
programmazione
▪ Scrivere meno codice possibile
Le prime due regole della programmazione
»Prima regola della
programmazione
▪ Scrivere meno codice possibile
»Seconda regola della
programmazione
▪ Scrivere meno codice possibile
Le Macro di Excel
• La costruzione e l'organizzazione di strutture dati non banali tramite Excel può
comportare l'esecuzione da parte dell'utente di una discreta mole di operazioni,
spesso ripetitive.
• In questi casi può essere estremamente utile ricorrere al registratore di macro
che permette di memorizzare una sequenza di operazioni al fine di poterle
successivamente ripetere a richiesta.
• Il registratore macro di Excel memorizza le operazioni eseguite dall’utente
registrando gli equivalenti comandi sotto forma di istruzioni in linguaggio Visual
Basic.
• per questo motivo il registratore di macro oltre ad essere un utilissimo aiuto
nella normale operatività con Excel costituisce anche un formidabile strumento
didattico per cominciare a muoversi con la sintassi VBA.
13
Gestire i file che contengono codice VBA
» Office 2013 (come già Office 2010 e 2007),
dunque anche Excel 2013, distingue i file che
contengono codice VBA dagli altri file con
un’estensione e un’icona diverse;
» I normali file di Excel hanno estensione .xlsx,
mentre quelli che contengono codice VBA
hanno estensione .xlsm.
» Anche il formato di salvataggio è diverso.
Quando salvate un file che contiene codice VBA
(le porzioni di codice vengono definite Macro)
occorre indicare a Excel che deve salvarlo
usando il formato Cartella di lavoro con
attivazione di macro di Excel;
Le Macro di Excel
15
Le Macro di Excel
16
Le Macro di Excel
• Oltre a vedere la macro in
esecuzione è possibile
esaminare il codice prodotto e
farlo girare istruzione per
istruzione.
• Quest’attività oltre al chiaro
valore didattico ha un enorme
utilità ai fini del test dei
programmi prodotti (debug).
17
L’Ambiente di Sviluppo del VBA
• Il Visual Basic dispone di
un ambiente di sviluppo
integrato (IDE) attraverso
il quale è possibile non
solo modificare le macro
ma scrivere interi
programmi;
• L’editor è composto da
una serie di finestre
tramite le quali
controllare le varie fasi di
sviluppo e test
dell’applicazione;
18
⚫ Da Excel l’editor VBA può essere
richiamato utilizzando la finestra
VBA o premendo F11.
Università dell'Insubria - C.d.L. in Banca & Finanza - A.A. 2004-
2005
19
GESTIONE PROGETTI. Questa sottofinestra contiene un
diagramma ad albero delle cartelle di lavoro aperte e degli
oggetti Excel in esse contenuti (oggetti, moduli, riferimenti,
form e così via). Si userà la finestra gestione progetti per
navigare fra i vari moduli ed altri oggetti di un progetto VBA
FINESTRA PROPRIETA’. In questa finestra compare un elenco
di tutte le proprietà dell’oggetto attualmente selezionato.
FINESTRA DEL CODICE. La finestra del codice è quella in cui si
può esaminare, modificare o creare ex-novo il codice sorgente
VBA. Questa finestra viene usata per scrivere nuove macro o
per editare macro esistenti.
FINESTRA IMMEDIATA. In questa finestra è possibile inserire
comandi diretti per la visualizzazione del valore assunto dalle
variabili (usata in fase di debug)
FINESTRA CONTROLLO. Consente il monitoraggio del contenuto
di una variabile o dei valori generati da un’espressione (usata in
fase di debug).
Identifica un progetto VBA ovvero un insieme di oggetti e il
nome fra parentesi è il nome della cartella in cui esso è
memorizzato (in questo caso Cartel1);
Identifica un oggetto di tipo foglio di lavoro contenuto nella
cartella il cui nome appare fra parentesi; tutti i fogli di lavoro
appaiono identificati dalla parola Foglio seguita da un numero,
ma è importante non confonderlo con il nome che appare sul
cavalierino nella finestra di Excel e che nella finestra Progetto
appare fra parentesi; per ogni foglio di lavoro presente nella
cartella sono presenti altrettante voci.
Indica la cartella
Università dell'Insubria - C.d.L. in Banca & Finanza - A.A. 2004-
2005
20
Università dell'Insubria - C.d.L. in Banca & Finanza - A.A. 2004-
2005
21
Università dell'Insubria - C.d.L. in Banca & Finanza - A.A. 2004-
2005
22
⚫ Un modulo è concettualmente simile ad un documento al cui interno si inseriscono i
programmi o una loro parte.
⚫ La suddivisione di un programma su più moduli spesso è dovuta alla volontà del
programmatore di suddividere su più parti il programma dividendolo con concetti di
omogeneità;
⚫ per esempio si può avere un modulo con tutte le funzioni create che eseguono i calcoli finanziari…
⚫ …un altro con le routine che gestiscono l’accesso al database…
⚫ …un altro con le funzioni create ad uso generale come quelle che eseguono particolari elaborazioni
sul testo mentre…
⚫ …un altro modulo contiene le routine principali del programma che richiamano quelle contenute negli
altri moduli.
La Sintassi del Visual Basic
Gli elementi base del linguaggio di programmazione
La Sintassi del VBA
• Il Visual Basic deriva la sua sintassi dal vecchio linguaggio basic;
• Nel corso del tempo molte nuove strutture sintattiche sono state aggiunte
al linguaggio trasformandolo in qualcosa di molto diverso rispetto
all’originale;
• In questa parte vedremo la componente convenzionale del linguaggio cioè
le istruzioni base per la gestione del flusso del programma, i principali tipi
di dato gestiti e la costruzione di procedure;
• Nella prossima sezione vedremo la parte più innovativa di questo
linguaggio e cioè la componente di interazione con Excel realizzata tramite
componenti di programmazione orientata agli oggetti.
24
Variabili eTipi
di Dato
Operatori Istruzioni di
Controllo
StruttureDati Procedure:
Funzionie
Subroutine
La Sintassi del VBA
La Sintassi del VBA: Tipi di Dato e Operatori
• Anche Visual Basic, come tutti i linguaggi di
programmazione, prevede l'uso delle variabili,
mediante le quali è possibile memorizzare dei
valori testuali o numerici in strutture a cui il
programma può accedere grazie a un nome
assegnato loro in fase di creazione.
• Visibilità. Una variabile è detta locale quando è
definita all'interno di una procedura;
• Tipo. La sua creazione avviene quando si fa
riferimento ad essa per la prima volta, oppure
quando è eseguita l'istruzione Dim, che presenta
la seguente sintassi:
• Dim <nome> [As <tipo>]
26
La Sintassi del VBA:
Tipi di Dato e Operatori
• Naming Convention
• Una buona convenzione nella
definizione del nome delle variabili
dovrebbe permettere di dedurre dal
nome della variabile:
• Il livello di visibilita
• Il tipo del dato
• Se si tratta di un vettore o di uno
scalare
• Es. Scope Specifier
▪ g – Public
▪ m – Module Level
27
La Sintassi del VBA:
Tipi di Dato e Operatori
• Tipi Numerici
▪ Il Visual Basic fornisce per la gestione
dei valori numerici varie possibilità che
vanno di volta in volta scelte in accordo
con il genere di informazione che deve
essere memorizzata.
▪ A prima vista potrebbe apparire più
comodo impiegare tipi generici che
vadano bene per qualunque occasione
come il Double ma in realtà è
sconsigliabile per vari motivi,
soprattutto perché i tipi che
supportano la parte decimale vengono
elaborati ad una velocità inferiore a
quella dei tipi che non la gestiscono
quali i tipi Integer o Long.
28
Dim liThisNumber as Integer
Dim lsngThisNumber as Single
liThisNumber = 5
lsngThisNumber = 4.5
La Sintassi del VBA:
Tipi di Dato e Operatori
» Operatori Matematici
» Gli operatori matematici sono quelli che indicano le
principali operazioni matematiche e sono:
▪ + : addizione
▪ - : sottrazione
▪ * : moltiplicazione
▪ / : divisione
▪  : divisione con restituzione della sola parte intera
▪ ^ : elevazione a potenza
▪ Sqr : radice quadrata
▪ mod : resto di una divisione
29
La Sintassi del VBA:
Tipi di Dato e Operatori
• Tipo di dati in Excel:
▪ Dati Numerici
▪ Dalle Impostazioni
internazionali nel pannello
di controllo modificare
▪ Per visualizzare i numeri in
notazione scientifica ovvero
2.3 e non 2,3
▪ Inoltre direttamente in excel
(menu Formato, Celle) è
possibile scegliere il tipo di
notazione numerica.
30
La Sintassi del VBA:
Tipi di Dato e Operatori
• Stringhe
▪ Per memorizzare dati testuali quali nomi,
indirizzi, annotazioni o altro si ricorre al
tipo String.
▪ Facendo seguire la parola chiave String da
un asterisco e un numero è possibile
predeterminare una lunghezza per le
stringhe in modo che il valore in esse
inserito
▪ se eccede la dimensione prevista venga
troncato
▪ se è inferiore vengano automaticamente
inseriti degli spazi fino a raggiungere la
lunghezza definita.
31
• Dim lsMyName as String
• lsMyName = “Giovanni”
Esercitazione
• Esempi di elaborazione di stringhe
▪ Elementi noti :
▪ dichiarazione variabili
▪ Apprendimento:
▪ Funzioni elaborazione stringhe
▪ Anticipazione:
▪ Interazione con oggetti di Excel
▪ Procedure in vba
▪ Array dinamici in VBA e funzioni connesse
▪ Cicli For
32
Clicca qui per aprire il file di esercitazione
ESEMPIO_1_1.XLSM
Esercitazione
33
Public Sub esempio_1_stringhe()
' dichiarazione variabili
Dim lsNomeFileCompleto As String
Dim lsNomeFileSenzaExt As String
Dim lsEstensioneFile As String
Dim n As Integer
' recuperiamo il nome file completo utilizzando
' l'oggetto Workbook di Excel
lsNomeFileCompleto = ActiveWorkbook.Name
Debug.Print lsNomeFileCompleto
' ricerchiamo la posizione del punto nel nome completo
' utilizzando la funzione InStr(). Si noti che il carattere
' . (punto) deve essere compreso fra doppi apici...
n = InStr(lsNomeFileCompleto, ".")
Debug.Print n
(continua)
Si noti l’intestazione della procedura
Sezione dichiarativa
NomeOggetto.Proprietà
Funzione InStr()
Esercitazione
34
' recuperiamo il nome del file privo di estensione cercando
' la sub-stringa composta da n - 1 caratteri che si trova
' a sinistra del punto. Notare che per evitare di prendere
' anche il punto di separazione, dobbiamo
' indicare alla funzione Left() di prendere soltanto n - 1 caratteri
' a sinistra del nome completo del file...
lsNomeFileSenzaExt = Left(lsNomeFileCompleto, n - 1)
Debug.Print lsNomeFileSenzaExt
' possiamo anche ricavare l'estensione del file utilizzando la
' funzione Right() che restituisce un numero specifico di
' caratteri di una stringa partendo da destra (ovvero dalla fine
' della string). In questo caso utilizzeremo anche la funzione
' Len() che restituisce il numero complessivo di caratteri di una
' stringa, infatti il numero di caratteri che compongono
‘ l'estensione sono gli ultimi Len() - n caratteri...
lsEstensioneFile = Right(lsNomeFileCompleto, Len(lsNomeFileCompleto) - n)
Debug.Print lsEstensioneFile
' ricombiniamo insieme le due informazioni con l'operatore di concatenazione
' di stringhe "&"
Debug.Print lsNomeFileSenzaExt & "." & lsEstensioneFile
End Sub
Funzione Left()
Funzione Right()
Funzione Len()
Op. Concatenazione : &
La Sintassi del VBA:
Tipi di Dato e Operatori
• Date
▪ Il VBA usa il tipo dati Date per
memorizzare data e ora. Il tipo Date
utilizza 8 byte di memoria per ogni
combinazione di data/ora.
▪ Per assegnare un valore ad una
variabile di tipo Date mediante
un’istruzione, si deve ricorrere ad
una sintassi particolare che prevede
il racchiudere la data tra una coppia
di caratteri #.
35
Per esempio il 31 dicembre 2016 può
essere rappresentato come illustrato
Dim gdteSanSilvestro as Date
gdteSanSilvestro = #31/12/2016#
Function IsBisestile(Data As Date) As Boolean
If (Year(Date) Mod 100 <> 0 And Year(Date) Mod 4 = 0) Or _
(Year(Date) Mod 100 = 0 And Year(Date) Mod 400 = 0) Then
IsBisestile = True
Else
IsBisestile = False
End If
End Function
Funzioni Speciali
Gestione delle Date
Year().
▪ Questa funzione restituisce in output un numero intero (di tipo Integer) che contiene l’anno
estratto da una data che riceve come parametro di input.
▪ Nel riquadro seguente vediamo un esempio di impiego della funzione Year. Supponiamo di voler
costruire una funzione che prenda come parametro di input una data e che restituisca un valore
logico vero o falso a seconda che l’anno della data sia o meno bisestile.
36
Function GiorniMese(Data As Date) As Integer
Select Case Month(Data)
Case 1, 3, 5, 7, 8, 10, 12
GiorniMese = 31
Case 4, 6, 9, 11
GiorniMese = 30
Case 2
If IsBisestile(Data) Then
GiorniMese = 29
Else
GiorniMese = 28
End If
End Select
End Function
Funzioni Speciali
Gestione delle Date
» Month().
▪ Questa funzione permette di estrarre il numero del mese da una data che riceve come
parametro di input e restituisce tale valore in formato Integer.
▪ Nel seguente esempio di codice abbiamo scritto una semplice funzione che restituisce il
numero di giorni del mese a cui appartiene la data passata come parametro alla funzione
stessa.
37
Funzioni Speciali
Gestione delle Date
» Day()
▪ La funzione Day() permette di estrarre il numero del giorno da una data che riceve come parametro. Tale valore
viene restituito come al solito in formato Integer.
» Weekday()
▪ Questa funzione permette di ottenere un numero di tipo Integer che indica il giorno della settimana
relativo alla data ricevuta in input. I giorni vengono rappresentati secondo il valore della tabella
sottostante dove sono indicate le relative costanti
38
Giorno Costante VBA
Domenica vbSunday
Lunedì vbMonday
Martedì vbTuesday
Mercoledì vbWednesday
Giovedì vbThursday
Venerdì vbFriday
Sabato vbSaturday
Funzioni Speciali
Gestione delle Date
» DateAdd().
▪ Restituisce un valore Variant (Date) contenente una data alla quale è stato aggiunto un intervallo
di tempo specificato. La sintassi di questa funzione è la seguente
DateAdd(intervallo, numero, data)
▪ dove
▪ intervallo è un’espressione di tipo stringa corrispondente all'intervallo di tempo che si desidera
aggiungere,
▪ numero è un’ espressione numerica corrispondente al numero di intervalli da aggiungere (può essere
positiva, per ottenere date future, oppure negativa, per ottenere date passate),
▪ data, infine, rappresenta un valore di tipo data o di tipo stringa che rappresenta una data a cui viene
aggiunto l'intervallo.
39
Funzioni Speciali
Gestione delle Date
» DateDiff().
▪ Restituisce un valore Variant(Long) corrispondente al numero di intervalli di tempo tra due date specificate. La
sintassi della funzione DateDiff è la seguente
DateDiff(intervallo, data1, data2)
dove
▪ intervallo è un’espressione di tipo stringa corrispondente all'intervallo di tempo utilizzato per calcolare la
differenza tra data1 e data2.
▪ È possibile utilizzare la funzione DateDiff per determinare quanti intervalli di tempo specificati esistono tra due
date.
▪ Ad esempio possiamo utilizzare DateDiff per calcolare il numero di giorni che intercorrono tra due date oppure
il numero di settimane tra la data odierna e la fine dell'anno.
40
Esercitazione
»Esempi di elaborazione di date
▪ Elementi noti :
▪ dichiarazione variabili
▪ Apprendimento:
▪ Funzioni Analisi Date
▪ Anticipazione:
▪ Istruzioni Condizionali
▪ Ciclo For
▪ Funzioni in VBA
▪ Interazione con Foglio Excel
41
Clicca qui per aprire il file di esercitazione
ESEMPIO_1_2.XLSM
La Sintassi del VBA:
Tipi di Dato e Operatori
» Operatore di Assegnazione
▪ L’operatore di assegnazione coincide graficamente con l’operatore di
confronto di uguaglianza. Ciò non causa generalmente nessuna
confusione nel programmatore che si abitua con una certa rapidità a
riconoscerli e distinguerli nel loro significato.
▪ L’unico aspetto che lascia momentaneamente confusi chi non ha mai
avuto esperienze di sviluppo software è proprio il carattere uguale
come operatore di assegnazione in quanto si tende a considerare
l’uguale un’asserzione di uguaglianza fra il valore posto alla sua destra
e quello posto alla sua sinistra
▪ INCREMENTO DI UNA VARIABILE : a = a + 1
42
La Sintassi del VBA:
Tipi di Dato e Operatori
Operatori di Confronto
43
Operatore Simbolo Esempio Applicabile a
Minore < A < B qualunque
Minore o uguale <= A <= B qualunque
Uguale = A = B qualunque
Diverso <> A <> B qualunque
Maggiore > A > B qualunque
Maggiore o uguale >= A >= B qualunque
Identico tipo Is A Is B Object
Analisi per criteri Like A Like B String
La Sintassi del VBA:
Istruzioni di Controllo
» Il flusso di Controllo
▪ Sequenziale
▪ Condizionale
▪ Iterativo
▪ Determinato
▪ Condizionalo
44
La Sintassi del VBA:
Istruzioni di Controllo Condizionale
» La condizione IF
▪ Il flusso delle istruzioni all'interno della procedura non è
necessariamente rigidamente definito, ma può variare in base al
verificarsi di alcune condizioni.
▪ Il programma deve pertanto essere in grado di prendere delle
decisioni.
▪ Come la quasi totalità dei linguaggi di programmazione, Visual Basic
prevede a tal fine la struttura If, caratterizzata dalla seguente
sintassi:
If <condizione> Then
<istruzioni da eseguire se la condizione è
vera>
[Else
<istruzioni da eseguire se la condizione è
falsa>]
End If
45
La Sintassi del VBA:
Istruzioni di Controllo Condizionale
» La condizione può essere rappresentata da pressoché
qualsiasi espressione booleana.
▪ Si ricorda che un'espressione è così detta se può assumere solo
due valori distinti, cioè vero o falso.
» Se essa è verificata, l'interprete esegue il blocco di istruzioni
indicato fra le parole chiave Then e Else. In caso contrario,
è eseguito il secondo gruppo di comandi. Si noti che
quest'ultimo può anche essere assente. In tal caso, la parola
chiave Else non va utilizzata e non è eseguito alcun codice
in caso di mancata verifica della condizione.
» La frase End If delimita la struttura. Tutte le istruzioni che la
seguono sono eseguite in modo indipendente dal valore
dell'espressione booleana.
46
La Sintassi del VBA:
Istruzioni di Controllo Condizionale
» La struttura Select Case
▪ E’ possibile ricorrere ad una diversa struttura di controllo
denominata Select Case, la cui sintassi è la seguente:
Select Case <variabile>
Case <valore 1>:
<blocco istruzioni 1>
[Case <valore 2>:
<blocco istruzioni 2>]
..
[Case <valore n>:
<blocco istruzioni n>]
[Case Else:
<istruzioni da eseguire se tutti i confronti
falliscono>]
End Select
47
La Sintassi del VBA:
Istruzioni di Controllo Condizionale
» Gli operatori logici elementari
» Si ipotizzi di voler scrivere una struttura If per
verificare se il valore di una variabile numerica intera,
denominata n, appartiene all'intervallo compreso fra 10
e 100. È necessario valutare contemporaneamente due
condizioni:
n deve essere maggiore di 10 E minore di 100
» Per far sì che sia prodotta una stringa indicante l'esito
del confronto, occorre digitare il seguente codice:
If Numero > 10 then
If Numero < 100 then
Testo = "Il numero è compreso fra
10 e 100"
Else
Testo = "Il numero non appartiene
all'intervallo"
End if
End if
48
La Sintassi del VBA:
Istruzioni di Controllo Condizionale
» L'operatore And
» Spesso si rivela necessario valutare la contemporanea
validità di due o più condizioni.
» È il caso dell'esempio precedente, in cui si desidera
verificare se la variabile Numero contiene un valore
maggiore di 10 e nel contempo minore di 100.
» L'operatore And assolve questo compito, restituendo il
valore logico True solo se le condizioni a cui è applicato
sono contemporaneamente verificate. Il codice può
pertanto essere riscritto come segue:
If (Numero > 10) AND (Numero < 100) Then
Testo = "Il numero è compreso fra 10 e
100"
Else
Testo = "Il numero non appartiene
all'intervallo"
End if
» Come è possibile notare, la struttura risulta più semplice,
in quanto composta da un solo livello.
49
La Sintassi del VBA:
Istruzioni di Controllo Condizionale
» L'operatore Or
» A differenza del precedente, l'operatore Or
restituisce il valore logico True se almeno una
delle condizioni specificate è vera. Ad esempio,
la condizione
▪ (Numero = 5) OR
(Numero > 11)
è verificata quando la variabile Numero
assume un valore maggiore di 11 o uguale a 5.
50
La Sintassi del VBA:
Istruzioni di Controllo Condizionale
» L'operatore Not
» Un altro utile operatore logico è quello di negazione (Not).
» Come è facile dedurre, esso restituisce il valore True se la
condizione a cui è applicato non è verificata, mentre
restituisce False in caso contrario.
» A titolo di esempio, si supponga di voler realizzare una
struttura If in grado di generare una stringa indicante se il
valore della variabile Numero risulta contemporaneamente
diverso da 5 e da 10. Il codice da digitare è il seguente:
If NOT ((Numero = 5) Or (Numero = 10))
Then
Testo = "Il numero è diverso da 5 e
da 10"
End if
» Si noti la connessione con l’operatore And
If Numero <> 5 And Numero <> 10 Then
Testo = "Il numero è diverso da 5 e
da 10"
End if
51
La Sintassi del VBA:
Istruzioni di Controllo Iterativo
Il ciclo For
» Si supponga di voler realizzare un programma in grado di
calcolare il fattoriale di un numero, ovvero il prodotto di tutti i
valori interi positivi minori o uguali ad esso.
» Gli strumenti illustrati fino a questo punto non si rivelano
sufficienti a tal fine, in quanto è necessaria la capacità di
ripetere per un numero variabile di volte l'operazione di
moltiplicazione.
» Si impone pertanto il ricorso alle strutture di iterazione.
» Nel caso dell'esempio, occorre applicare la moltiplicazione a
tutti i numeri naturali minori o uguali a quello di cui si desidera
calcolare il fattoriale.
» Appare così evidente la necessità di disporre di una struttura in
grado di permettere la ripetizione di una porzione di codice per
un numero finito di volte.
52
La Sintassi del VBA:
Istruzioni di Controllo Iterativo
» Si tratta della classica struttura For, che nel caso di Visual Basic
è caratterizzata dalla seguente sintassi:
For <contatore> = <inizio> To <fine> [Step <passo>]
<istruzione 1>
...
<istruzione n>
Next [<contatore>]
» Dopo la parola chiave For è necessario far seguire una variabile
intera, che funge da contatore.
» Il suo valore è incrementato ad ogni ripetizione di un numero di
unità pari a quello specificato dopo la parola chiave Step, fino
al raggiungimento del valore finale;
» questa condizione determina la fine delle iterazioni e il
passaggio all'istruzione seguente la parola riservata Next.
53
La Sintassi del VBA:
Istruzioni di Controllo Iterativo
Il ciclo While
» Una diversa esigenza è quella soddisfatta dall'uso del ciclo While, che
permette la ripetizione di un segmento di codice per tutto il tempo in cui
una condizione risulta vera. La sua sintassi è la seguente:
While <condizione>
<istruzione 1>
<istruzione 2>
...
<istruzione n>
Wend
» Le istruzioni comprese fra le parole chiave While e Wend sono ripetute
per un numero di volte non stabilito rigidamente a priori, bensì
dipendente dalle stesse istruzioni, che devono essere in grado di fare in
modo che la condizione ad un certo punto smetta di verificarsi. In caso
contrario, si incappa in un errore molto diffuso fra i programmatori alle
prime armi, ovvero si crea ciò che è usualmente detto ciclo infinito.
54
La Sintassi del VBA:
Istruzioni di Controllo Iterativo
Le parole chiave Do e Loop
» Il ciclo While può anche essere descritto in modo più
elegante per mezzo delle parole chiave Do e Loop. In
questo caso la sintassi diventa:
Do While <condizione>
<istruzione 1>
<istruzione 2>
...
<istruzione n>
Loop
» Il comportamento è analogo a quello visto in precedenza: le
istruzioni contenute all'interno della struttura sono ripetute
fintanto che la condizione indicata accanto alla parola
While si verifica.
55
La Sintassi del VBA:
Istruzioni di Controllo Iterativo
Il ciclo Do Until
» Pressoché analogo è il ciclo Do Until, caratterizzato dalla
seguente sintassi:
Do Until <condizione>
<istruzione 1>
<istruzione 2>
...
<istruzione n>
Loop
» In questo caso, le iterazioni avvengono quando la condizione
è falsa e terminano quando essa si avvera.
56
Esercitazione
»Esempi di Cicli Condizionali e Non
▪ Elementi noti :
▪ Istruzioni Condizionali
▪ Cicli condizionali
▪ Cicli determinati
▪ Apprendimento:
▪ Funzioni per analisi di alberi di cartelle e files
▪ Anticipazione:
▪ interazione con oggetti di Excel
▪ Procedure in vba
57
Clicca qui per aprire il file di esercitazione
ESEMPIO_1_3.XLSM
La Sintassi del VBA:
Vettori e Matrici
» Gli array contengono dati omogenei, tipicamente si considerano
array a una e due dimensioni ai quali ci riferiremo come di
comune coi termini “vettore” e “matrice”. La dichiarazione di un
vettore o di una matrice deve essere accompagnata dal numero di
elementi.
» Esempio:
▪ Dim myVector(20) as Double
▪ Dim myMatrix(10,10) as Integer
» Nel primo caso abbiamo definito un vettore che contiene numeri
in doppia precisione di 20 elementi, nel secondo abbiamo una
matrice 10 x 10 di interi.
58
La Sintassi del VBA:
Vettori e Matrici
» Descriviamo anche la sintassi in forma generica
Dim NomeVariabile ([Indici]) [As Tipo]
La sezione indici ha la seguente sintassi
[minimo to] massimo [, [minimo to] massimo]
che cosa vuol dire?
E’ semplice, prima di tutto ricordiamo che tutto quello che si
trova tra parentesi quadre è opzionale, quindi è possibile
dimensionare un vettore sia scrivendo
Dim myVector(20) As Double
Sia scrivendo
Dim myVector(1 to 10) As Double
59
La Sintassi del VBA:
Vettori e Matrici
» In maniera analoga entrambe le dichiarazioni sono
valide
Dim myMatrix(10,10) As Integer
Dim myMatrix(1 to 10, 1 to 10) As
Integer
» Notate che è richiesto solo il limite superiore;
l’indicazione del valore minimo per l’indice è opzionale.
Se si specifica solo il limite superiore il VBA numera gli
elementi dell’array coerentemente con l’impostazione
Option Base.
» Questa è una direttiva al compilatore che specifica se si
desidera che gli indici degli array partano da 0 o da 1.
La sintassi è la seguente
Option Base 0 | 1
» In mancanza di questa istruzione l’interprete VBA fa
partire la numerazione degli array da 0.
60
La Sintassi del VBA:
Vettori e Matrici
» Il riferimento ad un generico elemento
all’interno di un vettore o di una matrice
avviene specificando l’indice all’interno di
parentesi.
» Esempio:
a = myVector(5)
b = myMatrix(7,6)
» Nel primo caso alla variabile a viene
assegnato il valore del 5° elemento del
vettore myVector, nel secondo b è posto
uguale all’elemento di matrice posto nella 7a
riga, 6a colonna
61
» In maniera analoga, ogni volta che si intende
attribuire un valore ad un certo elemento di
un array occorre specificare l’indice relativo.
Ad esempio
MyVector(7) = 8.9
La Sintassi del VBA:
Vettori e Matrici
» Possono presentarsi delle situazioni in cui non è possibile o semplicemente non è conveniente fissare a
priori il numero di elementi di un array cioè la sua dimensione.
» L’uso di un array dinamico al posto di uno statico risolve questo problema in quanto un array dinamico
può essere esteso o ridotto secondo le necessità.
» Un array dinamico viene dichiarato tale facendo seguire la parola chiave ReDim e indicando il numero
di elementi del vettore con una variabile (che deve essere comunque definita al momento
dell’esecuzione dell’istruzione di dimensionamento)
ReDim Scadenze(n) As Date
ReDim Flussi(m) As Currency
ReDim Matrice(k) As Double
62
La Sintassi del VBA:
Vettori e Matrici
» E’ possibile anche ridimensionare un array
preservandone il contenuto. A tale scopo è necessario
usare la clausola Preserve che va posta subito dopo
la parola chiave ReDim, ad esempio
ReDim Preserve Vettore(n) As Single
» Nel caso di un array multidimensionale, tuttavia,
quando si usa la parola chiave Preserve si può
modificare soltanto l’ultima dimensione.
63
La Sintassi del VBA:
Vettori e Matrici
» Per riuscire a tenere traccia delle dimenzioni di array
siano essi statici o dinamici il VBA prevede due funzioni,
LBound e UBound, che restituiscono il valore minimo e
massimo per gli indici di un array. La sintassi generica
per queste funzioni è
LBound(NomeArray [, dimensione])
UBound(NomeArray [, dimensione])
» dimensione è un numero intero che specifica per
quale dimensione dell’array si vuole ottenere il limite
minimo o massimo. Se non viene specificato VBA
restituisce l’estremo relativo alla prima dimensione
dell’array.
64
» Spesso i dati possono essere aggregati in modo
da avere variabili che contengono al loro interno
altre variabili.
» Ad esempio possiamo definire una variabile
TitoloFinanziario che contiene al suo
interno gli attributi che caratterizzano questo
tipo di oggetto.
» L’istruzione Type serve a questo scopo
Type TitoloFinanziario
Descrizione as String
Prezzo as Double
Volatilità as Double
End Type
Tipi definiti dall’utente
» Possiamo così dichiarare una nuova
variabile, ad esempio un’azione come
un generico titolo
Dim Azione As TitoloFinanziario
» E’ possibile accedere ai singoli attributi
del titolo (campi) con la seguente
sintassi
PrezzoDelTitolo = Azione.Prezzo
Tipi definiti dall’utente
» L’istruzione With può essere applicata in vari
contesti per migliorare la leggibilità di istruzioni
che operino sullo stesso oggetto.
» Essa permette di riportare un’unica volta il nome
dell’oggetto e sulle righe successive abbreviare
quest’ultimo con il carattere punto.
» Esempio:
With Azione
PrezzoAzione = .Prezzo
DescAzione = .Descrizione
VolAzione = .Volatilità
End With
Tipi definiti dall’utente
La Sintassi del VBA:
Procedure
» Una procedura è una frazione di codice che
esegue un determinato compito il più possibile
elementare;
» Con Visual Basic è possibile creare due tipi di
procedure:
▪ procedure di tipo Sub (SUBROUTINE)
▪ procedure di tipo Function. (FUNZIONI)
» A differenza di altri linguaggi il Visual Basic
distingue nettamente queste due diverse
tipologie di procedura;
68
La Sintassi del VBA:
Procedure
» Una procedura Function è un’unità di codice
racchiusa fra le istruzioni Function e End
Function.
» Come una procedura Sub una procedura Function
esegue un preciso compito. A differenza della
procedura Sub tuttavia essa restituisce anche un
valore.
» Esempio
Function CalcolaQuadrato(x as Double) as Double
CalcolaQuadrato = x*x
End Function
69
» Ritorno di valori da una procedura Function
▪ Di solito lo scopo di una funzione è quello di eseguire alcuni
calcoli o delle operazioni specifiche su un insieme di dati e
di restituire il risultato di queste operazioni.
▪ All’interno del corpo della funzione la riga
Nome = Espressione
rappresenta l’assegnamento della funzione.
▪ Perché una funzione restituisca un valore essa deve sempre
includere un’istruzione che assegni un valore al nome della
funzione.
▪ Nella sintassi del Visual Basic questo si ottiene assegnando il
valore che si vuole restituire al programma chiamante ad
una variabile fittizia che ha lo stesso nome della funzione
ma che non viene dichiarata in alcun luogo.
La Sintassi del VBA:
Procedure
La Sintassi del VBA:
Procedure
» Una procedura Sub (subroutine) è un’unità di codice
racchiusa fra le istruzioni Sub … End Sub.
» La procedura di tipo subroutine esegue un compito ma
non restituisce alcun valore.
» Esempio
Sub CalcolaQuadrato(x as Double, res as Double)
res = x * x
End Sub
71
» Le funzioni e le subroutine possono prendere in input dei parametri (detti argomenti della funzione).
» Questi parametri sono dei valori che la funzione o la subroutine riceve per la propria elaborazione e sono
indicati fra le parentesi tonde nella riga di dichiarazione della funzione.
La Sintassi del VBA:
Procedure
72
Public Sub ProceduraSub()
MsgBox “Questa procedura è una subroutine”
End Sub
Public Function ProceduraFun() As String
ProceduraFun = “La procedura che ha generato _
questo risultato è una funzione”
End Function
» Ci sono diverse circostanze in cui può essere utile scrivere una funzione in
cui il numero di parametri da richiedere all’utente non sia rigidamente
prefissato.
▪ Nel caso delle funzioni predefinite del Visual Basic, ad esempio, questa
circostanza più che l’eccezione rappresenta quasi la regola. Pensiamo ad una
funzione VBA nativa come InputBox che richiede in generale sette parametri
ma che può essere richiamata con un solo parametro, il messaggio che
compare nella finestra di dialogo, essendo gli altri sei opzionali.
» Per creare parametri di questo tipo, ovverosia parametri che possono
essere inseriti oppure omessi in relazione alle diverse esigenze, si utilizza la
parola chiave Optional che va anteposta ad ognuno di essi nella
dichiarazione della funzione.
▪ Per esempio potremmo voler scrivere una funzione che calcola il tasso di
interesse che possa essere utilizzata sia indicando il numero di pagamenti
effettuati nel corso dell’anno (variabile m) sia indicando semplicemente il valore
iniziale e finale del capitale.
Procedure: Parametri Opzionali
» E’ facile scrivere una semplice funzione che calcola il tasso di interesse
nominale su base annua in funzione del numero di pagamenti. Indichiamo con
▪ V0 il valore del capitale iniziale;
▪ V1 il valore del capitale al termine dell’anno;
▪ m il numero di pagamenti effettuati nell’arco temporale considerato (un anno);
Public Function InteresseBase_1(V1 As Single, _
V0 As Single, _
Optional m As Variant) As Single
If IsMissing(m) Then
MsgBox "Il calcolo viene effettuato ipotizzando un solo pagamento", _
vbInformation + vbOKOnly, "Attenzione!"
m = 1
End If
InteresseBase_1 = m * ((V1 / V0) ^ (1 / m) - 1)
End Function
Procedure: Parametri Opzionali
» La comparsa della finestra di dialogo che richiama la nostra
attenzione sul fatto che il calcolo è stato eseguito col valore
predefinito di m è resa possibile dalla funzione nativa
IsMissing.
▪ La funzione IsMissing viene utilizzata per determinare se un
argomento Variant facoltativo è stato specificato nella
chiamata di una routine.
» IsMissing restituisce il valore logico True se nessun valore è
stato passato per l'argomento specificato, in caso contrario
restituisce False.
▪ Nel nostro caso se l’utente non attribuisce esplicitamente un
valore al parametro m la funzione la funzione IsMissing viene
utilizzata per definire questo parametro pari a 1 e, nel
contempo, avvisare l’utente della scelta implicitamente
compiuta.
Procedure: Parametri Opzionali
» Notate che il parametro m è stato esplicitamente dichiarato come Variant.
▪ Questo perché la funzione IsMissing non può essere utilizzata per tipi di dati
semplici quali Integer o Double poiché, a differenza dei tipi di dati Variant,
per tali tipi di dati non è disponibile un bit per il flag "mancante".
» Tuttavia definire tipi di dati Variant può risultare oneroso, per questo nella
sintassi degli argomenti facoltativi è possibile specificare un valore
predefinito.
Public Function InteresseBase_2(V1 As Single, _
V0 As Single, _
Optional m As Integer = 1) As Single
If m = 1 Then
MsgBox "Il calcolo viene effettuato ipotizzando un solo pagamento", _
vbInformation + vbOKOnly, "Attenzione!"
End If
InteresseBase_2 = m * ((V1 / V0) ^ (1 / m) - 1)
End Function
Procedure: Parametri Opzionali
L’angolo di Sheldon
»Cenni sulla gestione della memoria
»Passaggio per valore e per riferimento
77
La gestione della memoria (cenni)
» La memoria di un computer può essere
immaginata come una sequenza di locazioni
ciascuna delle quali composta da 8 bit (1
Byte).
» Una locazione è caratterizzata da due
proprietà:
▪ il suo contenuto
▪ il suo indirizzo
» Il contenuto di una locazione di memoria è il
valore del Byte (che può essere la codifica di
un carattere oppure una parte di una
variabile).
» L’ indirizzo invece è un identificatore univoco
che permette di riferirsi a quella specifica
locazione di memoria.
» La richiesta al sistema operativo di una
locazione per memorizzare una variabile
è detta dichiarazione o allocazione di
variabile.
» Il risultato di questa operazione è
l’assegnamento da parte del sistema
operativo di un indirizzo nello spazio di
indirizzamento del vostro processo al
quale corrisponde la variabile dichiarata.
La gestione della memoria (cenni)
Procedure
»Passaggio parametri per valore e per riferimento
▪ Il passaggio per valore consente alla routine di accedere a una copia della
variabile; di conseguenza, il valore effettivo della variabile non può essere
modificato dalla routine alla quale viene passato.
▪ Viceversa, il passaggio per riferimento consente alla routine di accedere alla
variabile effettiva, quindi il suo valore può essere modificato dalla routine
alla quale viene passato e la modifica ha valore anche al di fuori della routine
stessa.
▪ Se non diversamente specificato, gli argomenti di una routine in VBA vengono
passati per riferimento.
▪ Questo comportamento è opposto alla maggior parte dei linguaggi di alto
livello e se non compreso può portare a comportamenti anomali del codice
difficilmente individuabili.
Procedure
»Passaggio parametri per valore e per riferimento
▪ Il meccanismo di default può essere tuttavia modificato utilizzando le parole
chiave ByVal e ByRef;
»Quando passare un argomento per valore
▪ Se l'elemento di codice chiamante sottostante all'argomento non deve
modificare le variabili passate in input, dichiarare i parametri corrispondenti
ByVal. Solo il codice chiamante può modificare il valore di un elemento
modificabile passato per valore.
»Quando un argomento venga passato per riferimento
▪ Se la procedura richiede la modifica dell'elemento sottostante nel codice
chiamante, dichiarare il parametro corrispondente ByRef.
Clicca qui per aprire il file di esercitazione
ESEMPIO_1_3.XLSM
Il Modello ad Oggetti di Excel
L’interazione con i fogli di calcolo
Gestire l’Interazione con Excel
» Le caratteristiche sintattiche del VBA viste fino a questo punto riguardano tecniche di
programmazione convenzionale;
» Il punto realmente innovativo del VBA consiste nella possibilità di interagire dinamicamente con i
dati presenti nei foglio Excel
» Un’applicazione VBA per Excel si caratterizza quindi a livello progettuale distinguendo chiaramente
tre fasi
▪ INPUT – in questa fase si raccolgono i dati necessari all’elaborazione da uno o più fogli Excel, eventualmente si
possono raccogliere altri dati utilizzando la funzione InputBox o appositi form costruiti dall’utente (vedi oltre);
▪ ELABORAZIONE – questa è la parte di calcolo convenzionale all’interno della quale possono essere presenti
anche procedure di elaborazione dati realizzate in altri linguaggi (es. C/C++) al fine di ottimizzare i tempi di
elaborazione;
▪ OUTPUT – Il risultato del calcolo solitamente viene riportato nelle celle del foglio di lavoro ed eventualmente
riportato in grafico.
83
Gestire l’Interazione con Excel
» Gli oggetti di Excel (così come quelli delle altre
applicazioni Microsoft Office) sono raggruppati in classi
organizzate in modo gerarchico. Ogni classe di oggetti a
sua volta può contenere una o più sottoclassi.
» La gerarchia vede al livello più alto l’oggetto
Application che rappresenta l’applicazione stessa.
» E’ facile rendersi conto che all’interno dell’applicazione
molti oggetti sono dello stesso tipo essendo distinti
solo da un nome univoco o da un indice di riferimento;
si pensi ad esempio ai vari fogli che compaiono
all’interno di una cartella di lavoro. Questi oggetti
formano una collezione o insieme di oggetti.
84
Gestire l’Interazione con Excel
» Le collezioni sono sempre individuate da nomi al plurale. Ad
esempio in Excel l’insieme Workbooks rappresenta tutte le
cartelle di lavoro correntemente aperte. All’interno di ogni oggetto
Workbook è disponibile un insieme di oggetti Worksheet (i fogli
di lavoro), tale insieme è identificato dal nome Worksheets.
▪ Tutti gli insiemi in Microsoft Office consentono di accedere a ciascun
elemento nell’insieme oltre che al numero di oggetti dell’insieme.
▪ Per accedere ad un singolo oggetto in un insieme in Visual Basic è
sufficiente digitare il nome dell’insieme seguito dal valore di un indice
univoco di riferimento (che può essere un nome o un numero) compreso
fra parentesi tonde.
▪ Ad esempio se intendiamo riferirci al foglio denominato “Foglio1” di
una generica cartella di lavoro, possiamo utilizzare l’insieme
Worksheets con la seguente sintassi: Worksheets(“Foglio1”)
oppure Worksheets(1).
85
Gestire l’Interazione con Excel
» L’istruzione For Each consente di ripetere un gruppo di istruzioni per ciascun
elemento di una collezione.
86
Sintassi
Public Sub test()
Dim w As Worksheet
For Each w In Worksheets
Debug.Print w.Name
Next
End Sub
Esercitazione
»Lavorare con i fogli Excel
▪ Elementi noti :
▪ Elementi della Sintassi VBA
▪ Apprendimento:
▪ Metodi per la gestione dei Fogli Xl
▪ Istruzione For Each
▪ Anticipazione:
▪ Pulsanti di Comando
87
Clicca qui per aprire il file di esercitazione
ESEMPIO_1_4.XLSM
Gestire l’Interazione con Excel
» Ogni oggetto Microsoft Office può contenere
proprietà, metodi o eventi.
▪ Una proprietà è un attributo caratteristico che
definisce o descrive un oggetto, come la dimensione
di una cella, la posizione di una finestra di dialogo o la
sua forma.
▪ I metodi (come abbiamo già detto) sono azioni che è
possibile eseguire sull’oggetto o tramite esso. Ad
esempio sono metodi della cartella il salvataggio su
disco, l’eliminazione di dati la chiusura della cartella
stessa.
▪ Gli eventi sono frammenti di codice che vengono
eseguiti in corrispondenza di eventi intercettati dal
sistema operativo (es. click sul mouse).
88
» La sintassi per specificare una proprietà o un metodo è
la stessa
Oggetto.Identificatore
dove
▪ Oggetto è un qualsiasi riferimento valido ad un
oggetto e
▪ Identificatore è un qualsiasi nome valido di una
proprietà o di un metodo.
» Notate che un punto (.) separa il riferimento all’oggetto
dal nome della proprietà o del metodo.
Gestire l’Interazione con Excel
» Durante la scrittura del codice ogni volta che desiderate invocare una proprietà o
un metodo il VBA visualizza accanto al punto una finestra in cui compaiono i nomi
delle proprietà e dei metodi dell’oggetto corrente.
89
⚫ I metodi vengono identificati
da un blocchetto verde mentre
le proprietà sono indicate da
un’icona a forma di lista con
un indice che punta ad un
elemento.
Gestire l’Interazione con Excel
» Pulsanti di Comando
▪ I pulsanti di comando non solo possono attivare un evento quando vi si preme sopra
con il mouse ma rispondono anche ad altri eventi come ad esempio il semplice
spostamento del mouse sopra il pulsante.
▪ Dato che i pulsanti di comando possono rispondere ad un complesso sistema di eventi
(questa come vedremo è la regola piuttosto che l’eccezione per tutti i comandi) è
necessario un modo completamente nuovo per collegare una macro ad un pulsante.
▪ Questo nuovo approccio utilizza quelle che vengono chiamate routine di gestione degli
eventi.
▪ Queste routine sono speciali macro, collegate ad un oggetto, per esempio ad un
pulsante di comando.
90
Gestire l’Interazione con Excel
» Finestra Proprietà di un Pulsante di Comando
91
Gestire l’Interazione con Excel
» Macro Gestione Evento Associata ad un Pulsante di Comando
92
Esercitazione
»Inserimento di Pulsanti nei Fogli di Lavoro
▪ Elementi noti :
▪ Istruzioni Condizionali
▪ Procedure in vba
▪ Apprendimento:
▪ interazione con oggetti di Excel
▪ Anticipazione:
▪ interazione con oggetti di Excel
93
Clicca qui per aprire il file di esercitazione
ESEMPIO_1_5.XLSM
Spostare le righe [esempio_1_5.xlsm]
» Per prima cosa, selezioniamo la riga a
cui appartiene la cella attiva.
» La proprietà EntireRow, infatti,
restituisce un oggetto range che
rappresenta la riga intera che contiene
l’intervallo (range) a cui è applicata
questa proprietà. In questo caso
specifico restituisce l’intera riga in cui
si trova la cella attiva.
» Con il metodo Cut tagliamo la
selezione, cioè l’intera riga appena
selezionata. Grazie alla proprietà
Offset selezioniamo la riga
precedente a quella attiva, cioè la riga
-1 rispetto a quella che contiene la
cella attiva.
» Applichiamo quindi alla selezione il
metodo Insert, che permette di
inserire le celle tagliate. Assegnando
all’argomento Shift il valore xlDown
specifichiamo che per far spazio alle
celle inserite deve avvenire uno
spostamento verso il basso delle celle
selezionate.
Esercitazione
»Alimentazione Dati da altro Workbook
▪ Elementi noti :
▪ Istruzioni Condizionali
▪ Procedure in vba
▪ Interazione con oggetti di Excel
▪ Apprendimento:
▪ Rilevazione cambiamento in una cella
▪ Apertura e chiusura fogli di lavoro
▪ Anticipazione:
▪ Nessuna
95
Clicca qui per aprire il file di esercitazione
ESEMPIO_1_6.XLSM
Moduli di Classe
OOP in VBA ?
97
Moduli di Classe
» Col termine Modulo di Classe si intende un
tipo particolare di modulo, simile ai moduli
standard, destinato a rappresentare una
classe di oggetti. Un modulo di classe
contiene le variabili (attributi) e il codice
VBA dei metodi che definiscono la classe. La
corrispondenza fra moduli e classi è uno-a-
uno nel senso che ciascun modulo può
definire una sola classe e viceversa.
» Per creare una nuova classe di oggetti
occorre prima di tutto inserire nel progetto
un modulo di classe.
» Successivamente dovremo scrivere il codice
VBA che definisce le proprietà e i metodi
della classe.
98
Moduli di Classe
» E’ bene segnalare sin da subito che il codice che
andremo a scrivere nei moduli di classe non verrà
eseguito nello stesso modo in cui viene eseguito il
codice dei moduli standard.
» Per utilizzare un metodo particolare dovremo
dapprima dichiarare una variabile oggetto di tipo
corrispondente alla classe personalizzata e,
successivamente, invocare proprietà e metodi di
quell’oggetto utilizzando la notazione
oggetto.proprietà/metodo in modo analogo a
quanto siamo abituati a fare con gli altri oggetti di
Excel.
» Es.
▪ myObject.method
▪ a = myObject.property
▪ myObject.property = 3
99
Moduli di Classe
» L’utilizzo di una classe di oggetti personalizzata
è in qualche modo equivalente all’utilizzo di un
tipo di dati definito dall’utente.
» Anche in questo caso occorre dapprima
dichiarare una variabile con il tipo appropriato
per poi usarla all’interno delle nostre
procedure VBA.
» Ogni modulo di classe può contenere delle
variabili per memorizzare i dati interni
dell’oggetto, delle procedure speciali per
recuperare o per impostare le proprietà
dell’oggetto stesso e, infine, delle procedure e
delle funzioni che implementano i metodi
dell’oggetto.
100
Moduli di Classe
» C’è una grande differenza tra una variabile semplice
e una variabile oggetto. La variabile oggetto non è
che un puntatore all’interno della memoria. Si
dovrà creare esplicitamente un oggetto e salvare la
sua posizione nella variabile oggetto. Questo
processo si chiama creare una nuova istanza di un
oggetto o istanziare un oggetto.
» Poiché gli oggetti sono diversi dalle variabili, Visual
Basic for Applications utilizza una speciale istruzione
chiamata istruzione Set.
» L’istruzione Set ha due forme. Ecco la prima:
Set VariabileOggetto = New NomeClasse
» In questa forma, l’istruzione Set crea un nuovo
oggetto basato su NomeClasse. Ciò significa che
Visual Basic allocherà memoria per l’oggetto e
salverà la posizione in memoria nella classe
VariabileOggetto.
101
Moduli di Classe
Set VariabileOggetto = EspressioneOggetto
» Nella seconda forma, l’istruzione Set fa due
cose: prima di tutto l’istruzione rilascia
l’oggetto a cui puntava (se presente), quindi
salva un puntatore a un oggetto già esistente
in VariabileOggetto.
102
Moduli di Classe
» Visual Basic for Applications contiene un
valore speciale chiamato Nothing. Questo
valore può essere usato solo con gli oggetti.
Nothing è il valore associato con una variabile
oggetto che non punta al momento a
un’istanza di una classe.
» Una variabile oggetto dichiarata con
un’istruzione Dim sarà inizialmente impostata
a Nothing.
» È possibile determinare se è stata creata una
nuova istanza di classe usando Is Nothing in
un’istruzione If come questa:
If VariabileOggetto Is Nothing Then
103
Moduli di Classe
» La seguente istruzione può essere usata per
distruggere un oggetto:
Set VariabileOggetto = Nothing
» Quest’istruzione libererà il riferimento
all’oggetto e imposterà la variabile oggetto al
suo stato non inizializzato. Assumendo che ci
sia solo una variabile oggetto che punta
all’oggetto, questa istruzione distruggerà
anche l’oggetto e libererà tutte le risorse
associate a esso.
» Tuttavia, se diverse variabili oggetto puntano a
questo oggetto, occorre impostarle tutte a
Nothing prima che l’oggetto venga distrutto.
L’oggetto Collection (Cenni)
» Una Collection (Raccolta) è un tipo che
contiene un insieme di oggetti correlati - in
memoria.
» I tipi di raccolta sono molto utili perché è
facile aggiungere elementi e iterare sugli
articoli della raccolta per qualsiasi scopo
sia necessario.
» I tipi di raccolta specializzati vengono
utilizzati nelle applicazioni di Office. In MS
Access, ad esempio, un Recordset può
essere una raccolta di record in una
tabella, la raccolta Form contiene tutti i
moduli aperti e così via.
L’oggetto Collection (Cenni)
» Dichiarazione di una Collection
▪ Una variabile dell'oggetto collezione deve
essere creata come una "nuova" raccolta, a
meno che non la si voglia assegnare a una
raccolta esistente.
▪ In genere, il codice per creare una raccolta ha il
seguente aspetto:
▪ Dim colPersons As Collection
▪ Set colPersons = New Collection
L’oggetto Collection (Cenni)
» Aggiungere elementi ad una Collection
▪ Il codice seguente mostra come è possibile
aggiungere elementi a una raccolta.
▪ Nel nostro caso abbiamo aggiunto oggetti di
classe personalizzati (Person) alla raccolta, ma
è possibile aggiungere qualsiasi cosa, inclusi
tipi standard come stringhe o oggetti
incorporati nell'applicazione Office.
107
Moduli di Classe
» Prima di aggiungere un modulo di classe ad un progetto VBA
è indispensabile progettare attentamente l’oggetto che
vogliamo costruire. L’elenco seguente riepiloga i principali
requisiti per la corretta progettazione di una classe di
oggetti:
▪ Tutte le informazioni relative all’oggetto devono essere
memorizzate all’interno dell’oggetto stesso. Come vedremo è
possibile dichiarare diverse variabili all’interno del modulo di
classe per contenere delle informazioni che descrivono
l’oggetto.
▪ Tutto il codice necessario per manipolare i dati dell’oggetto o
per modificarne il comportamento deve essere contenuto
all’interno dell’oggetto stesso. Questo significa che i metodi
dell’oggetto saranno procedure che andremo a scrivere
all’interno del modulo di classe relativo all’oggetto che stiamo
definendo.
▪ Tutto il codice necessario per generare dei valori basati sui
dati dell’oggetto deve essere incluso al suo interno.
108
La classe CCouponBond
» In questo esempio procederemo tentando di
capire quali sono le informazioni essenziali che
identificano un titolo di tipo coupon bond a
tasso fisso sforzandoci di identificare prima quei
dati che potrebbe essere necessario recuperare
o impostare nel corso di una procedura, e che
diverranno le proprietà dell’oggetto.
» Successivamente, elencheremo tutte le azioni
che il nostro oggetto deve essere in grado di
compiere utilizzando i propri dati.
» In quest’ultimo passaggio stiamo definendo il
comportamento che vogliamo attribuire al
nostro oggetto, ogni azione di questo elenco
rappresenterà quindi un diverso metodo.
» Chiameremo questa nostra prima classe
CCouponBond.
109
La classe CCouponBond
» A puro scopo esemplificativo, un titolo coupon
bond può essere caratterizzato dai seguenti
attributi:
▪ Data Emissione
▪ Data Scadenza
▪ Cedola
▪ Periodicità dei pagamenti
▪ Valore Nominale
▪ Scadenzario
▪ Piano Cedole
▪ Piano Rimborso
▪ Prezzo di Mercato
▪ Ritenuta Fiscale
110
La classe CCouponBond
» Una volta individuati gli attributi è necessario
caratterizzarli definendo per ciascuno di essi una variabile
di tipo appropriato. Nel nostro caso abbiamo scelto la
seguente corrispondenza
Attributo Nome Variabile Tipo Variabile Tipo Struttura
Data Emissione DataEmissione Date Scalare
Data Scadenza DataScadenza Date Scalare
Cedola Cedola Double Scalare
Periodicità dei
pagamenti
Periodo Integer Scalare
Valore Nominale Nominale Double Scalare
Scadenzario Scadenzario Date Array
Dinamico
Piano Cedole PCedole Double Array
Dinamico
Piano Rimborso PRimborso Double Array
Dinamico
Prezzo di Mercato Prezzo Double Scalare
Ritenuta Fiscale Ritenuta Double Scalare
111
La classe CCouponBond
» Per inserire e per rinominare un modulo di
classe seguite questi passaggi:
▪ Nell’Editor VB, scegliete Inserisci – Modulo
di Classe (oppure fate clic con il tasto destro
del mouse su VBAProject). L’Editor VBA
aggiunge un nuovo modulo di classe al
progetto e gli assegna un nome predefinito.
▪ Scegliete il comando Visualizza - Finestra
Proprietà per attivare la finestra proprietà
qualora questa non sia già visibile.
▪ Nella casella di testo Name digitate il nuovo
nome della classe: CCouponBond.
» A questo punto siamo pronti per introdurre
le variabili e le procedure che compongono
le definizioni dei metodi e delle proprietà
del nuovo oggetto.
112
La classe CCouponBond
» Scrivere le definizioni dei metodi di
una classe non è poi così diverso dallo
scrivere il codice di una qualunque
procedura o funzione VBA.
▪ Ogni funzione o procedura che scriveremo
in un modulo di classe diventa disponibile
come metodo della classe e la sintassi è
esattamente la stessa che avete già
imparato per scrivere procedure e funzioni
dei moduli standard.
» Anche la scrittura delle definizioni
delle proprietà di una classe è
essenzialmente uguale alla scrittura
delle funzioni e delle procedure
standard ma richiede una sintassi
leggermente diversa.
Esercitazione
»Utilizzo della Classe CCouponBond
▪ Elementi noti :
▪ Sintassi Base VBA
▪ Apprendimento:
▪ Uso dei Moduli di Classe in VBA
▪ Utilizzo dei Form
▪ Il controllo calendario
▪ Anticipazione:
▪ Nessuna
113
Clicca qui per aprire il file di esercitazione
ESEMPIO_1_7.XLSM
Premere con il tasto destro
sul nodo del VBA Project al
quale vogliamo aggiungere il
form
User Form
Alcuni fra gli eventi più comuni dell’oggetto UserForm
Evento Quando Avviene
Activate Questo evento viene scatenato ogni volta che la finestra
diventa attiva cioè passa in primo piano. Questo evento è
molto utile ogniqualvolta si renda necessario aggiornare il
contenuto dei controlli
in modo da riflettere i cambiamenti che possono essere
intervenuti quando la finestra non era attiva.
Click E’ l’evento che si genera ogni volta che l’utente preme con il
mouse sulla superficie della finestra.
Initialize Questo evento si genera quando l’oggetto finestra viene
caricato in memoria. Come vedremo questo evento può essere
scatenato dall’istruzione Load o dal metodo Show. Questo
evento si utilizza per impostare l’aspetto iniziale della finestra
e i controlli eventualmente contenuti nel form. Nel nostro
esempio utilizzeremo questo evento per caricare una serie di
valori predefiniti in un combo box all’interno della finestra di
dialogo.
Terminate Evento scatenato quando l’oggetto finestra viene scaricato
dalla memoria. Questo evento viene utilizzato in tutte quelle
circostanze ove si rende necessario liberare le variabili
dell’oggetto prima di chiudere quest’ultimo.
User Form
116
La classe CCouponBond
» Abbiamo anteposto al nome della variabile l’identificativo m_ per
indicare che queste sono variabili interne alla classe (vengono
anche dette membri della classe).
▪ Queste variabili non sono visibili all’esterno della classe, nel linguaggio
della programmazione orientata agli oggetti si dice che i dati sono
incapsulati o nascosti.
» Per accedere alle variabili membro occorre definire delle apposite
procedure solo per quei dati ai quali si vuol dare accesso in lettura e
scrittura da parte delle altre procedure del programma.
▪ In particolare le procedure di tipo Property Get permettono di
recuperare un valore di una proprietà dell’oggetto, mentre le
procedure di tipo Property Let consentono di assegnare un valore ad
una proprietà dell’oggetto (dove chiaramente ciascuna proprietà deve
corrispondere ad una variabile interna).
117
La classe CCouponBond
» Una procedura Property Get ha la seguente sintassi
▪ La parola chiave Property indica al Visual Basic che questa è una
procedura per una proprietà dell’oggetto, mentre la parola chiave Get
indica che essa restituirà un valore della proprietà stessa.
▪ L’elenco opzionale degli argomenti rappresenta l’elenco degli
argomenti per la procedura ed ha la stessa sintassi che abbiamo
imparato a conoscere per gli argomenti delle funzioni e delle
subroutine.
▪ L’istruzione Nome = espressione è in pratica un’istruzione di
assegnamento analoga a quanto accade nelle normali funzioni.
Property Get Nome ([elenco argomenti]) [As nometipo]
[istruzioni]
Nome = espressione
[istruzioni]
End Property
118
La classe CCouponBond
» Vediamo subito alcuni esempi, il codice sottostante riporta la
Property Get della variabile m_DataScadenza.
▪ Property Get DataScadenza() As Date
▪ DataScadenza = m_DataScadenza
▪ End Property
» La procedura è semplicissima e, come si vede, si limita a
restituire in output il valore della proprietà m_DataScadenza
della nostra classe CCouponBond.
119
La classe CCouponBond
» Leggermente più articolata è la Property Get per il vettore Scadenzario
▪ Property Get Scadenzario(Index As Integer) As Date
▪ If Index <= UBound(m_Scadenzario) And Index >= LBound(m_Scadenzario) Then
▪ Scadenzario = m_Scadenzario(Index)
▪ Else
▪ Scadenzario = "01/01/1900"
▪ End If
▪ End Property
» In questo caso la funzione non restituisce tutto l’array ma solo un elemento;
» l’indice dell’elemento che si desidera ottenere viene passato come
argomento alla Property.
▪ Se questo valore è compreso all’interno dell’intervallo individuato dall’indice
minimo e da quello massimo (ricavati con le funzioni UBound e LBound) si
procede ad assegnare il valore alla funzione che lo restituisce all’esterno.
▪ Altrimenti viene restituito un valore che permetta di gestire una condizione di
errore (nel nostro caso restituiamo la data del 1 gennaio 1900).
120
La classe CCouponBond
» Scrivendo una procedura Property Get si crea una
proprietà leggibile per nostro oggetto.
» Se scriviamo solo la Property Get la proprietà sarà di sola
lettura (non sarà cioè possibile modificarla dal resto del
programma).
» Qualora la proprietà debba anche essere modificata dal
programma è necessario scrivere anche una procedura
Property Let.
▪ Property Let Nome ([elenco argomenti,] nuovovalore)
▪ [istruzioni]
▪ End Property
» Per questo fine esistono anche procedure di tipo
Property Set che differiscono dalle Property Let in
quanto ricevono argomenti passati per riferimento e
non per valore.
La Gestione degli Errori
Uso della procedura On Error goto
Il primo bug
» L'uso del termine bug, che in inglese
indica genericamente un piccolo
insetto, è legato ad un curioso aneddoto
risalente ai tempi pionieristici
dell'informatica;
» il 9 settembre 1947 il tenente Grace
Hopper ed il suo gruppo stavano
cercando la causa del
malfunzionamento di un computer
Mark II quando, con stupore, si
accorsero che una falena si era
incastrata tra i circuiti.
» Dopo aver rimosso l'insetto (alle ore
15:45), il tenente incollò la falena
rimossa sul registro del computer e
annotò: «1545. Relay #70 Panel F
(moth) in relay. First actual case of bug
being found».
Tipologie di errori
»Durante lo sviluppo e l'esecuzione di un codice sorgente possono
verificarsi i cosiddetti "errori di programmazione" che si possono
distinguere essenzialmente in tre principali categorie: errori di
sintassi, errori di logica ed errori di runtime.
▪ Gli errori di sintassi sono gli errori che si commettono nella fase di scrittura
del programma nel linguaggio scelto, fase successiva alla progettazione
dell'algoritmo.
▪ Sono In genere errori di ortografia nella scrittura del codice o nella sintassi
delle istruzioni.
▪ Gli errori di sintassi impediscono la compilazione del programma da parte del
compilatore che quindi tipicamente segnalerà la presenza dell'errore.
▪ Questo tipo di errore è spesso segnalato al programmatore direttamente
dall'editor dell'ambiente integrato di sviluppo (IDE) utilizzato, risultando
dunque di facile individuazione e soluzione.
Tipologie di errori
»Durante lo sviluppo e l'esecuzione di un codice sorgente possono
verificarsi i cosiddetti "errori di programmazione" che si possono
distinguere essenzialmente in tre principali categorie: errori di
sintassi, errori di logica ed errori di runtime.
▪ Gli errori di logica (o semantica) sono gli errori che si commettono nella fase
di progettazione dell'algoritmo: possono essere causati da una mancata
comprensione del problema da calcolare o dei vincoli che i dati in input
devono rispettare, o ancora nella valutazione del test dell'algoritmo.
▪ Questi errori conducono tipicamente alla progettazione di un algoritmo che
non fornisce l'output richiesto nell'ambito di una o più istanze del problema
da risolvere.
▪ Sono difficili da individuare e spesso si deve ricorrere al debugging tramite il
debugger dell'IDE.
Tipologie di errori
»Durante lo sviluppo e l'esecuzione di un codice sorgente possono
verificarsi i cosiddetti "errori di programmazione" che si possono
distinguere essenzialmente in tre principali categorie: errori di
sintassi, errori di logica ed errori di runtime.
▪ Gli errori di runtime sono errori che possono verificarsi nella fase di
esecuzione del programma, anche se l'algoritmo è corretto e il codice viene
compilato correttamente.
▪ Spesso sono relativi all'utilizzo della memoria da parte del programma stesso,
che tenta ad esempio di scrivere ad una locazione di memoria alla quale non
ha accesso.
▪ Questi errori si verificano principalmente nell'utilizzo dei puntatori e in
programmazione dinamica.
On Error GoTo
» Finora abbiamo cercato di prevenire tutti i
possibili errori che può commettere
l’utente o le imprecisioni che possono
derivare da una programmazione non
precisissima.
» Tuttavia non è sempre possibile prevedere
in anticipo cosa potrebbe andare storto.
» In questa sezione studieremo un sistema
per gestire tutti gli errori che si possono
verificare.
On Error GoTo
» Che cosa succede ad esempio se un utente
cancella o rinomina un foglio di lavoro a cui
il codice fa riferimento?
» VBA non riesce a gestire la situazione
perché nel codice si fa riferimento esplicito
a quel foglio, quindi se l’utente tenta di
inserire un dato all’interno del foglio Excel
mostra un messaggio di errore;
» se poi l’utente fa clic sul pulsante Debug
della finestra dell’errore, viene aperto
l’editor di VBA con il codice non corretto
evidenziato.
» Questo può spiazzare un utente non
esperto.
On Error GoTo
» Per evitare questo comportamento abbiamo due possibilità:
▪ cercare di risolvere questo specifico errore proteggendo la cartella di lavoro, il che impedisce
all’utente di rinominare o cancellare i fogli, oppure
▪ predisporre una soluzione generale, utile anche per gestire altri errori a cui non abbiamo
pensato.
▪ NOTA Per proteggere una cartella di lavoro, portatevi alla scheda Revisione della barra
multifunzione e, nel gruppo Revisioni, fate clic sul pulsante Proteggi cartella di lavoro.
» In genere, la soluzione ideale è tentare di risolvere specificamente tutti i possibili
errori e prevedere al contempo una soluzione generale per le situazioni a cui non
abbiamo pensato.
» Considerate che è quasi impossibile prevedere tutti i probabili errori e tutte le
probabili azioni di un utente.
On Error GoTo
» Per introdurre la gestione degli errori
basta correggere le nostre procedure
come segue...
» All’inizio della routine, appena sotto
alla dichiarazione delle variabili,
dobbiamo aggiungere l’istruzione
On Error GoTo Errore.
» Questo significa: “Se trovi un errore
(On Error) vai a (GoTo) alla parte della
routine a cui è assegnata l’etichetta
Errore (Errore)”.
On Error GoTo
»È importante che questa istruzione stia all’inizio della routine, prima
che il codice cominci a essere eseguito, ossia prima che possa
verificarsi un errore.
»La parte di routine con etichetta Errore (potreste scegliere una
qualsiasi altra etichetta a vostro piacimento) deve essere posta alla
fine della routine, appena prima di End Sub, e deve essere preceduta
da un’istruzione Exit Sub per evitare che il contenuto dell’etichetta
Errore sia eseguito anche quando non si verifica un errore.
»Le istruzioni contenute nella porzione di Sub identificata dall’etichetta
indicano a VBA cosa fare in caso di errore: mostrare un messaggio e
terminare l’esecuzione della routine per evitare di incorrere in altri
errori.
On Error GoTo
» Se preferite che l’istruzione che genera l’errore venga semplicemente saltata e sia
eseguito il resto della routine, invece di usare l’istruzione On Error GoTo …,
utilizzate On Error Resume Next.
» Questa istruzione, infatti, indica a VBA di continuare l’esecuzione del codice dalla
riga successiva a quella che ha causato l’errore.
» Ovviamente, potete adottare questa soluzione solo se pensate che l’errore che
può verificarsi non sia cruciale e che si riesca comunque a eseguire il codice
seguente.
» Soprattutto con routine complesse, conviene sempre prevenire gli errori
imprevisti.
Estensione delle Funzionalità
Personalizzazione e Sviluppo Componenti Aggiuntivi
Personalizzare la Barra Multifunzione
» Perché le funzionalità che
abbiamo realizzato nei capitoli
precedenti siano utilizzabili in
tutti i file aperti in Excel
bisogna che siano accessibili
dalla barra multifunzione.
» A partire da Excel 2010 (con la
versione 2007 questo non è
possibile) è possibile
aggiungere alla barra
multifunzione un nuovo
pulsante che richiama
un’istruzione VBA.
» Si può aggiungere il pulsante in
un nuovo gruppo di comandi di
una scheda esistente o in una
scheda completamente nuova.
Personalizzare la Barra Multifunzione
» Per prima cosa, bisogna
selezionare la scheda esistente
dopo la quale si vuole inserire
la nuova scheda.
» Quindi, bisogna premere il
pulsante Nuova scheda posto
sotto alla casella con l’elenco
delle schede. Verrà aggiunta
una nuova scheda con un
nuovo gruppo.
» La nuova scheda e il nuovo
gruppo hanno un nome
generico. Per cambiarli, basta
selezionare il nome della
scheda o del gruppo da
cambiare e premere il
pulsante Rinomina.
Personalizzare la Barra Multifunzione
» Dall’elenco a discesa Scegli
comandi da (in alto, sopra il
riquadro di sinistra),
selezionate la voce Macro.
» Nel riquadro a sinistra Excel vi
mostrerà le routine disponibili
(ossia quelle presenti nel file
eventualmente aperto e nei
componenti aggiuntivi
caricati): selezionate le macro
desiderate, poi premete il
pulsante Aggiungi.
» Una volta inseriti i comandi,
con il pulsante Rinomina
potete accedere a una finestra
che permette di modificare
l’icona e il testo descrittivo del
nuovo pulsante. Alla fine della
procedura, la nuova scheda
sarà aggiunta alla barra
multifunzione.
L’angolo di Sheldon
»Personalizzare la Personalizzazione della Barra Multifunzione
»Com’è strutturato un file office?
»Uso di Custum UI Editor For Microsoft Office
136
Personalizzare la Barra Multifunzione
» In realtà, la soluzione che abbiamo appena descritto non è ottimale dato che la
nuova scheda della barra multifunzione con il pulsante che richiama le nostre
routine sarà sempre attiva anche se il file che contiene questa routine non è
aperto.
» Tutto questo perché Excel non permette di personalizzare la barra multifunzione di
un singolo file, ma solo di tutto l’applicativo Excel. I pulsanti inseriti nella nuova
scheda rischiano di diventare inutili.
» Sarebbe meglio, allora, inserire la personalizzazione della barra multifunzione
direttamente nel file Excel che contiene il codice VBA da richiamare mediante i
pulsanti della scheda personalizzata. In questo modo, la nuova scheda sarà
mostrata solo quando il file è aperto e il suo codice è utilizzabile.
» Abbiamo detto che non lo si può fare da interfaccia; bisogna quindi procedere via
codice. Prima, però, è necessaria qualche spiegazione teorica.
Personalizzare la Barra Multifunzione
» I file di Office 2007/2010/2013 sono, in realtà, delle
cartelle compresse.
» Se modificate la loro estensione in .zip, potrete poi
scompattarli come un normale file archivio. Una volta
scompattata la cartella, potrete entrare al suo
interno.
▪ Per creare una barra multifunzione personalizzata dovete
innanzitutto creare all’interno della cartella che costituisce il
file una cartella col nome customUI. Dentro customUI
occorrerà creare il file XML custmUI.xml, che conterrà il
codice che crea la barra personalizzata.
» Tutto questo non è molto pratico, dato che per
apportare modifiche e correzioni al file XML e poi
provarlo in Excel occorre continuamente scompattare
e poi ricompattare il file.
» Per fortuna, esiste un programma facile da usare e
disponibile gratuitamente su Internet che semplifica
di molto le cose. Si tratta di Office Custom UI Editor.
Personalizzare la Barra Multifunzione
» Dall’interno del tool, aprite il file di cui volete
personalizzare la barra multifunzione;
» A questo punto, è possibile aggiungere il file XML che
crea la scheda personalizzata. Prima, però, devo fare
un’altra premessa.
» Il codice XML necessario usa uno schema XML
diverso a seconda della versione di Excel a cui si fa
riferimento.
» in Office Custom UI Editor scegliete Office 2007
Custom UI Part.
Personalizzare la Barra Multifunzione
» Il nodo radice di questo codice è <customUI>, che a sua volta racchiude il tag
<ribbon> che descrive l’intera barra multifunzione.
» Sotto al nodo <ribbon> dobbiamo aggiungere il nodo <tabs>. Poi con il nodo <tabs>
iniziamo la costruzione delle diverse schede della barra multifunzione.
Personalizzare la Barra Multifunzione
» Ovviamente, non essendo partiti da zero, la nostra barra contiene già tutte le
schede standard. La scheda che descriveremo si aggiungerà a quelle già esistenti.
» Per aggiungere una scheda si usa il nodo <tab>. Ogni tag <tab> all’interno di <tags>
crea una nuova scheda.
Personalizzare la Barra Multifunzione
» Il nostro pulsante ha un id, un’etichetta e, con l’attributo onAction, definiamo quale
routine sub che deve essere richiamata al clic su di esso.
» Possiamo anche fare in modo che il pulsante abbia un’icona. Ne trovate molte alla
pagina http://soltechs.net/customUi/imageMso01.asp.
Personalizzare la Barra Multifunzione
» Questa barra ancora non funziona. Occorre predisporre opportunamente le routine
VBA da richiamare attraverso i controlli della barra. Basterà assegnare loro come
argomento: Control As IRibbonControl
» Anche questo può essere fatto dal CustomUI Editor tramite il pulsante «Generate
Callbacks»
Creare un Componente Aggiuntivo
» Excel può essere arricchito con nuove
funzionalità che vengono salvate in
speciali file, detti componenti aggiuntivi,
che hanno estensione .xlam.
» I componenti aggiuntivi, dopo che sono
stati attivati, vengono caricati in
background all’avvio di Excel. I loro fogli
sono nascosti (quindi non visibili
nell’interfaccia del programma), ma il loro
codice e le eventuali barre multifunzione
personalizzate sono perfettamente
funzionanti.
Creare un Componente Aggiuntivo
» Dopo aver cancellato i fogli
in eccesso, avviate la
procedura per salvare con
un nuovo nome.
» Nella finestra Salva con
nome, nella casella Salva
come, scegliete
Componente aggiuntivo di
Excel *.xlam. Excel vi
porterà direttamente alla
cartella AddIns
Creare un Componente Aggiuntivo
» Si tratta della cartella in cui
Excel si aspetta di trovare i
componenti aggiuntivi.
» È una cartella nascosta
creata automaticamente
all’installazione di Office
all’interno della cartella
dell’utente.
» La posizione precisa di
questa cartella varia a
seconda della versione di
Windows.
Caricare un Componente Aggiuntivo
» Fate clic sulla scheda File e poi su
Opzioni o, se lavorate con Excel
2007, aprite il menu del pulsante
Microsoft Office e premete il
pulsante Opzioni di Excel.
» Vi verrà aperta la finestra Opzioni
di Excel. Portatevi alla sezione
Componenti aggiuntivi;
Caricare un Componente Aggiuntivo
» Se aveste salvato il file del componente
aggiuntivo nella cartella AddIns
predefinita, lo trovereste già elencato in
questa finestra, ma se lo avete salvato,
come vi ho suggerito, in una cartella a
vostra scelta, non lo si vede: occorre
individuarlo.
» Premete il pulsante Sfoglia e portatevi alla
cartella in cui avete salvato il componente
aggiuntivo, poi premete il pulsante Apri:
tutti i componenti aggiuntivi presenti in
questa cartella saranno visualizzati nella
finestra Componenti aggiuntivi
MS Office Programming
Usare VBA per interagire con gli altri programmi della suite MS Office
Office Programming: Word
» Esistono 2 metodi per avviare un'applicazione
Word da Excel utilizzando VBA:
» Early Binding (associazione anticipata)
» Late Binding (associazione posticipata)
» Fondamentalmente nell'associazione
anticipata definiamo quale oggetto stiamo
usando creando un riferimento all’oggetto
specifico prima dell'esecuzione del programma
(design time).
» Nell'associazione posticipata, il programma
non saprà a cosa stiamo lavorando fino a
quando l'esecuzione non è iniziata. Si definisce
un puntatore ad un oggetto generico che però
non viene istanziato.
Office Programming: Word
» Ogni metodo ha pro e contro:
» L'associazione anticipata ha prestazioni migliori.
» Quando si usa l’associazione anticipata
l'intellisense dell’editor VBA vi permette di
codificare al meglio metodi e proprietà degli
oggetti che utilizzate.
» D’altro canto, quando si utilizza l'associazione
anticipata è necessario specificare quale
versione di Word (o di un altro applicativo) si
utilizzerà. Se l'applicazione viene portata su un
altro computer con una versione di word
diversa, il codice potrebbe non funzionare.
Office Programming: Word
»Associazione Anticipata
▪ Nel primo esempio utilizzeremo
l’associazione anticipata per
automatizzare un’applicazione
word da excel;
▪ Per prima cosa dobbiamo
aggiungere un riferimento alla
libreria specifica relativa
all’applicazione con cui stiamo
lavorando, apriamo pertanto la
finestra «Strumenti» dell’editor
VBA…
Office Programming: Word
» Al momento della stesura di queste
slide, la versione word 2016 è
installata sul mio computer, pertanto
sul mio sistema è stata installata la
libreria oggetti di Microsoft Word
16.0.
» Se avete una versione diversa di
word installata, ci sarà un'altra
libreria di oggetti in questa lista.
Office Programming: Word (esempio_2_1.xlsm)
»Esempio – Early Binding
Come accennato prima questo metodo non
verrà eseguito su un sistema con una
versione installata di Word diversa da quella
della specifica libreria referenziata.
Office Programming: Word (esempio_2_1.xlsm)
»Esempio – Late Binding
▪ Si noti che in questo caso non c’è bisogno di aggiungere alcun tipo di riferimento;
Come accennato in precedenza, sebbene
l'associazione posticipata sia meno
efficiente di quella anticipata, essa verrà
eseguita su qualsiasi sistema che abbia
word installato indipendentemente dalla
versione.
Esercitazione
• Esempi di Automazione Documenti Word
▪ Elementi noti :
▪ Sintassi VBA
▪ Modello ad Oggetti di Excel
▪ Apprendimento:
▪ Avvio applicazione Word da Excel
▪ Trasferimento dati da XL a Word
▪ Lettura dati in Word da XL
156
Clicca qui per aprire il file di esercitazione
ESEMPIO_2_1.XLSM
Clicca qui per aprire il file di esercitazione
ESEMPIO_2_1.DOCM
Come creare e compilare automaticamente moduli Word caricando i dati da XL
»Come sorgente dati XL utilizzeremo il file Esempio_2_2.xlsm;
»Tenete presente i seguenti consigli per la compilazione dei file XL da
utilizzare come sorgente dati:
▪ Anche se non è obbligatorio, date alle intestazioni delle colonne gli stessi nomi
dei campi che vogliamo poi ritrovare nel modello WORD (è più immediato fare
i collegamenti);
▪ Non lasciare colonne e righe vuote a sinistra e sopra la tabella (potrebbero
generare degli errori);
▪ Evitare assolutamente le celle unione;
Come creare e compilare automaticamente moduli Word caricando i dati da XL
» Per la creazione del modello word è sufficiente aprire un nuovo file word e selezionare il tab
LETTERE – INIZIA STAMPA UNIONE – LETTERE (Mailing – Start Mail Merge – Letters)
Come creare e compilare automaticamente moduli Word caricando i dati da XL
» Dopo di che selezionare da SELEZIONA DESTINATARI – USA ELENCO ESISTENTE (Select Recipients – Use
Existing List). Si aprirà una finestra di dialogo che ci permetterà di selezionare il file excel fonte dati. Dovremo
anche selezionare lo sheet contenente i dati da elaborare.
Come creare e compilare automaticamente moduli Word caricando i dati da XL
» A questo punto possiamo inserire i campi variabili nel modello word portandosi col cursore nel
punto dove dovrà comparire il campo variabile, cliccare sull’icona INSERISCI CAMPO UNIONE
(Insert Merge Field) e scegliere il campo da inserire. Quest’operazione va ripetuta per ogni campo
variabile che si vuole inserire.
Esercitazione
• Esempi di Automazione Documenti Word
▪ Elementi noti :
▪ Sintassi VBA
▪ Modello ad Oggetti di Excel
▪ Avvio applicazione Word da Excel
▪ Trasferimento dati da XL a Word
▪ Lettura dati in Word da XL
▪ Apprendimento:
▪ Utilizzo campi unione da VBA
▪ Anticipazione
▪ Connessioni a Basi Dati
161
Clicca qui per aprire il file di esercitazione
ESEMPIO_2_2.XLSM
Clicca qui per aprire il file di esercitazione
ESEMPIO_2_2.DOCM
Esercitazione
• Esempi di Automazione Invio Mail
▪ Elementi noti :
▪ Sintassi VBA
▪ Modello ad Oggetti di Excel
▪ Avvio applicazione Word da Excel
▪ Trasferimento dati da XL a Word
▪ Lettura dati in Word da XL
▪ Apprendimento:
▪ Interazione con oggetti MS Outlook
▪ Anticipazione
▪ Windows Script Host
162
Clicca qui per aprire il file di esercitazione
ESEMPIO_2_6.XLSM
L’angolo di Sheldon
» Cenni su Windows Script Host
» Esempio di utilizzo di WSH per realizzare una semplice interfaccia con R
163
Windows Script Host
» Windows Script Host (o WSH) (originalmente chiamato Windows Scripting Host, ma rinominato
per le versioni successive) è un linguaggio di scripting preinstallato su Windows 98 e tutti i
Windows successivi. Consente di creare script più potenti e versatili rispetto ai file batch (.BAT) del
vecchio MS-DOS. A partire da Windows 2000 Server, WSH supporta gli script creati manualmente
dagli utenti.
» È language-independent perché può far uso di JavaScript e VBScript (di default), ma l'utente può
decidere di installare diversi script engine (come Perl).
» Praticamente qualsiasi operazione eseguibile da Windows può essere automatizzata da WSH. È
uno strumento molto potente e versatile, ma proprio grazie alla sua potenza alcuni virus ne fanno
uso per diffondersi. Dunque, se non si utilizza intensamente questo linguaggio potrebbe essere
raccomandabile disattivarlo per motivi di sicurezza.
WSH: File Operations
» A differenza del VBA, le operazioni sui file non avvengono tramite istruzioni native del linguaggio
ma attraverso l’oggetto FileSystemObject.
» Scrittura su file:
» Recupero del path correntemente in uso
Clicca qui per aprire il file di esercitazione
ESEMPIO_2_4.XLSM
WSH: External Processes
» Possiamo utilizzare WSH da VBA per lanciare
processi esterni
» Utilizzeremo questo oggetto per realizzare una
semplice interazione fra VBA ed R
Clicca qui per aprire il file di esercitazione
ESEMPIO_2_5.XLSM
Fine Modulo Uno
Introduzione al VBA per Excel

More Related Content

PDF
Excel development e sql 3.9
PPTX
Excel development e sql 2.1
PPT
Lezione 1 - Introduzione al VBA per Excel
PPT
Informatica Base Excel
PPT
Linguaggio V.B.A.
PPT
Capitolo 2 elementi di programmazione in vba
PPTX
Excel development e sql 1.3
PDF
Lezione 11 - Vba E Excel
Excel development e sql 3.9
Excel development e sql 2.1
Lezione 1 - Introduzione al VBA per Excel
Informatica Base Excel
Linguaggio V.B.A.
Capitolo 2 elementi di programmazione in vba
Excel development e sql 1.3
Lezione 11 - Vba E Excel

What's hot (10)

PPT
DOC
(Ebook ita - inform - access) guida al database access (doc)
PPT
Data Base In Open Office
PDF
Access parte prima
PPT
Microsoft excel - didattica differenziata
PPT
Informatica - Excel Intermedio
PPT
Lezione 4 ogetti-vba
PPS
Database
ODP
Odg umbriafoglicalcolo
PDF
Open data e open source: come elaborare dati aperti
(Ebook ita - inform - access) guida al database access (doc)
Data Base In Open Office
Access parte prima
Microsoft excel - didattica differenziata
Informatica - Excel Intermedio
Lezione 4 ogetti-vba
Database
Odg umbriafoglicalcolo
Open data e open source: come elaborare dati aperti
Ad

Similar to Excel development e sql 1.7 (20)

PDF
DotNetToscana - Sessione TypeScript
PPT
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
PPT
Introduzione a JavaScript e jQuery (1/2)
PPTX
Introduzione a TypeScript
PPTX
Dot net framework 2
ODP
Office & VBA - Giorno 7
PPTX
Database Project in Visual Studio 2010
PPTX
Cert04 70-484 - essentials of developing windows store apps
PPT
Introduzione WPF
PPTX
3wCORE... il gestionale Web su misura per il tuo Business
PDF
Laravel Framework PHP
PDF
Domain Driven Design e CQRS
PPS
Esposizione RIA
PDF
AreaMVC: un'architettura software basata sulla semplicità
DOCX
Progettazione e realizzazione di una piattaforma middleware per la gestione a...
PDF
Progetto SOD Davide Sito
PPT
Tesi Discussione
DOCX
Sviluppo di un prototipo di interfaccia per la verbalizzazione degli esami on...
PDF
Idiomatic Domain Driven Design
PDF
e-SUAP - General software architecture (Italiano)
DotNetToscana - Sessione TypeScript
WPF & LINQ: VB T&T Community After Hour @ Microsoft Days 08
Introduzione a JavaScript e jQuery (1/2)
Introduzione a TypeScript
Dot net framework 2
Office & VBA - Giorno 7
Database Project in Visual Studio 2010
Cert04 70-484 - essentials of developing windows store apps
Introduzione WPF
3wCORE... il gestionale Web su misura per il tuo Business
Laravel Framework PHP
Domain Driven Design e CQRS
Esposizione RIA
AreaMVC: un'architettura software basata sulla semplicità
Progettazione e realizzazione di una piattaforma middleware per la gestione a...
Progetto SOD Davide Sito
Tesi Discussione
Sviluppo di un prototipo di interfaccia per la verbalizzazione degli esami on...
Idiomatic Domain Driven Design
e-SUAP - General software architecture (Italiano)
Ad

More from Giovanni Della Lunga (20)

PDF
Halloween Conference 2023 - Introduction to Deep Learning
PDF
Copule slides
PPTX
Introduction to python programming 2
PPTX
Introduction to python programming 1
PPTX
Cavalcando onde gravitazionali
PDF
Simulation methods finance_2
PDF
Simulation methods finance_1
PDF
Viaggi nel tempo [2015 01 24]
PDF
Universo lato oscuro
PPT
Metodi numerici
PDF
Breve intro caos
PDF
Fg esercizi 4
PPTX
2 magnetismo
PPTX
1 elettrostatica
PPTX
Fenomeni termici
PPTX
1 meccanica fluidi
PPTX
1 spazio tempo_movimento
PPTX
2 principi dinamica
PPTX
Halloween Conference 2023 - Introduction to Deep Learning
Copule slides
Introduction to python programming 2
Introduction to python programming 1
Cavalcando onde gravitazionali
Simulation methods finance_2
Simulation methods finance_1
Viaggi nel tempo [2015 01 24]
Universo lato oscuro
Metodi numerici
Breve intro caos
Fg esercizi 4
2 magnetismo
1 elettrostatica
Fenomeni termici
1 meccanica fluidi
1 spazio tempo_movimento
2 principi dinamica

Excel development e sql 1.7

  • 1. Management Analytics VBA per Excel Giovanni Della Lunga
  • 2. Agenda » Excel come Piattaforma di Sviluppo Excel può essere molto più di un semplice foglio di calcolo » Le Macro di Excel Come utilizzare il registratore di Macro per imparare il VBA » La Sintassi del Visual Basic Gli elementi base del linguaggio di programmazione » Gestire l’interazione con Excel Il modello ad oggetti di Excel ed il suo utilizzo con VBA
  • 3. Excel come Piattaforma di Sviluppo Excel può essere molto più di un semplice foglio di calcolo
  • 4. Excel come piattaforma di sviluppo » Microsoft Excel è molto più di un semplice spreadsheet. » A partire dall’introduzione dell’editor VBA con Excel 2007 fino ai recenti miglioramenti di stabilità e performance di Excel 2016, possiamo dire che tale applicativo è diventato un’interessante piattaforma di sviluppo per reporting e presentation oltre che per analisi preliminari di dati e test di procedure di calcolo.
  • 5. Excel come piattaforma di sviluppo » Se pensiamo ad Excel non come ad un semplice spreadsheet ma come una piattaforma di sviluppo, possiamo individuare almeno 4 idee fondamentali che possiamo utilizzare con successo nelle nostre applicazioni. Cartelle di lavoro come interfacce utente e presentation layer per data entry e reporting Cartelle di lavoro viste come linguaggio di programmazione «dichiarativo» Modello ad oggetti di Excel Ambiente di Sviluppo VBA
  • 6. Excel come piattaforma di sviluppo • Possiamo pensare i fogli di Excel come un sistema efficiente di interfaccia utente per data entry; • L’utilizzo delle proprietà di formattazione e validazione dei dati, tipici delle celle Excel, permette la realizzazione di interfacce di livello professionale con pochissimo sforzo; • Gli elementi grafici di Excel permettono altresì la realizzazione di eccellenti output per qualunque tipo di reporting; Cartelle di lavoro come interfacce utente e presentation layer per data entry e reporting
  • 7. Excel come piattaforma di sviluppo » Venduti = 1000 » Prezzo = 10.99 » Ricavato = Venduti * Prezzo » D1 = 1000 » D2 = 10.99 » D3 = D1 * D2 • Un foglio Excel è di fatto un linguaggio di programmazione di per se; • Invece di definire un insieme di operazioni che vengono eseguite linea per linea, noi «programmiamo» in questo linguaggio definendo una serie di dichiarazioni (scrivendo formule e inserendo valori nelle celle); D1 ha il valore 1000 D2 ha il valore 10.99 D3 è il prodotto di D1 per D2 Cartelle di lavoro viste come linguaggio di programmazione «dichiarativo»
  • 8. Excel come piattaforma di sviluppo • Quasi tutto quello che può essere fatto direttamente sui fogli Excel può essere riprodotto in VBA attraverso il ricco modello ad oggetti messo a disposizione dall’ambiente di programmazione Modello ad oggetti di Excel
  • 9. Excel come piattaforma di sviluppo • Il linguaggio di programmazione di Excel: VBA (Visual Basic for Application); • Condiviso da tutta la piattaforma MS Office; Le Macro di Excel L’Ambiente di Sviluppo La Sintassi del VBA Interagire con Excel
  • 10. Le Macro di Excel Come utilizzare il registratore di Macro per imparare il VBA
  • 11. Le prime due regole della programmazione »Prima regola della programmazione ▪ Scrivere meno codice possibile
  • 12. Le prime due regole della programmazione »Prima regola della programmazione ▪ Scrivere meno codice possibile »Seconda regola della programmazione ▪ Scrivere meno codice possibile
  • 13. Le Macro di Excel • La costruzione e l'organizzazione di strutture dati non banali tramite Excel può comportare l'esecuzione da parte dell'utente di una discreta mole di operazioni, spesso ripetitive. • In questi casi può essere estremamente utile ricorrere al registratore di macro che permette di memorizzare una sequenza di operazioni al fine di poterle successivamente ripetere a richiesta. • Il registratore macro di Excel memorizza le operazioni eseguite dall’utente registrando gli equivalenti comandi sotto forma di istruzioni in linguaggio Visual Basic. • per questo motivo il registratore di macro oltre ad essere un utilissimo aiuto nella normale operatività con Excel costituisce anche un formidabile strumento didattico per cominciare a muoversi con la sintassi VBA. 13
  • 14. Gestire i file che contengono codice VBA » Office 2013 (come già Office 2010 e 2007), dunque anche Excel 2013, distingue i file che contengono codice VBA dagli altri file con un’estensione e un’icona diverse; » I normali file di Excel hanno estensione .xlsx, mentre quelli che contengono codice VBA hanno estensione .xlsm. » Anche il formato di salvataggio è diverso. Quando salvate un file che contiene codice VBA (le porzioni di codice vengono definite Macro) occorre indicare a Excel che deve salvarlo usando il formato Cartella di lavoro con attivazione di macro di Excel;
  • 15. Le Macro di Excel 15
  • 16. Le Macro di Excel 16
  • 17. Le Macro di Excel • Oltre a vedere la macro in esecuzione è possibile esaminare il codice prodotto e farlo girare istruzione per istruzione. • Quest’attività oltre al chiaro valore didattico ha un enorme utilità ai fini del test dei programmi prodotti (debug). 17
  • 18. L’Ambiente di Sviluppo del VBA • Il Visual Basic dispone di un ambiente di sviluppo integrato (IDE) attraverso il quale è possibile non solo modificare le macro ma scrivere interi programmi; • L’editor è composto da una serie di finestre tramite le quali controllare le varie fasi di sviluppo e test dell’applicazione; 18 ⚫ Da Excel l’editor VBA può essere richiamato utilizzando la finestra VBA o premendo F11.
  • 19. Università dell'Insubria - C.d.L. in Banca & Finanza - A.A. 2004- 2005 19 GESTIONE PROGETTI. Questa sottofinestra contiene un diagramma ad albero delle cartelle di lavoro aperte e degli oggetti Excel in esse contenuti (oggetti, moduli, riferimenti, form e così via). Si userà la finestra gestione progetti per navigare fra i vari moduli ed altri oggetti di un progetto VBA FINESTRA PROPRIETA’. In questa finestra compare un elenco di tutte le proprietà dell’oggetto attualmente selezionato. FINESTRA DEL CODICE. La finestra del codice è quella in cui si può esaminare, modificare o creare ex-novo il codice sorgente VBA. Questa finestra viene usata per scrivere nuove macro o per editare macro esistenti. FINESTRA IMMEDIATA. In questa finestra è possibile inserire comandi diretti per la visualizzazione del valore assunto dalle variabili (usata in fase di debug) FINESTRA CONTROLLO. Consente il monitoraggio del contenuto di una variabile o dei valori generati da un’espressione (usata in fase di debug). Identifica un progetto VBA ovvero un insieme di oggetti e il nome fra parentesi è il nome della cartella in cui esso è memorizzato (in questo caso Cartel1); Identifica un oggetto di tipo foglio di lavoro contenuto nella cartella il cui nome appare fra parentesi; tutti i fogli di lavoro appaiono identificati dalla parola Foglio seguita da un numero, ma è importante non confonderlo con il nome che appare sul cavalierino nella finestra di Excel e che nella finestra Progetto appare fra parentesi; per ogni foglio di lavoro presente nella cartella sono presenti altrettante voci. Indica la cartella
  • 20. Università dell'Insubria - C.d.L. in Banca & Finanza - A.A. 2004- 2005 20
  • 21. Università dell'Insubria - C.d.L. in Banca & Finanza - A.A. 2004- 2005 21
  • 22. Università dell'Insubria - C.d.L. in Banca & Finanza - A.A. 2004- 2005 22 ⚫ Un modulo è concettualmente simile ad un documento al cui interno si inseriscono i programmi o una loro parte. ⚫ La suddivisione di un programma su più moduli spesso è dovuta alla volontà del programmatore di suddividere su più parti il programma dividendolo con concetti di omogeneità; ⚫ per esempio si può avere un modulo con tutte le funzioni create che eseguono i calcoli finanziari… ⚫ …un altro con le routine che gestiscono l’accesso al database… ⚫ …un altro con le funzioni create ad uso generale come quelle che eseguono particolari elaborazioni sul testo mentre… ⚫ …un altro modulo contiene le routine principali del programma che richiamano quelle contenute negli altri moduli.
  • 23. La Sintassi del Visual Basic Gli elementi base del linguaggio di programmazione
  • 24. La Sintassi del VBA • Il Visual Basic deriva la sua sintassi dal vecchio linguaggio basic; • Nel corso del tempo molte nuove strutture sintattiche sono state aggiunte al linguaggio trasformandolo in qualcosa di molto diverso rispetto all’originale; • In questa parte vedremo la componente convenzionale del linguaggio cioè le istruzioni base per la gestione del flusso del programma, i principali tipi di dato gestiti e la costruzione di procedure; • Nella prossima sezione vedremo la parte più innovativa di questo linguaggio e cioè la componente di interazione con Excel realizzata tramite componenti di programmazione orientata agli oggetti. 24
  • 25. Variabili eTipi di Dato Operatori Istruzioni di Controllo StruttureDati Procedure: Funzionie Subroutine La Sintassi del VBA
  • 26. La Sintassi del VBA: Tipi di Dato e Operatori • Anche Visual Basic, come tutti i linguaggi di programmazione, prevede l'uso delle variabili, mediante le quali è possibile memorizzare dei valori testuali o numerici in strutture a cui il programma può accedere grazie a un nome assegnato loro in fase di creazione. • Visibilità. Una variabile è detta locale quando è definita all'interno di una procedura; • Tipo. La sua creazione avviene quando si fa riferimento ad essa per la prima volta, oppure quando è eseguita l'istruzione Dim, che presenta la seguente sintassi: • Dim <nome> [As <tipo>] 26
  • 27. La Sintassi del VBA: Tipi di Dato e Operatori • Naming Convention • Una buona convenzione nella definizione del nome delle variabili dovrebbe permettere di dedurre dal nome della variabile: • Il livello di visibilita • Il tipo del dato • Se si tratta di un vettore o di uno scalare • Es. Scope Specifier ▪ g – Public ▪ m – Module Level 27
  • 28. La Sintassi del VBA: Tipi di Dato e Operatori • Tipi Numerici ▪ Il Visual Basic fornisce per la gestione dei valori numerici varie possibilità che vanno di volta in volta scelte in accordo con il genere di informazione che deve essere memorizzata. ▪ A prima vista potrebbe apparire più comodo impiegare tipi generici che vadano bene per qualunque occasione come il Double ma in realtà è sconsigliabile per vari motivi, soprattutto perché i tipi che supportano la parte decimale vengono elaborati ad una velocità inferiore a quella dei tipi che non la gestiscono quali i tipi Integer o Long. 28 Dim liThisNumber as Integer Dim lsngThisNumber as Single liThisNumber = 5 lsngThisNumber = 4.5
  • 29. La Sintassi del VBA: Tipi di Dato e Operatori » Operatori Matematici » Gli operatori matematici sono quelli che indicano le principali operazioni matematiche e sono: ▪ + : addizione ▪ - : sottrazione ▪ * : moltiplicazione ▪ / : divisione ▪ : divisione con restituzione della sola parte intera ▪ ^ : elevazione a potenza ▪ Sqr : radice quadrata ▪ mod : resto di una divisione 29
  • 30. La Sintassi del VBA: Tipi di Dato e Operatori • Tipo di dati in Excel: ▪ Dati Numerici ▪ Dalle Impostazioni internazionali nel pannello di controllo modificare ▪ Per visualizzare i numeri in notazione scientifica ovvero 2.3 e non 2,3 ▪ Inoltre direttamente in excel (menu Formato, Celle) è possibile scegliere il tipo di notazione numerica. 30
  • 31. La Sintassi del VBA: Tipi di Dato e Operatori • Stringhe ▪ Per memorizzare dati testuali quali nomi, indirizzi, annotazioni o altro si ricorre al tipo String. ▪ Facendo seguire la parola chiave String da un asterisco e un numero è possibile predeterminare una lunghezza per le stringhe in modo che il valore in esse inserito ▪ se eccede la dimensione prevista venga troncato ▪ se è inferiore vengano automaticamente inseriti degli spazi fino a raggiungere la lunghezza definita. 31 • Dim lsMyName as String • lsMyName = “Giovanni”
  • 32. Esercitazione • Esempi di elaborazione di stringhe ▪ Elementi noti : ▪ dichiarazione variabili ▪ Apprendimento: ▪ Funzioni elaborazione stringhe ▪ Anticipazione: ▪ Interazione con oggetti di Excel ▪ Procedure in vba ▪ Array dinamici in VBA e funzioni connesse ▪ Cicli For 32 Clicca qui per aprire il file di esercitazione ESEMPIO_1_1.XLSM
  • 33. Esercitazione 33 Public Sub esempio_1_stringhe() ' dichiarazione variabili Dim lsNomeFileCompleto As String Dim lsNomeFileSenzaExt As String Dim lsEstensioneFile As String Dim n As Integer ' recuperiamo il nome file completo utilizzando ' l'oggetto Workbook di Excel lsNomeFileCompleto = ActiveWorkbook.Name Debug.Print lsNomeFileCompleto ' ricerchiamo la posizione del punto nel nome completo ' utilizzando la funzione InStr(). Si noti che il carattere ' . (punto) deve essere compreso fra doppi apici... n = InStr(lsNomeFileCompleto, ".") Debug.Print n (continua) Si noti l’intestazione della procedura Sezione dichiarativa NomeOggetto.Proprietà Funzione InStr()
  • 34. Esercitazione 34 ' recuperiamo il nome del file privo di estensione cercando ' la sub-stringa composta da n - 1 caratteri che si trova ' a sinistra del punto. Notare che per evitare di prendere ' anche il punto di separazione, dobbiamo ' indicare alla funzione Left() di prendere soltanto n - 1 caratteri ' a sinistra del nome completo del file... lsNomeFileSenzaExt = Left(lsNomeFileCompleto, n - 1) Debug.Print lsNomeFileSenzaExt ' possiamo anche ricavare l'estensione del file utilizzando la ' funzione Right() che restituisce un numero specifico di ' caratteri di una stringa partendo da destra (ovvero dalla fine ' della string). In questo caso utilizzeremo anche la funzione ' Len() che restituisce il numero complessivo di caratteri di una ' stringa, infatti il numero di caratteri che compongono ‘ l'estensione sono gli ultimi Len() - n caratteri... lsEstensioneFile = Right(lsNomeFileCompleto, Len(lsNomeFileCompleto) - n) Debug.Print lsEstensioneFile ' ricombiniamo insieme le due informazioni con l'operatore di concatenazione ' di stringhe "&" Debug.Print lsNomeFileSenzaExt & "." & lsEstensioneFile End Sub Funzione Left() Funzione Right() Funzione Len() Op. Concatenazione : &
  • 35. La Sintassi del VBA: Tipi di Dato e Operatori • Date ▪ Il VBA usa il tipo dati Date per memorizzare data e ora. Il tipo Date utilizza 8 byte di memoria per ogni combinazione di data/ora. ▪ Per assegnare un valore ad una variabile di tipo Date mediante un’istruzione, si deve ricorrere ad una sintassi particolare che prevede il racchiudere la data tra una coppia di caratteri #. 35 Per esempio il 31 dicembre 2016 può essere rappresentato come illustrato Dim gdteSanSilvestro as Date gdteSanSilvestro = #31/12/2016#
  • 36. Function IsBisestile(Data As Date) As Boolean If (Year(Date) Mod 100 <> 0 And Year(Date) Mod 4 = 0) Or _ (Year(Date) Mod 100 = 0 And Year(Date) Mod 400 = 0) Then IsBisestile = True Else IsBisestile = False End If End Function Funzioni Speciali Gestione delle Date Year(). ▪ Questa funzione restituisce in output un numero intero (di tipo Integer) che contiene l’anno estratto da una data che riceve come parametro di input. ▪ Nel riquadro seguente vediamo un esempio di impiego della funzione Year. Supponiamo di voler costruire una funzione che prenda come parametro di input una data e che restituisca un valore logico vero o falso a seconda che l’anno della data sia o meno bisestile. 36
  • 37. Function GiorniMese(Data As Date) As Integer Select Case Month(Data) Case 1, 3, 5, 7, 8, 10, 12 GiorniMese = 31 Case 4, 6, 9, 11 GiorniMese = 30 Case 2 If IsBisestile(Data) Then GiorniMese = 29 Else GiorniMese = 28 End If End Select End Function Funzioni Speciali Gestione delle Date » Month(). ▪ Questa funzione permette di estrarre il numero del mese da una data che riceve come parametro di input e restituisce tale valore in formato Integer. ▪ Nel seguente esempio di codice abbiamo scritto una semplice funzione che restituisce il numero di giorni del mese a cui appartiene la data passata come parametro alla funzione stessa. 37
  • 38. Funzioni Speciali Gestione delle Date » Day() ▪ La funzione Day() permette di estrarre il numero del giorno da una data che riceve come parametro. Tale valore viene restituito come al solito in formato Integer. » Weekday() ▪ Questa funzione permette di ottenere un numero di tipo Integer che indica il giorno della settimana relativo alla data ricevuta in input. I giorni vengono rappresentati secondo il valore della tabella sottostante dove sono indicate le relative costanti 38 Giorno Costante VBA Domenica vbSunday Lunedì vbMonday Martedì vbTuesday Mercoledì vbWednesday Giovedì vbThursday Venerdì vbFriday Sabato vbSaturday
  • 39. Funzioni Speciali Gestione delle Date » DateAdd(). ▪ Restituisce un valore Variant (Date) contenente una data alla quale è stato aggiunto un intervallo di tempo specificato. La sintassi di questa funzione è la seguente DateAdd(intervallo, numero, data) ▪ dove ▪ intervallo è un’espressione di tipo stringa corrispondente all'intervallo di tempo che si desidera aggiungere, ▪ numero è un’ espressione numerica corrispondente al numero di intervalli da aggiungere (può essere positiva, per ottenere date future, oppure negativa, per ottenere date passate), ▪ data, infine, rappresenta un valore di tipo data o di tipo stringa che rappresenta una data a cui viene aggiunto l'intervallo. 39
  • 40. Funzioni Speciali Gestione delle Date » DateDiff(). ▪ Restituisce un valore Variant(Long) corrispondente al numero di intervalli di tempo tra due date specificate. La sintassi della funzione DateDiff è la seguente DateDiff(intervallo, data1, data2) dove ▪ intervallo è un’espressione di tipo stringa corrispondente all'intervallo di tempo utilizzato per calcolare la differenza tra data1 e data2. ▪ È possibile utilizzare la funzione DateDiff per determinare quanti intervalli di tempo specificati esistono tra due date. ▪ Ad esempio possiamo utilizzare DateDiff per calcolare il numero di giorni che intercorrono tra due date oppure il numero di settimane tra la data odierna e la fine dell'anno. 40
  • 41. Esercitazione »Esempi di elaborazione di date ▪ Elementi noti : ▪ dichiarazione variabili ▪ Apprendimento: ▪ Funzioni Analisi Date ▪ Anticipazione: ▪ Istruzioni Condizionali ▪ Ciclo For ▪ Funzioni in VBA ▪ Interazione con Foglio Excel 41 Clicca qui per aprire il file di esercitazione ESEMPIO_1_2.XLSM
  • 42. La Sintassi del VBA: Tipi di Dato e Operatori » Operatore di Assegnazione ▪ L’operatore di assegnazione coincide graficamente con l’operatore di confronto di uguaglianza. Ciò non causa generalmente nessuna confusione nel programmatore che si abitua con una certa rapidità a riconoscerli e distinguerli nel loro significato. ▪ L’unico aspetto che lascia momentaneamente confusi chi non ha mai avuto esperienze di sviluppo software è proprio il carattere uguale come operatore di assegnazione in quanto si tende a considerare l’uguale un’asserzione di uguaglianza fra il valore posto alla sua destra e quello posto alla sua sinistra ▪ INCREMENTO DI UNA VARIABILE : a = a + 1 42
  • 43. La Sintassi del VBA: Tipi di Dato e Operatori Operatori di Confronto 43 Operatore Simbolo Esempio Applicabile a Minore < A < B qualunque Minore o uguale <= A <= B qualunque Uguale = A = B qualunque Diverso <> A <> B qualunque Maggiore > A > B qualunque Maggiore o uguale >= A >= B qualunque Identico tipo Is A Is B Object Analisi per criteri Like A Like B String
  • 44. La Sintassi del VBA: Istruzioni di Controllo » Il flusso di Controllo ▪ Sequenziale ▪ Condizionale ▪ Iterativo ▪ Determinato ▪ Condizionalo 44
  • 45. La Sintassi del VBA: Istruzioni di Controllo Condizionale » La condizione IF ▪ Il flusso delle istruzioni all'interno della procedura non è necessariamente rigidamente definito, ma può variare in base al verificarsi di alcune condizioni. ▪ Il programma deve pertanto essere in grado di prendere delle decisioni. ▪ Come la quasi totalità dei linguaggi di programmazione, Visual Basic prevede a tal fine la struttura If, caratterizzata dalla seguente sintassi: If <condizione> Then <istruzioni da eseguire se la condizione è vera> [Else <istruzioni da eseguire se la condizione è falsa>] End If 45
  • 46. La Sintassi del VBA: Istruzioni di Controllo Condizionale » La condizione può essere rappresentata da pressoché qualsiasi espressione booleana. ▪ Si ricorda che un'espressione è così detta se può assumere solo due valori distinti, cioè vero o falso. » Se essa è verificata, l'interprete esegue il blocco di istruzioni indicato fra le parole chiave Then e Else. In caso contrario, è eseguito il secondo gruppo di comandi. Si noti che quest'ultimo può anche essere assente. In tal caso, la parola chiave Else non va utilizzata e non è eseguito alcun codice in caso di mancata verifica della condizione. » La frase End If delimita la struttura. Tutte le istruzioni che la seguono sono eseguite in modo indipendente dal valore dell'espressione booleana. 46
  • 47. La Sintassi del VBA: Istruzioni di Controllo Condizionale » La struttura Select Case ▪ E’ possibile ricorrere ad una diversa struttura di controllo denominata Select Case, la cui sintassi è la seguente: Select Case <variabile> Case <valore 1>: <blocco istruzioni 1> [Case <valore 2>: <blocco istruzioni 2>] .. [Case <valore n>: <blocco istruzioni n>] [Case Else: <istruzioni da eseguire se tutti i confronti falliscono>] End Select 47
  • 48. La Sintassi del VBA: Istruzioni di Controllo Condizionale » Gli operatori logici elementari » Si ipotizzi di voler scrivere una struttura If per verificare se il valore di una variabile numerica intera, denominata n, appartiene all'intervallo compreso fra 10 e 100. È necessario valutare contemporaneamente due condizioni: n deve essere maggiore di 10 E minore di 100 » Per far sì che sia prodotta una stringa indicante l'esito del confronto, occorre digitare il seguente codice: If Numero > 10 then If Numero < 100 then Testo = "Il numero è compreso fra 10 e 100" Else Testo = "Il numero non appartiene all'intervallo" End if End if 48
  • 49. La Sintassi del VBA: Istruzioni di Controllo Condizionale » L'operatore And » Spesso si rivela necessario valutare la contemporanea validità di due o più condizioni. » È il caso dell'esempio precedente, in cui si desidera verificare se la variabile Numero contiene un valore maggiore di 10 e nel contempo minore di 100. » L'operatore And assolve questo compito, restituendo il valore logico True solo se le condizioni a cui è applicato sono contemporaneamente verificate. Il codice può pertanto essere riscritto come segue: If (Numero > 10) AND (Numero < 100) Then Testo = "Il numero è compreso fra 10 e 100" Else Testo = "Il numero non appartiene all'intervallo" End if » Come è possibile notare, la struttura risulta più semplice, in quanto composta da un solo livello. 49
  • 50. La Sintassi del VBA: Istruzioni di Controllo Condizionale » L'operatore Or » A differenza del precedente, l'operatore Or restituisce il valore logico True se almeno una delle condizioni specificate è vera. Ad esempio, la condizione ▪ (Numero = 5) OR (Numero > 11) è verificata quando la variabile Numero assume un valore maggiore di 11 o uguale a 5. 50
  • 51. La Sintassi del VBA: Istruzioni di Controllo Condizionale » L'operatore Not » Un altro utile operatore logico è quello di negazione (Not). » Come è facile dedurre, esso restituisce il valore True se la condizione a cui è applicato non è verificata, mentre restituisce False in caso contrario. » A titolo di esempio, si supponga di voler realizzare una struttura If in grado di generare una stringa indicante se il valore della variabile Numero risulta contemporaneamente diverso da 5 e da 10. Il codice da digitare è il seguente: If NOT ((Numero = 5) Or (Numero = 10)) Then Testo = "Il numero è diverso da 5 e da 10" End if » Si noti la connessione con l’operatore And If Numero <> 5 And Numero <> 10 Then Testo = "Il numero è diverso da 5 e da 10" End if 51
  • 52. La Sintassi del VBA: Istruzioni di Controllo Iterativo Il ciclo For » Si supponga di voler realizzare un programma in grado di calcolare il fattoriale di un numero, ovvero il prodotto di tutti i valori interi positivi minori o uguali ad esso. » Gli strumenti illustrati fino a questo punto non si rivelano sufficienti a tal fine, in quanto è necessaria la capacità di ripetere per un numero variabile di volte l'operazione di moltiplicazione. » Si impone pertanto il ricorso alle strutture di iterazione. » Nel caso dell'esempio, occorre applicare la moltiplicazione a tutti i numeri naturali minori o uguali a quello di cui si desidera calcolare il fattoriale. » Appare così evidente la necessità di disporre di una struttura in grado di permettere la ripetizione di una porzione di codice per un numero finito di volte. 52
  • 53. La Sintassi del VBA: Istruzioni di Controllo Iterativo » Si tratta della classica struttura For, che nel caso di Visual Basic è caratterizzata dalla seguente sintassi: For <contatore> = <inizio> To <fine> [Step <passo>] <istruzione 1> ... <istruzione n> Next [<contatore>] » Dopo la parola chiave For è necessario far seguire una variabile intera, che funge da contatore. » Il suo valore è incrementato ad ogni ripetizione di un numero di unità pari a quello specificato dopo la parola chiave Step, fino al raggiungimento del valore finale; » questa condizione determina la fine delle iterazioni e il passaggio all'istruzione seguente la parola riservata Next. 53
  • 54. La Sintassi del VBA: Istruzioni di Controllo Iterativo Il ciclo While » Una diversa esigenza è quella soddisfatta dall'uso del ciclo While, che permette la ripetizione di un segmento di codice per tutto il tempo in cui una condizione risulta vera. La sua sintassi è la seguente: While <condizione> <istruzione 1> <istruzione 2> ... <istruzione n> Wend » Le istruzioni comprese fra le parole chiave While e Wend sono ripetute per un numero di volte non stabilito rigidamente a priori, bensì dipendente dalle stesse istruzioni, che devono essere in grado di fare in modo che la condizione ad un certo punto smetta di verificarsi. In caso contrario, si incappa in un errore molto diffuso fra i programmatori alle prime armi, ovvero si crea ciò che è usualmente detto ciclo infinito. 54
  • 55. La Sintassi del VBA: Istruzioni di Controllo Iterativo Le parole chiave Do e Loop » Il ciclo While può anche essere descritto in modo più elegante per mezzo delle parole chiave Do e Loop. In questo caso la sintassi diventa: Do While <condizione> <istruzione 1> <istruzione 2> ... <istruzione n> Loop » Il comportamento è analogo a quello visto in precedenza: le istruzioni contenute all'interno della struttura sono ripetute fintanto che la condizione indicata accanto alla parola While si verifica. 55
  • 56. La Sintassi del VBA: Istruzioni di Controllo Iterativo Il ciclo Do Until » Pressoché analogo è il ciclo Do Until, caratterizzato dalla seguente sintassi: Do Until <condizione> <istruzione 1> <istruzione 2> ... <istruzione n> Loop » In questo caso, le iterazioni avvengono quando la condizione è falsa e terminano quando essa si avvera. 56
  • 57. Esercitazione »Esempi di Cicli Condizionali e Non ▪ Elementi noti : ▪ Istruzioni Condizionali ▪ Cicli condizionali ▪ Cicli determinati ▪ Apprendimento: ▪ Funzioni per analisi di alberi di cartelle e files ▪ Anticipazione: ▪ interazione con oggetti di Excel ▪ Procedure in vba 57 Clicca qui per aprire il file di esercitazione ESEMPIO_1_3.XLSM
  • 58. La Sintassi del VBA: Vettori e Matrici » Gli array contengono dati omogenei, tipicamente si considerano array a una e due dimensioni ai quali ci riferiremo come di comune coi termini “vettore” e “matrice”. La dichiarazione di un vettore o di una matrice deve essere accompagnata dal numero di elementi. » Esempio: ▪ Dim myVector(20) as Double ▪ Dim myMatrix(10,10) as Integer » Nel primo caso abbiamo definito un vettore che contiene numeri in doppia precisione di 20 elementi, nel secondo abbiamo una matrice 10 x 10 di interi. 58
  • 59. La Sintassi del VBA: Vettori e Matrici » Descriviamo anche la sintassi in forma generica Dim NomeVariabile ([Indici]) [As Tipo] La sezione indici ha la seguente sintassi [minimo to] massimo [, [minimo to] massimo] che cosa vuol dire? E’ semplice, prima di tutto ricordiamo che tutto quello che si trova tra parentesi quadre è opzionale, quindi è possibile dimensionare un vettore sia scrivendo Dim myVector(20) As Double Sia scrivendo Dim myVector(1 to 10) As Double 59
  • 60. La Sintassi del VBA: Vettori e Matrici » In maniera analoga entrambe le dichiarazioni sono valide Dim myMatrix(10,10) As Integer Dim myMatrix(1 to 10, 1 to 10) As Integer » Notate che è richiesto solo il limite superiore; l’indicazione del valore minimo per l’indice è opzionale. Se si specifica solo il limite superiore il VBA numera gli elementi dell’array coerentemente con l’impostazione Option Base. » Questa è una direttiva al compilatore che specifica se si desidera che gli indici degli array partano da 0 o da 1. La sintassi è la seguente Option Base 0 | 1 » In mancanza di questa istruzione l’interprete VBA fa partire la numerazione degli array da 0. 60
  • 61. La Sintassi del VBA: Vettori e Matrici » Il riferimento ad un generico elemento all’interno di un vettore o di una matrice avviene specificando l’indice all’interno di parentesi. » Esempio: a = myVector(5) b = myMatrix(7,6) » Nel primo caso alla variabile a viene assegnato il valore del 5° elemento del vettore myVector, nel secondo b è posto uguale all’elemento di matrice posto nella 7a riga, 6a colonna 61 » In maniera analoga, ogni volta che si intende attribuire un valore ad un certo elemento di un array occorre specificare l’indice relativo. Ad esempio MyVector(7) = 8.9
  • 62. La Sintassi del VBA: Vettori e Matrici » Possono presentarsi delle situazioni in cui non è possibile o semplicemente non è conveniente fissare a priori il numero di elementi di un array cioè la sua dimensione. » L’uso di un array dinamico al posto di uno statico risolve questo problema in quanto un array dinamico può essere esteso o ridotto secondo le necessità. » Un array dinamico viene dichiarato tale facendo seguire la parola chiave ReDim e indicando il numero di elementi del vettore con una variabile (che deve essere comunque definita al momento dell’esecuzione dell’istruzione di dimensionamento) ReDim Scadenze(n) As Date ReDim Flussi(m) As Currency ReDim Matrice(k) As Double 62
  • 63. La Sintassi del VBA: Vettori e Matrici » E’ possibile anche ridimensionare un array preservandone il contenuto. A tale scopo è necessario usare la clausola Preserve che va posta subito dopo la parola chiave ReDim, ad esempio ReDim Preserve Vettore(n) As Single » Nel caso di un array multidimensionale, tuttavia, quando si usa la parola chiave Preserve si può modificare soltanto l’ultima dimensione. 63
  • 64. La Sintassi del VBA: Vettori e Matrici » Per riuscire a tenere traccia delle dimenzioni di array siano essi statici o dinamici il VBA prevede due funzioni, LBound e UBound, che restituiscono il valore minimo e massimo per gli indici di un array. La sintassi generica per queste funzioni è LBound(NomeArray [, dimensione]) UBound(NomeArray [, dimensione]) » dimensione è un numero intero che specifica per quale dimensione dell’array si vuole ottenere il limite minimo o massimo. Se non viene specificato VBA restituisce l’estremo relativo alla prima dimensione dell’array. 64
  • 65. » Spesso i dati possono essere aggregati in modo da avere variabili che contengono al loro interno altre variabili. » Ad esempio possiamo definire una variabile TitoloFinanziario che contiene al suo interno gli attributi che caratterizzano questo tipo di oggetto. » L’istruzione Type serve a questo scopo Type TitoloFinanziario Descrizione as String Prezzo as Double Volatilità as Double End Type Tipi definiti dall’utente
  • 66. » Possiamo così dichiarare una nuova variabile, ad esempio un’azione come un generico titolo Dim Azione As TitoloFinanziario » E’ possibile accedere ai singoli attributi del titolo (campi) con la seguente sintassi PrezzoDelTitolo = Azione.Prezzo Tipi definiti dall’utente
  • 67. » L’istruzione With può essere applicata in vari contesti per migliorare la leggibilità di istruzioni che operino sullo stesso oggetto. » Essa permette di riportare un’unica volta il nome dell’oggetto e sulle righe successive abbreviare quest’ultimo con il carattere punto. » Esempio: With Azione PrezzoAzione = .Prezzo DescAzione = .Descrizione VolAzione = .Volatilità End With Tipi definiti dall’utente
  • 68. La Sintassi del VBA: Procedure » Una procedura è una frazione di codice che esegue un determinato compito il più possibile elementare; » Con Visual Basic è possibile creare due tipi di procedure: ▪ procedure di tipo Sub (SUBROUTINE) ▪ procedure di tipo Function. (FUNZIONI) » A differenza di altri linguaggi il Visual Basic distingue nettamente queste due diverse tipologie di procedura; 68
  • 69. La Sintassi del VBA: Procedure » Una procedura Function è un’unità di codice racchiusa fra le istruzioni Function e End Function. » Come una procedura Sub una procedura Function esegue un preciso compito. A differenza della procedura Sub tuttavia essa restituisce anche un valore. » Esempio Function CalcolaQuadrato(x as Double) as Double CalcolaQuadrato = x*x End Function 69
  • 70. » Ritorno di valori da una procedura Function ▪ Di solito lo scopo di una funzione è quello di eseguire alcuni calcoli o delle operazioni specifiche su un insieme di dati e di restituire il risultato di queste operazioni. ▪ All’interno del corpo della funzione la riga Nome = Espressione rappresenta l’assegnamento della funzione. ▪ Perché una funzione restituisca un valore essa deve sempre includere un’istruzione che assegni un valore al nome della funzione. ▪ Nella sintassi del Visual Basic questo si ottiene assegnando il valore che si vuole restituire al programma chiamante ad una variabile fittizia che ha lo stesso nome della funzione ma che non viene dichiarata in alcun luogo. La Sintassi del VBA: Procedure
  • 71. La Sintassi del VBA: Procedure » Una procedura Sub (subroutine) è un’unità di codice racchiusa fra le istruzioni Sub … End Sub. » La procedura di tipo subroutine esegue un compito ma non restituisce alcun valore. » Esempio Sub CalcolaQuadrato(x as Double, res as Double) res = x * x End Sub 71 » Le funzioni e le subroutine possono prendere in input dei parametri (detti argomenti della funzione). » Questi parametri sono dei valori che la funzione o la subroutine riceve per la propria elaborazione e sono indicati fra le parentesi tonde nella riga di dichiarazione della funzione.
  • 72. La Sintassi del VBA: Procedure 72 Public Sub ProceduraSub() MsgBox “Questa procedura è una subroutine” End Sub Public Function ProceduraFun() As String ProceduraFun = “La procedura che ha generato _ questo risultato è una funzione” End Function
  • 73. » Ci sono diverse circostanze in cui può essere utile scrivere una funzione in cui il numero di parametri da richiedere all’utente non sia rigidamente prefissato. ▪ Nel caso delle funzioni predefinite del Visual Basic, ad esempio, questa circostanza più che l’eccezione rappresenta quasi la regola. Pensiamo ad una funzione VBA nativa come InputBox che richiede in generale sette parametri ma che può essere richiamata con un solo parametro, il messaggio che compare nella finestra di dialogo, essendo gli altri sei opzionali. » Per creare parametri di questo tipo, ovverosia parametri che possono essere inseriti oppure omessi in relazione alle diverse esigenze, si utilizza la parola chiave Optional che va anteposta ad ognuno di essi nella dichiarazione della funzione. ▪ Per esempio potremmo voler scrivere una funzione che calcola il tasso di interesse che possa essere utilizzata sia indicando il numero di pagamenti effettuati nel corso dell’anno (variabile m) sia indicando semplicemente il valore iniziale e finale del capitale. Procedure: Parametri Opzionali
  • 74. » E’ facile scrivere una semplice funzione che calcola il tasso di interesse nominale su base annua in funzione del numero di pagamenti. Indichiamo con ▪ V0 il valore del capitale iniziale; ▪ V1 il valore del capitale al termine dell’anno; ▪ m il numero di pagamenti effettuati nell’arco temporale considerato (un anno); Public Function InteresseBase_1(V1 As Single, _ V0 As Single, _ Optional m As Variant) As Single If IsMissing(m) Then MsgBox "Il calcolo viene effettuato ipotizzando un solo pagamento", _ vbInformation + vbOKOnly, "Attenzione!" m = 1 End If InteresseBase_1 = m * ((V1 / V0) ^ (1 / m) - 1) End Function Procedure: Parametri Opzionali
  • 75. » La comparsa della finestra di dialogo che richiama la nostra attenzione sul fatto che il calcolo è stato eseguito col valore predefinito di m è resa possibile dalla funzione nativa IsMissing. ▪ La funzione IsMissing viene utilizzata per determinare se un argomento Variant facoltativo è stato specificato nella chiamata di una routine. » IsMissing restituisce il valore logico True se nessun valore è stato passato per l'argomento specificato, in caso contrario restituisce False. ▪ Nel nostro caso se l’utente non attribuisce esplicitamente un valore al parametro m la funzione la funzione IsMissing viene utilizzata per definire questo parametro pari a 1 e, nel contempo, avvisare l’utente della scelta implicitamente compiuta. Procedure: Parametri Opzionali
  • 76. » Notate che il parametro m è stato esplicitamente dichiarato come Variant. ▪ Questo perché la funzione IsMissing non può essere utilizzata per tipi di dati semplici quali Integer o Double poiché, a differenza dei tipi di dati Variant, per tali tipi di dati non è disponibile un bit per il flag "mancante". » Tuttavia definire tipi di dati Variant può risultare oneroso, per questo nella sintassi degli argomenti facoltativi è possibile specificare un valore predefinito. Public Function InteresseBase_2(V1 As Single, _ V0 As Single, _ Optional m As Integer = 1) As Single If m = 1 Then MsgBox "Il calcolo viene effettuato ipotizzando un solo pagamento", _ vbInformation + vbOKOnly, "Attenzione!" End If InteresseBase_2 = m * ((V1 / V0) ^ (1 / m) - 1) End Function Procedure: Parametri Opzionali
  • 77. L’angolo di Sheldon »Cenni sulla gestione della memoria »Passaggio per valore e per riferimento 77
  • 78. La gestione della memoria (cenni) » La memoria di un computer può essere immaginata come una sequenza di locazioni ciascuna delle quali composta da 8 bit (1 Byte). » Una locazione è caratterizzata da due proprietà: ▪ il suo contenuto ▪ il suo indirizzo » Il contenuto di una locazione di memoria è il valore del Byte (che può essere la codifica di un carattere oppure una parte di una variabile). » L’ indirizzo invece è un identificatore univoco che permette di riferirsi a quella specifica locazione di memoria.
  • 79. » La richiesta al sistema operativo di una locazione per memorizzare una variabile è detta dichiarazione o allocazione di variabile. » Il risultato di questa operazione è l’assegnamento da parte del sistema operativo di un indirizzo nello spazio di indirizzamento del vostro processo al quale corrisponde la variabile dichiarata. La gestione della memoria (cenni)
  • 80. Procedure »Passaggio parametri per valore e per riferimento ▪ Il passaggio per valore consente alla routine di accedere a una copia della variabile; di conseguenza, il valore effettivo della variabile non può essere modificato dalla routine alla quale viene passato. ▪ Viceversa, il passaggio per riferimento consente alla routine di accedere alla variabile effettiva, quindi il suo valore può essere modificato dalla routine alla quale viene passato e la modifica ha valore anche al di fuori della routine stessa. ▪ Se non diversamente specificato, gli argomenti di una routine in VBA vengono passati per riferimento. ▪ Questo comportamento è opposto alla maggior parte dei linguaggi di alto livello e se non compreso può portare a comportamenti anomali del codice difficilmente individuabili.
  • 81. Procedure »Passaggio parametri per valore e per riferimento ▪ Il meccanismo di default può essere tuttavia modificato utilizzando le parole chiave ByVal e ByRef; »Quando passare un argomento per valore ▪ Se l'elemento di codice chiamante sottostante all'argomento non deve modificare le variabili passate in input, dichiarare i parametri corrispondenti ByVal. Solo il codice chiamante può modificare il valore di un elemento modificabile passato per valore. »Quando un argomento venga passato per riferimento ▪ Se la procedura richiede la modifica dell'elemento sottostante nel codice chiamante, dichiarare il parametro corrispondente ByRef. Clicca qui per aprire il file di esercitazione ESEMPIO_1_3.XLSM
  • 82. Il Modello ad Oggetti di Excel L’interazione con i fogli di calcolo
  • 83. Gestire l’Interazione con Excel » Le caratteristiche sintattiche del VBA viste fino a questo punto riguardano tecniche di programmazione convenzionale; » Il punto realmente innovativo del VBA consiste nella possibilità di interagire dinamicamente con i dati presenti nei foglio Excel » Un’applicazione VBA per Excel si caratterizza quindi a livello progettuale distinguendo chiaramente tre fasi ▪ INPUT – in questa fase si raccolgono i dati necessari all’elaborazione da uno o più fogli Excel, eventualmente si possono raccogliere altri dati utilizzando la funzione InputBox o appositi form costruiti dall’utente (vedi oltre); ▪ ELABORAZIONE – questa è la parte di calcolo convenzionale all’interno della quale possono essere presenti anche procedure di elaborazione dati realizzate in altri linguaggi (es. C/C++) al fine di ottimizzare i tempi di elaborazione; ▪ OUTPUT – Il risultato del calcolo solitamente viene riportato nelle celle del foglio di lavoro ed eventualmente riportato in grafico. 83
  • 84. Gestire l’Interazione con Excel » Gli oggetti di Excel (così come quelli delle altre applicazioni Microsoft Office) sono raggruppati in classi organizzate in modo gerarchico. Ogni classe di oggetti a sua volta può contenere una o più sottoclassi. » La gerarchia vede al livello più alto l’oggetto Application che rappresenta l’applicazione stessa. » E’ facile rendersi conto che all’interno dell’applicazione molti oggetti sono dello stesso tipo essendo distinti solo da un nome univoco o da un indice di riferimento; si pensi ad esempio ai vari fogli che compaiono all’interno di una cartella di lavoro. Questi oggetti formano una collezione o insieme di oggetti. 84
  • 85. Gestire l’Interazione con Excel » Le collezioni sono sempre individuate da nomi al plurale. Ad esempio in Excel l’insieme Workbooks rappresenta tutte le cartelle di lavoro correntemente aperte. All’interno di ogni oggetto Workbook è disponibile un insieme di oggetti Worksheet (i fogli di lavoro), tale insieme è identificato dal nome Worksheets. ▪ Tutti gli insiemi in Microsoft Office consentono di accedere a ciascun elemento nell’insieme oltre che al numero di oggetti dell’insieme. ▪ Per accedere ad un singolo oggetto in un insieme in Visual Basic è sufficiente digitare il nome dell’insieme seguito dal valore di un indice univoco di riferimento (che può essere un nome o un numero) compreso fra parentesi tonde. ▪ Ad esempio se intendiamo riferirci al foglio denominato “Foglio1” di una generica cartella di lavoro, possiamo utilizzare l’insieme Worksheets con la seguente sintassi: Worksheets(“Foglio1”) oppure Worksheets(1). 85
  • 86. Gestire l’Interazione con Excel » L’istruzione For Each consente di ripetere un gruppo di istruzioni per ciascun elemento di una collezione. 86 Sintassi Public Sub test() Dim w As Worksheet For Each w In Worksheets Debug.Print w.Name Next End Sub
  • 87. Esercitazione »Lavorare con i fogli Excel ▪ Elementi noti : ▪ Elementi della Sintassi VBA ▪ Apprendimento: ▪ Metodi per la gestione dei Fogli Xl ▪ Istruzione For Each ▪ Anticipazione: ▪ Pulsanti di Comando 87 Clicca qui per aprire il file di esercitazione ESEMPIO_1_4.XLSM
  • 88. Gestire l’Interazione con Excel » Ogni oggetto Microsoft Office può contenere proprietà, metodi o eventi. ▪ Una proprietà è un attributo caratteristico che definisce o descrive un oggetto, come la dimensione di una cella, la posizione di una finestra di dialogo o la sua forma. ▪ I metodi (come abbiamo già detto) sono azioni che è possibile eseguire sull’oggetto o tramite esso. Ad esempio sono metodi della cartella il salvataggio su disco, l’eliminazione di dati la chiusura della cartella stessa. ▪ Gli eventi sono frammenti di codice che vengono eseguiti in corrispondenza di eventi intercettati dal sistema operativo (es. click sul mouse). 88 » La sintassi per specificare una proprietà o un metodo è la stessa Oggetto.Identificatore dove ▪ Oggetto è un qualsiasi riferimento valido ad un oggetto e ▪ Identificatore è un qualsiasi nome valido di una proprietà o di un metodo. » Notate che un punto (.) separa il riferimento all’oggetto dal nome della proprietà o del metodo.
  • 89. Gestire l’Interazione con Excel » Durante la scrittura del codice ogni volta che desiderate invocare una proprietà o un metodo il VBA visualizza accanto al punto una finestra in cui compaiono i nomi delle proprietà e dei metodi dell’oggetto corrente. 89 ⚫ I metodi vengono identificati da un blocchetto verde mentre le proprietà sono indicate da un’icona a forma di lista con un indice che punta ad un elemento.
  • 90. Gestire l’Interazione con Excel » Pulsanti di Comando ▪ I pulsanti di comando non solo possono attivare un evento quando vi si preme sopra con il mouse ma rispondono anche ad altri eventi come ad esempio il semplice spostamento del mouse sopra il pulsante. ▪ Dato che i pulsanti di comando possono rispondere ad un complesso sistema di eventi (questa come vedremo è la regola piuttosto che l’eccezione per tutti i comandi) è necessario un modo completamente nuovo per collegare una macro ad un pulsante. ▪ Questo nuovo approccio utilizza quelle che vengono chiamate routine di gestione degli eventi. ▪ Queste routine sono speciali macro, collegate ad un oggetto, per esempio ad un pulsante di comando. 90
  • 91. Gestire l’Interazione con Excel » Finestra Proprietà di un Pulsante di Comando 91
  • 92. Gestire l’Interazione con Excel » Macro Gestione Evento Associata ad un Pulsante di Comando 92
  • 93. Esercitazione »Inserimento di Pulsanti nei Fogli di Lavoro ▪ Elementi noti : ▪ Istruzioni Condizionali ▪ Procedure in vba ▪ Apprendimento: ▪ interazione con oggetti di Excel ▪ Anticipazione: ▪ interazione con oggetti di Excel 93 Clicca qui per aprire il file di esercitazione ESEMPIO_1_5.XLSM
  • 94. Spostare le righe [esempio_1_5.xlsm] » Per prima cosa, selezioniamo la riga a cui appartiene la cella attiva. » La proprietà EntireRow, infatti, restituisce un oggetto range che rappresenta la riga intera che contiene l’intervallo (range) a cui è applicata questa proprietà. In questo caso specifico restituisce l’intera riga in cui si trova la cella attiva. » Con il metodo Cut tagliamo la selezione, cioè l’intera riga appena selezionata. Grazie alla proprietà Offset selezioniamo la riga precedente a quella attiva, cioè la riga -1 rispetto a quella che contiene la cella attiva. » Applichiamo quindi alla selezione il metodo Insert, che permette di inserire le celle tagliate. Assegnando all’argomento Shift il valore xlDown specifichiamo che per far spazio alle celle inserite deve avvenire uno spostamento verso il basso delle celle selezionate.
  • 95. Esercitazione »Alimentazione Dati da altro Workbook ▪ Elementi noti : ▪ Istruzioni Condizionali ▪ Procedure in vba ▪ Interazione con oggetti di Excel ▪ Apprendimento: ▪ Rilevazione cambiamento in una cella ▪ Apertura e chiusura fogli di lavoro ▪ Anticipazione: ▪ Nessuna 95 Clicca qui per aprire il file di esercitazione ESEMPIO_1_6.XLSM
  • 97. 97 Moduli di Classe » Col termine Modulo di Classe si intende un tipo particolare di modulo, simile ai moduli standard, destinato a rappresentare una classe di oggetti. Un modulo di classe contiene le variabili (attributi) e il codice VBA dei metodi che definiscono la classe. La corrispondenza fra moduli e classi è uno-a- uno nel senso che ciascun modulo può definire una sola classe e viceversa. » Per creare una nuova classe di oggetti occorre prima di tutto inserire nel progetto un modulo di classe. » Successivamente dovremo scrivere il codice VBA che definisce le proprietà e i metodi della classe.
  • 98. 98 Moduli di Classe » E’ bene segnalare sin da subito che il codice che andremo a scrivere nei moduli di classe non verrà eseguito nello stesso modo in cui viene eseguito il codice dei moduli standard. » Per utilizzare un metodo particolare dovremo dapprima dichiarare una variabile oggetto di tipo corrispondente alla classe personalizzata e, successivamente, invocare proprietà e metodi di quell’oggetto utilizzando la notazione oggetto.proprietà/metodo in modo analogo a quanto siamo abituati a fare con gli altri oggetti di Excel. » Es. ▪ myObject.method ▪ a = myObject.property ▪ myObject.property = 3
  • 99. 99 Moduli di Classe » L’utilizzo di una classe di oggetti personalizzata è in qualche modo equivalente all’utilizzo di un tipo di dati definito dall’utente. » Anche in questo caso occorre dapprima dichiarare una variabile con il tipo appropriato per poi usarla all’interno delle nostre procedure VBA. » Ogni modulo di classe può contenere delle variabili per memorizzare i dati interni dell’oggetto, delle procedure speciali per recuperare o per impostare le proprietà dell’oggetto stesso e, infine, delle procedure e delle funzioni che implementano i metodi dell’oggetto.
  • 100. 100 Moduli di Classe » C’è una grande differenza tra una variabile semplice e una variabile oggetto. La variabile oggetto non è che un puntatore all’interno della memoria. Si dovrà creare esplicitamente un oggetto e salvare la sua posizione nella variabile oggetto. Questo processo si chiama creare una nuova istanza di un oggetto o istanziare un oggetto. » Poiché gli oggetti sono diversi dalle variabili, Visual Basic for Applications utilizza una speciale istruzione chiamata istruzione Set. » L’istruzione Set ha due forme. Ecco la prima: Set VariabileOggetto = New NomeClasse » In questa forma, l’istruzione Set crea un nuovo oggetto basato su NomeClasse. Ciò significa che Visual Basic allocherà memoria per l’oggetto e salverà la posizione in memoria nella classe VariabileOggetto.
  • 101. 101 Moduli di Classe Set VariabileOggetto = EspressioneOggetto » Nella seconda forma, l’istruzione Set fa due cose: prima di tutto l’istruzione rilascia l’oggetto a cui puntava (se presente), quindi salva un puntatore a un oggetto già esistente in VariabileOggetto.
  • 102. 102 Moduli di Classe » Visual Basic for Applications contiene un valore speciale chiamato Nothing. Questo valore può essere usato solo con gli oggetti. Nothing è il valore associato con una variabile oggetto che non punta al momento a un’istanza di una classe. » Una variabile oggetto dichiarata con un’istruzione Dim sarà inizialmente impostata a Nothing. » È possibile determinare se è stata creata una nuova istanza di classe usando Is Nothing in un’istruzione If come questa: If VariabileOggetto Is Nothing Then
  • 103. 103 Moduli di Classe » La seguente istruzione può essere usata per distruggere un oggetto: Set VariabileOggetto = Nothing » Quest’istruzione libererà il riferimento all’oggetto e imposterà la variabile oggetto al suo stato non inizializzato. Assumendo che ci sia solo una variabile oggetto che punta all’oggetto, questa istruzione distruggerà anche l’oggetto e libererà tutte le risorse associate a esso. » Tuttavia, se diverse variabili oggetto puntano a questo oggetto, occorre impostarle tutte a Nothing prima che l’oggetto venga distrutto.
  • 104. L’oggetto Collection (Cenni) » Una Collection (Raccolta) è un tipo che contiene un insieme di oggetti correlati - in memoria. » I tipi di raccolta sono molto utili perché è facile aggiungere elementi e iterare sugli articoli della raccolta per qualsiasi scopo sia necessario. » I tipi di raccolta specializzati vengono utilizzati nelle applicazioni di Office. In MS Access, ad esempio, un Recordset può essere una raccolta di record in una tabella, la raccolta Form contiene tutti i moduli aperti e così via.
  • 105. L’oggetto Collection (Cenni) » Dichiarazione di una Collection ▪ Una variabile dell'oggetto collezione deve essere creata come una "nuova" raccolta, a meno che non la si voglia assegnare a una raccolta esistente. ▪ In genere, il codice per creare una raccolta ha il seguente aspetto: ▪ Dim colPersons As Collection ▪ Set colPersons = New Collection
  • 106. L’oggetto Collection (Cenni) » Aggiungere elementi ad una Collection ▪ Il codice seguente mostra come è possibile aggiungere elementi a una raccolta. ▪ Nel nostro caso abbiamo aggiunto oggetti di classe personalizzati (Person) alla raccolta, ma è possibile aggiungere qualsiasi cosa, inclusi tipi standard come stringhe o oggetti incorporati nell'applicazione Office.
  • 107. 107 Moduli di Classe » Prima di aggiungere un modulo di classe ad un progetto VBA è indispensabile progettare attentamente l’oggetto che vogliamo costruire. L’elenco seguente riepiloga i principali requisiti per la corretta progettazione di una classe di oggetti: ▪ Tutte le informazioni relative all’oggetto devono essere memorizzate all’interno dell’oggetto stesso. Come vedremo è possibile dichiarare diverse variabili all’interno del modulo di classe per contenere delle informazioni che descrivono l’oggetto. ▪ Tutto il codice necessario per manipolare i dati dell’oggetto o per modificarne il comportamento deve essere contenuto all’interno dell’oggetto stesso. Questo significa che i metodi dell’oggetto saranno procedure che andremo a scrivere all’interno del modulo di classe relativo all’oggetto che stiamo definendo. ▪ Tutto il codice necessario per generare dei valori basati sui dati dell’oggetto deve essere incluso al suo interno.
  • 108. 108 La classe CCouponBond » In questo esempio procederemo tentando di capire quali sono le informazioni essenziali che identificano un titolo di tipo coupon bond a tasso fisso sforzandoci di identificare prima quei dati che potrebbe essere necessario recuperare o impostare nel corso di una procedura, e che diverranno le proprietà dell’oggetto. » Successivamente, elencheremo tutte le azioni che il nostro oggetto deve essere in grado di compiere utilizzando i propri dati. » In quest’ultimo passaggio stiamo definendo il comportamento che vogliamo attribuire al nostro oggetto, ogni azione di questo elenco rappresenterà quindi un diverso metodo. » Chiameremo questa nostra prima classe CCouponBond.
  • 109. 109 La classe CCouponBond » A puro scopo esemplificativo, un titolo coupon bond può essere caratterizzato dai seguenti attributi: ▪ Data Emissione ▪ Data Scadenza ▪ Cedola ▪ Periodicità dei pagamenti ▪ Valore Nominale ▪ Scadenzario ▪ Piano Cedole ▪ Piano Rimborso ▪ Prezzo di Mercato ▪ Ritenuta Fiscale
  • 110. 110 La classe CCouponBond » Una volta individuati gli attributi è necessario caratterizzarli definendo per ciascuno di essi una variabile di tipo appropriato. Nel nostro caso abbiamo scelto la seguente corrispondenza Attributo Nome Variabile Tipo Variabile Tipo Struttura Data Emissione DataEmissione Date Scalare Data Scadenza DataScadenza Date Scalare Cedola Cedola Double Scalare Periodicità dei pagamenti Periodo Integer Scalare Valore Nominale Nominale Double Scalare Scadenzario Scadenzario Date Array Dinamico Piano Cedole PCedole Double Array Dinamico Piano Rimborso PRimborso Double Array Dinamico Prezzo di Mercato Prezzo Double Scalare Ritenuta Fiscale Ritenuta Double Scalare
  • 111. 111 La classe CCouponBond » Per inserire e per rinominare un modulo di classe seguite questi passaggi: ▪ Nell’Editor VB, scegliete Inserisci – Modulo di Classe (oppure fate clic con il tasto destro del mouse su VBAProject). L’Editor VBA aggiunge un nuovo modulo di classe al progetto e gli assegna un nome predefinito. ▪ Scegliete il comando Visualizza - Finestra Proprietà per attivare la finestra proprietà qualora questa non sia già visibile. ▪ Nella casella di testo Name digitate il nuovo nome della classe: CCouponBond. » A questo punto siamo pronti per introdurre le variabili e le procedure che compongono le definizioni dei metodi e delle proprietà del nuovo oggetto.
  • 112. 112 La classe CCouponBond » Scrivere le definizioni dei metodi di una classe non è poi così diverso dallo scrivere il codice di una qualunque procedura o funzione VBA. ▪ Ogni funzione o procedura che scriveremo in un modulo di classe diventa disponibile come metodo della classe e la sintassi è esattamente la stessa che avete già imparato per scrivere procedure e funzioni dei moduli standard. » Anche la scrittura delle definizioni delle proprietà di una classe è essenzialmente uguale alla scrittura delle funzioni e delle procedure standard ma richiede una sintassi leggermente diversa.
  • 113. Esercitazione »Utilizzo della Classe CCouponBond ▪ Elementi noti : ▪ Sintassi Base VBA ▪ Apprendimento: ▪ Uso dei Moduli di Classe in VBA ▪ Utilizzo dei Form ▪ Il controllo calendario ▪ Anticipazione: ▪ Nessuna 113 Clicca qui per aprire il file di esercitazione ESEMPIO_1_7.XLSM
  • 114. Premere con il tasto destro sul nodo del VBA Project al quale vogliamo aggiungere il form User Form
  • 115. Alcuni fra gli eventi più comuni dell’oggetto UserForm Evento Quando Avviene Activate Questo evento viene scatenato ogni volta che la finestra diventa attiva cioè passa in primo piano. Questo evento è molto utile ogniqualvolta si renda necessario aggiornare il contenuto dei controlli in modo da riflettere i cambiamenti che possono essere intervenuti quando la finestra non era attiva. Click E’ l’evento che si genera ogni volta che l’utente preme con il mouse sulla superficie della finestra. Initialize Questo evento si genera quando l’oggetto finestra viene caricato in memoria. Come vedremo questo evento può essere scatenato dall’istruzione Load o dal metodo Show. Questo evento si utilizza per impostare l’aspetto iniziale della finestra e i controlli eventualmente contenuti nel form. Nel nostro esempio utilizzeremo questo evento per caricare una serie di valori predefiniti in un combo box all’interno della finestra di dialogo. Terminate Evento scatenato quando l’oggetto finestra viene scaricato dalla memoria. Questo evento viene utilizzato in tutte quelle circostanze ove si rende necessario liberare le variabili dell’oggetto prima di chiudere quest’ultimo. User Form
  • 116. 116 La classe CCouponBond » Abbiamo anteposto al nome della variabile l’identificativo m_ per indicare che queste sono variabili interne alla classe (vengono anche dette membri della classe). ▪ Queste variabili non sono visibili all’esterno della classe, nel linguaggio della programmazione orientata agli oggetti si dice che i dati sono incapsulati o nascosti. » Per accedere alle variabili membro occorre definire delle apposite procedure solo per quei dati ai quali si vuol dare accesso in lettura e scrittura da parte delle altre procedure del programma. ▪ In particolare le procedure di tipo Property Get permettono di recuperare un valore di una proprietà dell’oggetto, mentre le procedure di tipo Property Let consentono di assegnare un valore ad una proprietà dell’oggetto (dove chiaramente ciascuna proprietà deve corrispondere ad una variabile interna).
  • 117. 117 La classe CCouponBond » Una procedura Property Get ha la seguente sintassi ▪ La parola chiave Property indica al Visual Basic che questa è una procedura per una proprietà dell’oggetto, mentre la parola chiave Get indica che essa restituirà un valore della proprietà stessa. ▪ L’elenco opzionale degli argomenti rappresenta l’elenco degli argomenti per la procedura ed ha la stessa sintassi che abbiamo imparato a conoscere per gli argomenti delle funzioni e delle subroutine. ▪ L’istruzione Nome = espressione è in pratica un’istruzione di assegnamento analoga a quanto accade nelle normali funzioni. Property Get Nome ([elenco argomenti]) [As nometipo] [istruzioni] Nome = espressione [istruzioni] End Property
  • 118. 118 La classe CCouponBond » Vediamo subito alcuni esempi, il codice sottostante riporta la Property Get della variabile m_DataScadenza. ▪ Property Get DataScadenza() As Date ▪ DataScadenza = m_DataScadenza ▪ End Property » La procedura è semplicissima e, come si vede, si limita a restituire in output il valore della proprietà m_DataScadenza della nostra classe CCouponBond.
  • 119. 119 La classe CCouponBond » Leggermente più articolata è la Property Get per il vettore Scadenzario ▪ Property Get Scadenzario(Index As Integer) As Date ▪ If Index <= UBound(m_Scadenzario) And Index >= LBound(m_Scadenzario) Then ▪ Scadenzario = m_Scadenzario(Index) ▪ Else ▪ Scadenzario = "01/01/1900" ▪ End If ▪ End Property » In questo caso la funzione non restituisce tutto l’array ma solo un elemento; » l’indice dell’elemento che si desidera ottenere viene passato come argomento alla Property. ▪ Se questo valore è compreso all’interno dell’intervallo individuato dall’indice minimo e da quello massimo (ricavati con le funzioni UBound e LBound) si procede ad assegnare il valore alla funzione che lo restituisce all’esterno. ▪ Altrimenti viene restituito un valore che permetta di gestire una condizione di errore (nel nostro caso restituiamo la data del 1 gennaio 1900).
  • 120. 120 La classe CCouponBond » Scrivendo una procedura Property Get si crea una proprietà leggibile per nostro oggetto. » Se scriviamo solo la Property Get la proprietà sarà di sola lettura (non sarà cioè possibile modificarla dal resto del programma). » Qualora la proprietà debba anche essere modificata dal programma è necessario scrivere anche una procedura Property Let. ▪ Property Let Nome ([elenco argomenti,] nuovovalore) ▪ [istruzioni] ▪ End Property » Per questo fine esistono anche procedure di tipo Property Set che differiscono dalle Property Let in quanto ricevono argomenti passati per riferimento e non per valore.
  • 121. La Gestione degli Errori Uso della procedura On Error goto
  • 122. Il primo bug » L'uso del termine bug, che in inglese indica genericamente un piccolo insetto, è legato ad un curioso aneddoto risalente ai tempi pionieristici dell'informatica; » il 9 settembre 1947 il tenente Grace Hopper ed il suo gruppo stavano cercando la causa del malfunzionamento di un computer Mark II quando, con stupore, si accorsero che una falena si era incastrata tra i circuiti. » Dopo aver rimosso l'insetto (alle ore 15:45), il tenente incollò la falena rimossa sul registro del computer e annotò: «1545. Relay #70 Panel F (moth) in relay. First actual case of bug being found».
  • 123. Tipologie di errori »Durante lo sviluppo e l'esecuzione di un codice sorgente possono verificarsi i cosiddetti "errori di programmazione" che si possono distinguere essenzialmente in tre principali categorie: errori di sintassi, errori di logica ed errori di runtime. ▪ Gli errori di sintassi sono gli errori che si commettono nella fase di scrittura del programma nel linguaggio scelto, fase successiva alla progettazione dell'algoritmo. ▪ Sono In genere errori di ortografia nella scrittura del codice o nella sintassi delle istruzioni. ▪ Gli errori di sintassi impediscono la compilazione del programma da parte del compilatore che quindi tipicamente segnalerà la presenza dell'errore. ▪ Questo tipo di errore è spesso segnalato al programmatore direttamente dall'editor dell'ambiente integrato di sviluppo (IDE) utilizzato, risultando dunque di facile individuazione e soluzione.
  • 124. Tipologie di errori »Durante lo sviluppo e l'esecuzione di un codice sorgente possono verificarsi i cosiddetti "errori di programmazione" che si possono distinguere essenzialmente in tre principali categorie: errori di sintassi, errori di logica ed errori di runtime. ▪ Gli errori di logica (o semantica) sono gli errori che si commettono nella fase di progettazione dell'algoritmo: possono essere causati da una mancata comprensione del problema da calcolare o dei vincoli che i dati in input devono rispettare, o ancora nella valutazione del test dell'algoritmo. ▪ Questi errori conducono tipicamente alla progettazione di un algoritmo che non fornisce l'output richiesto nell'ambito di una o più istanze del problema da risolvere. ▪ Sono difficili da individuare e spesso si deve ricorrere al debugging tramite il debugger dell'IDE.
  • 125. Tipologie di errori »Durante lo sviluppo e l'esecuzione di un codice sorgente possono verificarsi i cosiddetti "errori di programmazione" che si possono distinguere essenzialmente in tre principali categorie: errori di sintassi, errori di logica ed errori di runtime. ▪ Gli errori di runtime sono errori che possono verificarsi nella fase di esecuzione del programma, anche se l'algoritmo è corretto e il codice viene compilato correttamente. ▪ Spesso sono relativi all'utilizzo della memoria da parte del programma stesso, che tenta ad esempio di scrivere ad una locazione di memoria alla quale non ha accesso. ▪ Questi errori si verificano principalmente nell'utilizzo dei puntatori e in programmazione dinamica.
  • 126. On Error GoTo » Finora abbiamo cercato di prevenire tutti i possibili errori che può commettere l’utente o le imprecisioni che possono derivare da una programmazione non precisissima. » Tuttavia non è sempre possibile prevedere in anticipo cosa potrebbe andare storto. » In questa sezione studieremo un sistema per gestire tutti gli errori che si possono verificare.
  • 127. On Error GoTo » Che cosa succede ad esempio se un utente cancella o rinomina un foglio di lavoro a cui il codice fa riferimento? » VBA non riesce a gestire la situazione perché nel codice si fa riferimento esplicito a quel foglio, quindi se l’utente tenta di inserire un dato all’interno del foglio Excel mostra un messaggio di errore; » se poi l’utente fa clic sul pulsante Debug della finestra dell’errore, viene aperto l’editor di VBA con il codice non corretto evidenziato. » Questo può spiazzare un utente non esperto.
  • 128. On Error GoTo » Per evitare questo comportamento abbiamo due possibilità: ▪ cercare di risolvere questo specifico errore proteggendo la cartella di lavoro, il che impedisce all’utente di rinominare o cancellare i fogli, oppure ▪ predisporre una soluzione generale, utile anche per gestire altri errori a cui non abbiamo pensato. ▪ NOTA Per proteggere una cartella di lavoro, portatevi alla scheda Revisione della barra multifunzione e, nel gruppo Revisioni, fate clic sul pulsante Proteggi cartella di lavoro. » In genere, la soluzione ideale è tentare di risolvere specificamente tutti i possibili errori e prevedere al contempo una soluzione generale per le situazioni a cui non abbiamo pensato. » Considerate che è quasi impossibile prevedere tutti i probabili errori e tutte le probabili azioni di un utente.
  • 129. On Error GoTo » Per introdurre la gestione degli errori basta correggere le nostre procedure come segue... » All’inizio della routine, appena sotto alla dichiarazione delle variabili, dobbiamo aggiungere l’istruzione On Error GoTo Errore. » Questo significa: “Se trovi un errore (On Error) vai a (GoTo) alla parte della routine a cui è assegnata l’etichetta Errore (Errore)”.
  • 130. On Error GoTo »È importante che questa istruzione stia all’inizio della routine, prima che il codice cominci a essere eseguito, ossia prima che possa verificarsi un errore. »La parte di routine con etichetta Errore (potreste scegliere una qualsiasi altra etichetta a vostro piacimento) deve essere posta alla fine della routine, appena prima di End Sub, e deve essere preceduta da un’istruzione Exit Sub per evitare che il contenuto dell’etichetta Errore sia eseguito anche quando non si verifica un errore. »Le istruzioni contenute nella porzione di Sub identificata dall’etichetta indicano a VBA cosa fare in caso di errore: mostrare un messaggio e terminare l’esecuzione della routine per evitare di incorrere in altri errori.
  • 131. On Error GoTo » Se preferite che l’istruzione che genera l’errore venga semplicemente saltata e sia eseguito il resto della routine, invece di usare l’istruzione On Error GoTo …, utilizzate On Error Resume Next. » Questa istruzione, infatti, indica a VBA di continuare l’esecuzione del codice dalla riga successiva a quella che ha causato l’errore. » Ovviamente, potete adottare questa soluzione solo se pensate che l’errore che può verificarsi non sia cruciale e che si riesca comunque a eseguire il codice seguente. » Soprattutto con routine complesse, conviene sempre prevenire gli errori imprevisti.
  • 132. Estensione delle Funzionalità Personalizzazione e Sviluppo Componenti Aggiuntivi
  • 133. Personalizzare la Barra Multifunzione » Perché le funzionalità che abbiamo realizzato nei capitoli precedenti siano utilizzabili in tutti i file aperti in Excel bisogna che siano accessibili dalla barra multifunzione. » A partire da Excel 2010 (con la versione 2007 questo non è possibile) è possibile aggiungere alla barra multifunzione un nuovo pulsante che richiama un’istruzione VBA. » Si può aggiungere il pulsante in un nuovo gruppo di comandi di una scheda esistente o in una scheda completamente nuova.
  • 134. Personalizzare la Barra Multifunzione » Per prima cosa, bisogna selezionare la scheda esistente dopo la quale si vuole inserire la nuova scheda. » Quindi, bisogna premere il pulsante Nuova scheda posto sotto alla casella con l’elenco delle schede. Verrà aggiunta una nuova scheda con un nuovo gruppo. » La nuova scheda e il nuovo gruppo hanno un nome generico. Per cambiarli, basta selezionare il nome della scheda o del gruppo da cambiare e premere il pulsante Rinomina.
  • 135. Personalizzare la Barra Multifunzione » Dall’elenco a discesa Scegli comandi da (in alto, sopra il riquadro di sinistra), selezionate la voce Macro. » Nel riquadro a sinistra Excel vi mostrerà le routine disponibili (ossia quelle presenti nel file eventualmente aperto e nei componenti aggiuntivi caricati): selezionate le macro desiderate, poi premete il pulsante Aggiungi. » Una volta inseriti i comandi, con il pulsante Rinomina potete accedere a una finestra che permette di modificare l’icona e il testo descrittivo del nuovo pulsante. Alla fine della procedura, la nuova scheda sarà aggiunta alla barra multifunzione.
  • 136. L’angolo di Sheldon »Personalizzare la Personalizzazione della Barra Multifunzione »Com’è strutturato un file office? »Uso di Custum UI Editor For Microsoft Office 136
  • 137. Personalizzare la Barra Multifunzione » In realtà, la soluzione che abbiamo appena descritto non è ottimale dato che la nuova scheda della barra multifunzione con il pulsante che richiama le nostre routine sarà sempre attiva anche se il file che contiene questa routine non è aperto. » Tutto questo perché Excel non permette di personalizzare la barra multifunzione di un singolo file, ma solo di tutto l’applicativo Excel. I pulsanti inseriti nella nuova scheda rischiano di diventare inutili. » Sarebbe meglio, allora, inserire la personalizzazione della barra multifunzione direttamente nel file Excel che contiene il codice VBA da richiamare mediante i pulsanti della scheda personalizzata. In questo modo, la nuova scheda sarà mostrata solo quando il file è aperto e il suo codice è utilizzabile. » Abbiamo detto che non lo si può fare da interfaccia; bisogna quindi procedere via codice. Prima, però, è necessaria qualche spiegazione teorica.
  • 138. Personalizzare la Barra Multifunzione » I file di Office 2007/2010/2013 sono, in realtà, delle cartelle compresse. » Se modificate la loro estensione in .zip, potrete poi scompattarli come un normale file archivio. Una volta scompattata la cartella, potrete entrare al suo interno. ▪ Per creare una barra multifunzione personalizzata dovete innanzitutto creare all’interno della cartella che costituisce il file una cartella col nome customUI. Dentro customUI occorrerà creare il file XML custmUI.xml, che conterrà il codice che crea la barra personalizzata. » Tutto questo non è molto pratico, dato che per apportare modifiche e correzioni al file XML e poi provarlo in Excel occorre continuamente scompattare e poi ricompattare il file. » Per fortuna, esiste un programma facile da usare e disponibile gratuitamente su Internet che semplifica di molto le cose. Si tratta di Office Custom UI Editor.
  • 139. Personalizzare la Barra Multifunzione » Dall’interno del tool, aprite il file di cui volete personalizzare la barra multifunzione; » A questo punto, è possibile aggiungere il file XML che crea la scheda personalizzata. Prima, però, devo fare un’altra premessa. » Il codice XML necessario usa uno schema XML diverso a seconda della versione di Excel a cui si fa riferimento. » in Office Custom UI Editor scegliete Office 2007 Custom UI Part.
  • 140. Personalizzare la Barra Multifunzione » Il nodo radice di questo codice è <customUI>, che a sua volta racchiude il tag <ribbon> che descrive l’intera barra multifunzione. » Sotto al nodo <ribbon> dobbiamo aggiungere il nodo <tabs>. Poi con il nodo <tabs> iniziamo la costruzione delle diverse schede della barra multifunzione.
  • 141. Personalizzare la Barra Multifunzione » Ovviamente, non essendo partiti da zero, la nostra barra contiene già tutte le schede standard. La scheda che descriveremo si aggiungerà a quelle già esistenti. » Per aggiungere una scheda si usa il nodo <tab>. Ogni tag <tab> all’interno di <tags> crea una nuova scheda.
  • 142. Personalizzare la Barra Multifunzione » Il nostro pulsante ha un id, un’etichetta e, con l’attributo onAction, definiamo quale routine sub che deve essere richiamata al clic su di esso. » Possiamo anche fare in modo che il pulsante abbia un’icona. Ne trovate molte alla pagina http://soltechs.net/customUi/imageMso01.asp.
  • 143. Personalizzare la Barra Multifunzione » Questa barra ancora non funziona. Occorre predisporre opportunamente le routine VBA da richiamare attraverso i controlli della barra. Basterà assegnare loro come argomento: Control As IRibbonControl » Anche questo può essere fatto dal CustomUI Editor tramite il pulsante «Generate Callbacks»
  • 144. Creare un Componente Aggiuntivo » Excel può essere arricchito con nuove funzionalità che vengono salvate in speciali file, detti componenti aggiuntivi, che hanno estensione .xlam. » I componenti aggiuntivi, dopo che sono stati attivati, vengono caricati in background all’avvio di Excel. I loro fogli sono nascosti (quindi non visibili nell’interfaccia del programma), ma il loro codice e le eventuali barre multifunzione personalizzate sono perfettamente funzionanti.
  • 145. Creare un Componente Aggiuntivo » Dopo aver cancellato i fogli in eccesso, avviate la procedura per salvare con un nuovo nome. » Nella finestra Salva con nome, nella casella Salva come, scegliete Componente aggiuntivo di Excel *.xlam. Excel vi porterà direttamente alla cartella AddIns
  • 146. Creare un Componente Aggiuntivo » Si tratta della cartella in cui Excel si aspetta di trovare i componenti aggiuntivi. » È una cartella nascosta creata automaticamente all’installazione di Office all’interno della cartella dell’utente. » La posizione precisa di questa cartella varia a seconda della versione di Windows.
  • 147. Caricare un Componente Aggiuntivo » Fate clic sulla scheda File e poi su Opzioni o, se lavorate con Excel 2007, aprite il menu del pulsante Microsoft Office e premete il pulsante Opzioni di Excel. » Vi verrà aperta la finestra Opzioni di Excel. Portatevi alla sezione Componenti aggiuntivi;
  • 148. Caricare un Componente Aggiuntivo » Se aveste salvato il file del componente aggiuntivo nella cartella AddIns predefinita, lo trovereste già elencato in questa finestra, ma se lo avete salvato, come vi ho suggerito, in una cartella a vostra scelta, non lo si vede: occorre individuarlo. » Premete il pulsante Sfoglia e portatevi alla cartella in cui avete salvato il componente aggiuntivo, poi premete il pulsante Apri: tutti i componenti aggiuntivi presenti in questa cartella saranno visualizzati nella finestra Componenti aggiuntivi
  • 149. MS Office Programming Usare VBA per interagire con gli altri programmi della suite MS Office
  • 150. Office Programming: Word » Esistono 2 metodi per avviare un'applicazione Word da Excel utilizzando VBA: » Early Binding (associazione anticipata) » Late Binding (associazione posticipata) » Fondamentalmente nell'associazione anticipata definiamo quale oggetto stiamo usando creando un riferimento all’oggetto specifico prima dell'esecuzione del programma (design time). » Nell'associazione posticipata, il programma non saprà a cosa stiamo lavorando fino a quando l'esecuzione non è iniziata. Si definisce un puntatore ad un oggetto generico che però non viene istanziato.
  • 151. Office Programming: Word » Ogni metodo ha pro e contro: » L'associazione anticipata ha prestazioni migliori. » Quando si usa l’associazione anticipata l'intellisense dell’editor VBA vi permette di codificare al meglio metodi e proprietà degli oggetti che utilizzate. » D’altro canto, quando si utilizza l'associazione anticipata è necessario specificare quale versione di Word (o di un altro applicativo) si utilizzerà. Se l'applicazione viene portata su un altro computer con una versione di word diversa, il codice potrebbe non funzionare.
  • 152. Office Programming: Word »Associazione Anticipata ▪ Nel primo esempio utilizzeremo l’associazione anticipata per automatizzare un’applicazione word da excel; ▪ Per prima cosa dobbiamo aggiungere un riferimento alla libreria specifica relativa all’applicazione con cui stiamo lavorando, apriamo pertanto la finestra «Strumenti» dell’editor VBA…
  • 153. Office Programming: Word » Al momento della stesura di queste slide, la versione word 2016 è installata sul mio computer, pertanto sul mio sistema è stata installata la libreria oggetti di Microsoft Word 16.0. » Se avete una versione diversa di word installata, ci sarà un'altra libreria di oggetti in questa lista.
  • 154. Office Programming: Word (esempio_2_1.xlsm) »Esempio – Early Binding Come accennato prima questo metodo non verrà eseguito su un sistema con una versione installata di Word diversa da quella della specifica libreria referenziata.
  • 155. Office Programming: Word (esempio_2_1.xlsm) »Esempio – Late Binding ▪ Si noti che in questo caso non c’è bisogno di aggiungere alcun tipo di riferimento; Come accennato in precedenza, sebbene l'associazione posticipata sia meno efficiente di quella anticipata, essa verrà eseguita su qualsiasi sistema che abbia word installato indipendentemente dalla versione.
  • 156. Esercitazione • Esempi di Automazione Documenti Word ▪ Elementi noti : ▪ Sintassi VBA ▪ Modello ad Oggetti di Excel ▪ Apprendimento: ▪ Avvio applicazione Word da Excel ▪ Trasferimento dati da XL a Word ▪ Lettura dati in Word da XL 156 Clicca qui per aprire il file di esercitazione ESEMPIO_2_1.XLSM Clicca qui per aprire il file di esercitazione ESEMPIO_2_1.DOCM
  • 157. Come creare e compilare automaticamente moduli Word caricando i dati da XL »Come sorgente dati XL utilizzeremo il file Esempio_2_2.xlsm; »Tenete presente i seguenti consigli per la compilazione dei file XL da utilizzare come sorgente dati: ▪ Anche se non è obbligatorio, date alle intestazioni delle colonne gli stessi nomi dei campi che vogliamo poi ritrovare nel modello WORD (è più immediato fare i collegamenti); ▪ Non lasciare colonne e righe vuote a sinistra e sopra la tabella (potrebbero generare degli errori); ▪ Evitare assolutamente le celle unione;
  • 158. Come creare e compilare automaticamente moduli Word caricando i dati da XL » Per la creazione del modello word è sufficiente aprire un nuovo file word e selezionare il tab LETTERE – INIZIA STAMPA UNIONE – LETTERE (Mailing – Start Mail Merge – Letters)
  • 159. Come creare e compilare automaticamente moduli Word caricando i dati da XL » Dopo di che selezionare da SELEZIONA DESTINATARI – USA ELENCO ESISTENTE (Select Recipients – Use Existing List). Si aprirà una finestra di dialogo che ci permetterà di selezionare il file excel fonte dati. Dovremo anche selezionare lo sheet contenente i dati da elaborare.
  • 160. Come creare e compilare automaticamente moduli Word caricando i dati da XL » A questo punto possiamo inserire i campi variabili nel modello word portandosi col cursore nel punto dove dovrà comparire il campo variabile, cliccare sull’icona INSERISCI CAMPO UNIONE (Insert Merge Field) e scegliere il campo da inserire. Quest’operazione va ripetuta per ogni campo variabile che si vuole inserire.
  • 161. Esercitazione • Esempi di Automazione Documenti Word ▪ Elementi noti : ▪ Sintassi VBA ▪ Modello ad Oggetti di Excel ▪ Avvio applicazione Word da Excel ▪ Trasferimento dati da XL a Word ▪ Lettura dati in Word da XL ▪ Apprendimento: ▪ Utilizzo campi unione da VBA ▪ Anticipazione ▪ Connessioni a Basi Dati 161 Clicca qui per aprire il file di esercitazione ESEMPIO_2_2.XLSM Clicca qui per aprire il file di esercitazione ESEMPIO_2_2.DOCM
  • 162. Esercitazione • Esempi di Automazione Invio Mail ▪ Elementi noti : ▪ Sintassi VBA ▪ Modello ad Oggetti di Excel ▪ Avvio applicazione Word da Excel ▪ Trasferimento dati da XL a Word ▪ Lettura dati in Word da XL ▪ Apprendimento: ▪ Interazione con oggetti MS Outlook ▪ Anticipazione ▪ Windows Script Host 162 Clicca qui per aprire il file di esercitazione ESEMPIO_2_6.XLSM
  • 163. L’angolo di Sheldon » Cenni su Windows Script Host » Esempio di utilizzo di WSH per realizzare una semplice interfaccia con R 163
  • 164. Windows Script Host » Windows Script Host (o WSH) (originalmente chiamato Windows Scripting Host, ma rinominato per le versioni successive) è un linguaggio di scripting preinstallato su Windows 98 e tutti i Windows successivi. Consente di creare script più potenti e versatili rispetto ai file batch (.BAT) del vecchio MS-DOS. A partire da Windows 2000 Server, WSH supporta gli script creati manualmente dagli utenti. » È language-independent perché può far uso di JavaScript e VBScript (di default), ma l'utente può decidere di installare diversi script engine (come Perl). » Praticamente qualsiasi operazione eseguibile da Windows può essere automatizzata da WSH. È uno strumento molto potente e versatile, ma proprio grazie alla sua potenza alcuni virus ne fanno uso per diffondersi. Dunque, se non si utilizza intensamente questo linguaggio potrebbe essere raccomandabile disattivarlo per motivi di sicurezza.
  • 165. WSH: File Operations » A differenza del VBA, le operazioni sui file non avvengono tramite istruzioni native del linguaggio ma attraverso l’oggetto FileSystemObject. » Scrittura su file: » Recupero del path correntemente in uso Clicca qui per aprire il file di esercitazione ESEMPIO_2_4.XLSM
  • 166. WSH: External Processes » Possiamo utilizzare WSH da VBA per lanciare processi esterni » Utilizzeremo questo oggetto per realizzare una semplice interazione fra VBA ed R Clicca qui per aprire il file di esercitazione ESEMPIO_2_5.XLSM
  • 167. Fine Modulo Uno Introduzione al VBA per Excel