Libro Vba
Libro Vba
Antonio Grande
Programmazione VBA e finanza
Soluzioni VBA di problemi di finanza classica e moderna
ISBN: 978-88-907402-0-6
Questopera stata rilasciata con:
licenza Creative Commons Attribuzione - Non commerciale 3.0 Unported.
La versione digitale dellopera disponibile al sito:
http://antoniogrande.uniroma1.it
Email [email protected]
a Piveloce.
1955 2006
ABSTRACT
The VBA (Visual Basic for Application) language has among its characteristics the capacity to interact with spreadsheet data, that has a
very simple structure.
This study, after having examined the language basic notions, suggests a methodology to find out automatic solutions for classic and
modern finance problems such as: the (pseudo)casual numbers generation, the price of the Asian and European Call/Put with BlackScholes and Montecarlo methods, the efficient frontier with the Markowitz model, the download of stock prices from Internet.
ABSTRACT
Il linguaggio VBA (Visual Basic for Application) ha tra le sue caratteristiche quella di interagire con i dati del foglio elettronico che utilizza
una struttura di dati concettualmente molto semplice.
Il libro, passati in rassegna i fondamentali dei linguaggio, propone le
soluzioni automatiche di problemi di finanza classica e moderna tra
cui citiamo: la generazione di numeri (pseudo)casuali, il calcolo di
una put/call sia per le opzioni europee che per quelle asiatiche con
Black-Scholes e Montecarlo, la frontiera efficiente con il modello di
Markowitz, lo scaricamento delle quotazioni di titoli da Internet.
vii
RINGRAZIAMENTI
ix
INDICE
i fondamentali vba
1
1 lambiente vba
5
1.1 LIDE di VBA
5
1.2 I comandi del menu
6
1.3 La barra degli strumenti
6
1.4 La finestra Progetto
7
1.5 La finestra Propriet
8
1.6 La finestra Codice
8
1.7 Gli errori del programma
9
1.8 Lesecuzione di una macro
10
2 dati ed espressioni
13
2.1 Tipologie di dati
13
2.2 Costanti e variabili
13
2.3 La dichiarazione delle variabili
14
2.4 Istruzioni di assegnazione
15
2.4.1 Lincremento di una variabile
16
2.4.2 Le espressioni logiche
16
3 le funzioni
19
3.1 Le funzioni Excel in VBA
19
3.2 Le funzioni VBA
19
3.3 La guida delle funzioni
20
3.4 La modifica dellordine degli argomenti
21
4 le istruzioni condizionali
25
4.1 If monoistruzione
25
4.2 If semplice
26
4.3 If .. Then .. Else
26
4.4 If nidificati
27
4.5 Select Case
28
5 i cicli
31
5.1 Il ciclo For Next
31
5.1.1 La sommatoria
32
5.2 Il ciclo Do While
34
5.3 Il ciclo Do . . Loop While/Until
35
5.4 Come interrompere un ciclo
36
6 le funzioni definite dallutente
39
6.1 La funzione InputBox
39
6.2 La funzione IsNumeric
40
6.3 La funzione ad un risultato
42
6.4 La funzione a pi risultati
43
7 la programmazione ad oggetti in vba
47
7.1 Propriet e metodi
47
xi
xii
indice
indice
121
117
xiii
Figura 1.1
Figura 1.2
Figura 1.3
Figura 1.4
Figura 2.1
Figura 3.1
Figura 3.2
Figura 5.1
Figura 5.2
Figura 6.1
Figura 7.1
Figura 12.1
Figura 12.2
Figura 12.3
Figura 12.4
Figura 12.5
Figura 12.6
Figura 12.7
Figura 13.1
Figura 13.2
Figura 13.3
Figura 14.1
Figura 15.1
Figura 15.2
Figura 15.3
Figura 16.1
Figura 16.2
Figura 16.3
Figura A.1
Figura A.2
xiv
Parte I
F O N D A M E N TA L I V B A
INTRODUZIONE
contenuto
Visual Basic for Application (VBA) il linguaggio di programmazione
Microsoft per la suite Office (Word, Excel, Power Point, Access).
Questo libro si occupa della soluzione di alcuni problemi di finanza classica e moderna con la programmazione in VBA del foglio
elettronico Excel. Non un manuale di Visual Basic.
Nella parte iniziale, capitoli 1-8, vengono illustrate la caratteristiche
principali del linguaggio corredate da numerosi esempi. Al termine
di ciascun capitolo presente un paragrafo di esercizi relativi agli
argomenti trattati.
I capitoli 9 e 10 sono dedicati a due argomenti di rilievo: le variabili
con indice e le operazioni con le matrici.
Dal capitolo 11 in poi sono presentate le soluzioni di alcuni tra
i principali problemi di finanza. Queste le soluzioni sono improntate alla generalizzazione del problema. Ricorrendo ad una facile
semplificazione
Alcune importanti precisazioni che riguardano lo stile con cui
sono stati scritti i programmi. Per motivi legati alle finalit del libro,
di carattere essenzialmente didattico, si tenga presente che:
le istruzioni non sempre cominciano a partire dalla prima colonna ma sono disposte secondo una tabulazione (allineamento
orizzontale) particolare. Questa tecnica, riconducibile alla programmazione strutturata , si utilizza per facilitare la leggibilit
del programma ma non assolutamente vincolante;
sempre al fine di miglioramento della leggibilit, abbiamo evitato di ricorrere ad istruzioni o artifici di programmazione. In
altre parole si preferito scrivere i programmi in uno stile orientato alla facilit di comprensione pi che alla velocit di esecuzione. Si tenga presente che questo approccio porta, di solito,
ad un aumento del numero di istruzioni.
versione del programma
Tutto il codice del libro stato verificato con il programma Microsoft
Office 2003. La versione pi recente di questo programma la 2010.
L A M B I E N T E V B A
lide di vba
Lambiente che utilizzeremo per la scrittura dei programmi si presenta sotto forma di interfaccia grafica a finestre di tipo IDE o Integrated Development Environment (ambiente di sviluppo integrato). In una
interfaccia di questo tipo, si dispone di un insieme intregrato di strumenti atti a facilitare il programmatore nella scrittura dei programmi.
Gli strumenti dellIDE VBA sono:
leditore di testi ovvero un ambiente che facilita la scrittura delle
istruzioni;
il debugger ossia lo strumento che facilita il controllo delle istruzioni;
un sistema per la navigazione tra i componenti del linguaggio.
La visualizzazione di questa finestra, chiamata anche finestra VBA,
si ottiene con i tasti Alt+F11 durante una sessione Excel. La vediamo
riprodotta nella figura 1.1. Da qui, come sar chiarito meglio nel prosieguo, potremo accedere a comandi, icone e quantaltro sia utile alla
memorizzazione, la scrittura, lesecuzione ed il controllo (debugging)
dei programmi. Pu essere suddivisa idealmente in due parti: una
superiore ed una inferiore e ciascuna di queste divisibile in ulteriori
parti.
Nella zona superiore si trova la barra del menu e, sotto di questa, la barra degli strumenti. Nella parte inferiore, suddivisa in tre
sottofinestre ridimensionabili e fluttanti, possiamo individuare:1
la finestra di gestione dei progetti (il suo titolo Progetto VBAProject);
1 se queste finestre non fossero visibili eseguire, per ciascuna di esse i comandi del
menu: Visualizza Gestione progetti per la prima, Visualizza Finestra propriet
per la seconda, Visualizza Codice per la terza.
lambiente vba
Figura 1.2: La barra dei menu (sopra) e la barra degli strumenti (sotto)
1.3
La barra degli strumenti si trova sotto quella dei comandi. E chiamata Standard in quanto esistono altre barre di strumenti che per semplicit, sono visualizzate a richiesta (si tratta delle barre Modifica, Debug
e User Form). Al passaggio del mouse sopra le icone che la compongono, si visualizza il titolo corrispondente. Presentiamo una elencazione di quelli che necessitano di approfondimento in base allordine di
visualizzazione.
Visualizza Microsoft Excel visualizza la finestra con la cartella Excel.
Inserisci User Form la sua funzione verr commentata nel capitolo
appositamente dedicato.
Salva salva la cartella di lavoro insieme a tutto cio che si trova nella
finestra delleditor. Si tenga presente, se siamo partiti da una cartella vuota, che alla cartella di lavoro viene attibuito in automatico un nome costituito dal prefisso Cartel seguito da un numero
intero progressivo. Se vogliamo attribuire un nome mnemonico
alla cartella corrente si consiglia di non usare questa icona per il
salvataggio. In questo caso necessario ritornare nellambiente
Excel e ricorrere ai comandi del menu File Salva con nome.
Taglia
Copia
Incolla
Trova
Impossibile annullare
Impossibile ripetere
Esegui Sub/User Form si usa per eseguire un programma VBA; se
ne parler nel prossimo paragrafo.
Interrompi sospende lesecuzione del programma.
Ripristina si utilizza quando lesecuzione del programma si arresta
a causa di un errore. In questo caso viene evidenziata listruzione che lo ha generato e lutente premendo questo pulsante
riporta il programma allo stato iniziale (ovvero nello stato in cui
si trovava prima dellesecuzione).
Modalit progettazione
Gestione progetti visualizza la finestra corrispondente.
Finestra Propriet visualizza la finestra corrispondente.
Visualizzatore Oggetti visualizza la finestra corrispondente.
1.4
la finestra progetto
lambiente vba
Sotto la barra del titolo troviamo tre pulsanti. Del primo ci occuperemo ampiamente pi avanti. Il secondo visualizza la cartella di lavoro (il foglio elettronico) mentre il terzo espande/comprime le cartelle
che compaiono nella finestra del progetto.
1.5
la finestra propriet
La finestra Propriet elenca tutte le propriet delloggetto selezionato che di regola il foglio corrente. Anche questa finestra, come la
precedente, pu essere chiusa. Per riaprirla basta utilizzare lapposito
pulsante che si trova a destra del pulsante Gestione progetti.
1.6
la finestra codice
Nel caso avessimo sbagliato qualcosa nella scrittura delle istruzioni necessario cercare la causa dellerrore. Questa pu dipendere
sostanzialmente da due differenti motivi.
Per simulare il primo di questi cancelliamo una parte della seconda
riga del programma (p.e. quella che segue la seconda virgola). In
questo caso il comando manca di una sua parte essenziale, ovvero
dellintestazione della finestra. Non appena spostiamo il cursore dalla
riga in cui ci troviamo viene visualizzata una finestra che riporta un
messaggio simile a quello mostrato nella figura sottostante. Si nota
10
lambiente vba
Una volta passati in rassegna i componenti fondamentali dellinterfaccia con lambiente di programmazione, possiamo approfondire
meglio il funzionamento delle procedure.
Chiudiamo la cartella di lavoro senza preoccuparci di salvare alcunch. Apriamo quindi la cartella di lavoro ciccio1.xls ed utilizzando
la combinazione di tasti Alt F11 visualizziamo la finestra del codice.
Il codice di ciccio1.xls.
Sub Main()
femmina
End Sub
Sub maschio()
MsgBox "ciao bello!", , "Titolo della Finestra "
End Sub
Sub femmina()
MsgBox "ciao bella!", , "Titolo della Finestra "
End Sub
nel caso in cui venga eseguita una procedura che contiene una
chiamata ad unaltra verr eseguita anche questultima laddove
richiesto dal chiamante.
Per verificare quanto sopra possiamo eseguire una delle tre procedure spostando opportunamente il cursore lampeggiante. In alternativa possiamo sostituire il nome della procedura chiamata da Main
scrivendo maschio al posto di femmina etc.
esercizi
1. A partire da un foglio di lavoro vuoto, scrivere nel modo ritenuto pi idoneo una procedura con le seguenti istruzioni:
Sub primo()
MsgBox "a", , "b"
End Sub()
11
D AT I E D E S P R E S S I O N I
Ci occuperemo ora delle tipologie di dati che pu trattare un programma VBA nonch dello spazio che ciascuno di questi dati occupa
in memoria. Allo scopo di chiarire meglio di cosa stiamo parlando,
faremo ora alcune considerazioni preliminari che ci permetteranno
esporre largomento oggetto di questo capitolo.
2.1
tipologie di dati
costanti e variabili
13
14
dati ed espressioni
2.3
Costanti
Variabili
istruzioni di assegnazione
Nome = "Antonio"
- effettua il calcolo di una espressione ed assegna il risultato ad
una variabile
Gio = 1 + 1.51
- assegna una variabile ad una cella (scrive nella cella A21)
15
16
dati ed espressioni
Una conseguenza notevole della logica sottesa allistruzione di assegnazione riguarda il concetto di incremento di una variabile. Con
incremento di una variabile si intende la somma o la sottrazione di
una certa quantit ad una variabile, riassegnando poi cos ottenuto
alla stessa variabile. Per poter fare questo dovranno essere definite
almeno due funzionalit:
una istruzione iniziale del valore 0 alla variabile (di 1 nel caso
della produttoria);
listruzione di assegnazione per lincremento/decremento.
Un esempio di questo tipo visibile nel codice seguente che si trova
scritto nella parte finale della procedura:
. . .
VariabileModulo = 0
VariabileModulo = VariabileModulo + 2
. . .
Le espressioni logiche
lere Vero oppure Falso. Utilizzando opportuni operatori, chiamati operatori logici, possibile costruire espressioni logiche il cui
risultato pu essere assegnato a variabili dello stesso tipo.
Codice 2.2: Una espressione logica
. . .
Dim Verro As Boolean
. . .
Verro = 4 > 5
. . .
17
18
dati ed espressioni
5. Ricordando che:
5:3=1
(resto2)
e che:
quoto
LE FUNZIONI
le funzioni vba
19
20
le funzioni
21
22
le funzioni
sintassi alternativa, presente nella seconda MsgBox, non abbia necessit di specificare il secondo argomento. Questo si spiega con il fatto
che lassociazione argomento-valore viene fatta solamente per gli argomenti presenti. Si noti anche il carattere di separazione := tra il
nome di un argomento ed il suo valore5 .
Codice 3.1: La modifica degli argomenti della funzione
Sub messageBox()
MsgBox "Suggerimento in posizione a priori ", , "Titolo"
sintassi alternativa che specifica i parametri della funzione
secondo un ordine diverso da quello stabilito a priori
esercizi
1. Nelle celle da A1 ad H1 si trovano scritti una serie di numeri compresi tra 20 e 22. Calcolare la somma di questi numeri
e scrivere il risultato nella cella A2 assieme al messaggio: La
somma dei numeri . Se, per esempio la somma 160, in A2
deve essere scritto: La somma dei numeri 160.
2. Come sopra ma la serie composta da numeri compresi tra
1000 e 10000.
3. In A1 scritto il tuo codice fiscale. Riporta in A2 il codice del
mese in cui sei nato (il mese codificato nel nono carattere).
4. La cella A1 contiene la costante stringa 12,2 (ovviamente nella
cella non ci sono i doppi apici). Si deve scrivere in B1 il numero
12 e in C1 il numero 2.
5. La cella A1 contiene una costante stringa simile alla precedente
in cui le parti che precedono e seguono la virgola hanno un
numero di cifre non conosciuto a priori (mai per maggiore di
4). Si deve scrivere in B1 il numero che precede la virgola e in
C1 il numero che segue la virgola.
6. Utilizzando lo strumento ritenuto pi opportuno, chiarire la
differenza tra le funzioni Str e CStr.
7. La cella A1 contiene il tuo indirizzo di posta elettronica. Scrivere la procedura che calcola in B1 ed in C1 rispettivamente il
5 In una procedura, terminata la scrittura di una funzione, dopo aver inserito la parentesi aperta, compare una finestra con il nome di quella funzione seguita dallelenco
degli argomenti.
23
LE ISTRUZIONI CONDIZIONALI
Negli esempi visti finora, le istruzioni del programma venivano eseguite comunque. Questa modalit non adatta a risolvere le situazioni in cui richiesta una diversificazione nei comportamenti del
programma in relazione a determinati eventi.
Quando questo accade possibile utilizzare un insieme di istruzioni, chiamate condizionali, che definiscono percorsi alternativi in
relazione al codice da eseguire. Vediamo di cosa si tratta.
4.1
if monoistruzione
in cui espressione_condizionale una qualunque espressione logica, come quella del codice 2.2, e istruzioni rappresenta una o pi istruzioni
che devono trovarsi nella stessa riga dellIf. Qualora le istruzioni siano pi di una, deve essere utilizzato il carattere : a separare luna
dallaltra1 .
A titolo di esempio, cui ci riferiremo in tutto il capitolo, supponiamo di voler calcolare le soluzioni di una equazione di secondo grado,
dati i tre coefficienti A, B, C2 .
Nella cartella di lavoro ifthenelse.xls la procedura IfThenElse1
contiene il primo esempio di If monoistruzione. Con questo tipo di
istruzione condizionale la capacit elaborativa molto bassa in relazione al problema che dobbiamo risolvere. Lunica possibilit che abbiamo quella di scrivere una stringa relativa al tipo di soluzioni (reali/immaginarie). Nel codice 4.1 ne vediamo un esempio: il risultato
del calcolo di , viene riportato in A1.
Codice 4.1: If monoistruzione
Sub IfThenElse1()
Dim A As Single, B As Single , C As Single , Delta As Single
1 Se ne sconsiglia luso per motivi di leggibilit. Si veda nel paragrafo successivo come
risolvere questo problema.
2 Lassegnazione dei tre valori numerici alle corrispondenti variabili stata fatta con
istruzioni di assegnazione. Questa scelta comporta una perdita di generalit nella
soluzione ma si giustifica per motivi di semplicit.
25
26
le istruzioni condizionali
A=2
B=5
C=2
Delta = (B ^ 2) 4 A C
Cells (1, 1).Value = "Due soluzioni reali ( distinte /non)"
If Delta < 0 Then Cells(1, 1).Value = "Due soluzioni immaginarie"
End Sub
if semplice
Come visto in precedenza questa soluzione non si presta ad aumentare le nostre capacit risolutive in relazione al problema da risolvere.
4.3
if .. then .. else
Quando si debbano eseguire insiemi di istruzioni mutuamente esclusivi, si impiega questo tipo di istruzione. La sintassi :
If espressione_condizionale Then
. . .
istruzioni (blocco 1)
. . .
Else
. . .
istruzioni (blocco 2)
. . .
End If
3 Ricorrendo a qualche forzatura, si potrebbe aggirare lostacolo, ma si tratta di artifici che dati i nostri obbiettivi non il caso di approfondire. Si veda il prossimo
paragrafo.
4.4 if nidificati
La soluzione, dal punto di vista della leggibilit, senzaltro migliore rispetto al caso precedente ma la capacit del programma, in
relazione al problema da risolvere, rimane ancora scarsa.
4.4
if nidificati
Nulla vieta che allinterno dei blocchi di istruzioni visti nel caso precedente, si trovino ulteriori istruzioni condizionali. Si parla in questo
caso di If nidificati. Questa soluzione permette di aumentare notevolmente le nostre capacit di calcolo ma la leggibilit risulta abbastanza penalizzata nonostante la differente tabulazione. Il codice che
mostriamo si riferisce alla procedura IfThenElse3.
Sub IfThenElse3()
. . .
Delta = (B ^ 2) 4 A C
If Delta < 0 Then
Cells (1, 1).Value = "Due soluzioni immaginarie"
Else
If Delta = 0 Then
X1 = B / (2 A)
Cells (1, 1).Value = "X1=X2= " & Str(X1)
Else
X1 = (B Sqr(Delta)) / (2 A)
X2 = (B + Sqr(Delta)) / (2 A)
Cells (1, 1).Value = "X1= " & Str(X1)
Cells (2, 1).Value = "X2= " & Str(X2)
End If
End If
End Sub
27
28
le istruzioni condizionali
4.5
select case
in cui:
espressione una qualunque espressione numerica o stringa;
elenco condizioni1, elenco condizioni2, possono essere espressioni
oppure espressioni condizionali;
istruzioni sono una o pi istruzioni.
Il comando calcola il risultato di espressione e lo confronta con gli
elenchi di condizioni di ciascun Case. Quando una di queste condizioni soddisfatta, vengono eseguite le istruzioni corrispondenti al
Case. Il controllo del programma, fatto questo, passa alla prima istruzione seguente End Select. Viceversa, se nessuna delle condizioni dei
vari elenchi di condizioni viene soddisfatta ed presente Case Else,
vengono eseguite le istruzioni che si trovano al suo interno4 .
Allo scopo di dimostrare il funzionamento del comando Case si
consideri la procedura IfThenElse4 ottenuto dalla sostituzione in
IfThenElse3 di If con Case (lasciamo al lettore un giudizio sulla
leggibilit tra i due).
Sub IfThenElse4()
Dim A As Single, B As Single , C As Single , Delta As Single , X1 As Single, X2
As Single
A=2
B=5
C=2
Delta = (B ^ 2) 4 A C
Select Case Delta
Case Is < 0
Delta < 0
4 Le parentesi quadre evidenziano che si tratta di una parte che non obbligatoria.
Case Is > 0, Is = 0
Cells (1, 1).Value = "Due soluzioni reali ( distinte /non)"
Case Else
Cells (1, 1).Value = "Due soluzioni immaginarie"
End Select
End Sub
Case 1 To 3
MsgBox "I compreso tra 1 e 3"
nel caso si tratti di una lista di variabili/espressioni
Case 3, 5, 7, 9
5 Il nome attribuito a questa procedura non casuale.
29
30
le istruzioni condizionali
esercizi
1. Riprodurre il codice 4.1 sostituendo alla scrittura nella cella A1
un opportuno messaggio.
2. La cella A1 contiene un codice fiscale (CF). Riportare in A2 il
giorno di nascita relatvo a quel CF sotto forma di numero (il
giorno di nascita scritto nei caratteri 10-11 di CF). Si ricorda che in CF la codifica del giorno di nascita maggiore di 31
quando si tratta di una femmina. In tal caso il giorno di nascita
effettivo si ottiene sottraendo 40 al numero corrispondente in
CF. Se la cella A1 contenesse GRNNTN53P26H501S, dopo aver eseguito il programma, la cella A2 dovr contenere il numero 26
(il codice di un maschio). Se A1 contenesse GRNNTN53P46H501S,
dopo aver eseguito il programma, A2 dovr contenere comunque il dato 26. In questo caso il sesso del soggetto intestatario
del CF femminile.
3. Riscrivere il codice di ifthenelse1() tenendo presente che i tre
coefficienti sono scritti nelle celle A1, B1, C1.
4. Riscrivere il codice di ifthenelse1() modificando la condizione
Delta < 0 in Delta >= 0.
5. Riscrivere il codice di ifthenelse3() modificando la condizione
Delta < 0 in Delta > 0.
I CICLI
Il ciclo o loop costituisce uno dei costrutti fondamentali nella programmazione in quanto permette di gestire con facilit la ripetizione
di una o pi istruzioni. Gli strumenti disponibili alla gestione della ripetizione sono molteplici e dipendono dalla condizione che ne
presiede il funzionamento. Nei paragrafi che seguono passeremo in
rassegna i diversi modi di eseguire un loop.
5.1
31
32
i cicli
La sommatoria
Sotto il commento CICLO2a riportato un esempio in cui i valori assunti dalla variabile di controllo nel corso del loop (1, 2, 3, 4, ..., 10)
vengono utilizzati allinterno delle istruzioni da ripetere per eseguire
la somma dei primi 10 numeri2 .
Codice 5.1: La sommatoria
. . .
Totale = 0
For M = 1 To 10
Totale = Totale + M
Next M
Cells (1, 3).Value = "La somma dei primi 10 numeri e " & Str(Totale)
. . .
Si nota, trattandosi della sommatoria di un insieme numeri, listruzione di azzeramento ad inizio loop Totale = 0 e, allinterno del ci2 ATTENZIONE allinterno di un ciclo vietato assegnare un valore alla variabile di
controllo (p.e. scrivere unistruzione come M = 15). Questo perch la gestione di
qesta variabile appannaggio del ciclo e la sua modifica dallesterno pu causare
malfunzionamenti o errori nel programma.
Totale = 0
For M = 2 To 20 Step 2
Totale = Totale + M \ 2
Next M
Cells (1, 3).Value = "La somma dei primi 10 numeri e " & Str(Totale)
Si nota luso della parola Step necessaria a definire incrementi della variabile di controllo diversi da 1. Oltre questo si possono notare
le modifiche necessarie alle istruzioni interne al ciclo per correggere
leffetto dovuto ai valori assunti da M.
Nel primo ciclo i valori assunti da M nel corso del ciclo sono 11, 10,
..., 3, 2. Nel secondo 2, 4, ..., 18, 20.
Le istruzioni sotto CICLO3 si caratterizzano per luso della variabile
di controllo del ciclo in veste di indirizzo di colonna della cella in cui
scrivere. A questo proposito si rammenti quanto detto nel capitolo
sulle funzioni riguardo la sostituibilit degli argomenti.
. . .
For M = 1 To 10
Cells (30, M).Value = M
Next M
. . .
33
34
i cicli
5.2
il ciclo do while
4 in uno dei prossimi capitoli vedremo come questo problema sia facilmente risolvibile
in modo diverso. Per ora ipotizzeremo di non avere nessunaltra risorsa che questa.
. . .
CICLO4
M=1
premesso che Cells(riga, colonna).Value = "" significa cella vuota
possiamo dire che
il ciclo viene eseguito fintantoche la condizione e Vera
M=1
il ciclo viene eseguito fintantoche la condizione e Falsa
5.3
Nei precedenti paragrafi abbiamo visto come la condizione che determina lesecuzione del ciclo viene testata a monte delle istruzioni da
ripetere. Pu capitare invece che le istruzioni interne al ciclo debbano
essere eseguite almeno una volta. In questo caso la condizione che ne
presiede il funzionamento deve trovarsi alla fine e non allinizio del
ciclo e si usa Do .. Loop While.
Si vuole contare in modo ordinale la posizione di una lettera dellalfabeto (la lettera g nel nostro esempio). Per risolvere il problema
mettiamo in due colonne del foglio in corrispondenza biunivoca ciascun carattere dellalfabeto con il corrispondente valore ordinale. Se
35
36
i cicli
Do
M=M+1
Loop While Carattere <> Cells(M, 10).Value
Cells (7, 3).Value = "La lettera " & Carattere & " e " & _
Cells (M, 11).Value & " carattere dell alfabeto "
End Sub
5.4
parolaDaCercare = "ciccio"
parolaDaCercare = "pirata"
For M = 1 To 15
If parolaDaCercare = Cells (M, 2).Value Then Exit For
Next M
If M>15 Then
MsgBox "Eureka"
Else
MsgBox "Buuu"
End If
End Sub
Si nota il comando Exit For che provoca luscita dal ciclo quando
la stringa da ricercare viene trovata. Listruzione condizionale dopo il
ciclo permette di sapere se la ricerca ha avuto esito positivo o negativo
a causa della terminazione anticipata.
Diverso il caso di interruzione forzata dovuta ad un errore di
logica non prevsto nel programma. Il seguente codice simula una
situazione di questo tipo nella quale il ciclo si ripete fino ad esaurire
le righe della colonna. In queste condizioni, non avendo di meglio, si
ricorre alla combinazione di tasti Ctrl+Interr.
Sub cicloInfinito ()
Dim I As Long
I =0
Do
I =I +1
MsgBox "Sono a riga " & Str(I)
Loop While Cells( I , 2) = ""
End Sub
esercizi
1. Nella zona di celle A1.A13, sono presenti un insieme di 13 numeri uno per ogni cella. Scrivere il programma che calcola la
somma e la media di questi numeri e scrive questi due risultati in altrettante celle (la soluzione non dovr impiegare alcuna
funzione Excel/VBA).
2. Riempire alcune celle del foglio con stringhe di caratteri. Calcolare, riportando il risultato in una MsgBox, la lunghezza media
x delle stringhe che riempiono le celle in base alla relazione:
x=
numero_totale_di_caratteri
numero_di_celle_piene
37
38
i cicli
L E F U N Z I O N I D E F I N I T E D A L L U T E N T E
la funzione inputbox
Nella cartella di lavoro del paragrafo 3.2 abbiamo elencato, senza discuterne, la funzione InputBox. Essa visualizza una finestra che richiede linserimento di un dato in un apposito spazio chamato campo.
Ne vediamo un esempio nella figura 6.1.
La funzione ha cinque argomenti costituiti da: la richiesta relativa
al dato da inserire, il titolo della finestra, la risposta predefinita che
viene visualizzata nel campo di input, le coordinate x,y, espresse in
twips2 dellangolo alto sinistro della finestra.
Le istruzioni che producono la finestra della figura sono contenute
nella procedura che fa parte della cartella di lavoro inpututente.xls.
Codice 6.1: La funzione InputBox
Sub interazione_con_utente()
Dim inputUtente As String
Dim InputUtente1 As Integer
inputUtente = InputBox("Io voto per ", "SCHEDA ELETTORALE", _
, 0, 0)
MsgBox inputUtente
End Sub
Si nota la dichiarazione della variabile inputUtente che, coerentemente con il risultato calcolato dalla funzione, di tipo String.
Una prima utile applicazione di questa funzione contenuta nella
procedura InserisceInputQualsiasi, parzialmente visibile nel codice 6.2. Essa trasferisce il dato immesso nel campo di InputBox nelle
celle della colonna A, partendo dalla prima riga. Lazione controllata da un ciclo che si ripete fintantoch si inserisce nel campo almeno
un carattere. Diversamente la ripetizione viene conclusa.
1 Se la richiesta relativa ad un dato numerico sar necessario accertarsi che non siano
presenti caratteri estranei.
2 1 pixel = 15 twips
39
40
6.2
la funzione isnumeric
Quando si inserisce un dato pu essere utile verificare se esso coerente con quanto richiesto. La funzione IsNumeric si rivela di grande
utilit a questo fine perch controlla che nel suo argomento siano
presenti soltanto caratteri numerici. Il risultato di questa funzione
una variabile booleana (ne avevamo parlato al termine del paragrafo 2.4) e sar Vero qualora il test sulla presenza di sole cifre sia stato
favorevole.
Codice 6.2: Ciclo di inserimento con InputBox
. . .
Do
risultato Vero
MsgBox "Il risultato di IsNumeric su una cella vuota e " & IsNumeric(Cells (1,
1).Value)
a = Cells (1, 1).Value
MsgBox "Il valore di a dopo l assegnazione di una cella vuota e " _
& Val(a) questo spiega IsNumeric(cellavuota)=True
numerici
I =I +1
End If
Loop While inputUtente <> ""
End Sub
41
42
La procedura InserisceInputNumerico_varianteSelect che si trova di seguito a quella appena vista, la variante con luso del comando Select.
6.3
la funzione ad un risultato
Nel capitolo dedicato alle funzioni abbiamo discusso delle modalit di richiamo delle funzioni sia di Excel che di VBA. In questo
paragrafo e nei successivi parleremo di funzioni definite dallutente.
Consideriamo il seguente codice:
Una funzione definita dallutente e ..
Function ciccioriccio () As String
ciccioriccio = "123sftgrtg"
End Function
inputUtente = ""
End If
Loop While inputUtente = ""
richiesta_dato_numerico_Cargomento = inputUtente
End Function
********************** la chiamata alla funzione
Sub prova_function_rdm1()
Dim domanda As String
domanda = "Quanti anni hai?"
MsgBox richiesta_dato_numerico_Cargomento(domanda)
End Sub
la funzione a pi risultati
43
44
End If
MsgBox "X1= " & CStr(x1) & Chr\$(13) & "X2= " & CStr(x2)
End Sub
delta = b ^ 2 4 a c
sw_ok = True
If delta < 0 Then
sw_ok = False
Else
calcolo di x1 e x2 ATTENZIONE alle conversioni
esercizi
1. Un programma deve chiedere linserimento di tre dati numerici
in tre celle del foglio scelte a piacere. Le istruzioni dovranno
prevedere un ciclo che si ripete fintantoch tutti e tre i numeri
non sono stati acquisiti.
2. Scrivere la Function che calcola le soluzioni di una equazione
di II^ grado. Si tenga presente che i tre coefficienti a, b, c, si
trovano in altrettante celle del foglio scelte a piacere. Oviamente,
5 Sarebbe stato pi semplice definire a, b, c come variabili di tipo Single. La scelta
dovuta a motivi di coerenza con quanto fatto nel paragrafo 4.1.
45
propriet e metodi
Nella terminologia OOP, con il termine propriet, intendiamo riferirci alle caratteristiche di un oggetto equiparabili, nel linguaggio
naturale, agli aggettivi ovvero alle qualit.
Tutti noi conosciamo loggetto Radio. Le sue qualit sono costituite
dal modo di funzionare (analogica o digitale), oppure dal suo colore
(bianco o verde), oppure dal suo peso. Proseguendo nellanalogia possiamo anche capire come alcune propriet siano modificabili mentre
altre non lo sono: posso cambiare il colore della radio, ma non posso
modificare linsieme delle frequenze che riceve.
Sugli oggetti possiamo poi eseguire determinate azioni che, nella
terminologia OOP, si chiamano metodi. Sempre in riferimento alloggetto Radio possiamo eseguire unazione costituita dallaccendersi,
lo spegnersi, il sintonizzarsi, laumento o la diminuzione del volume.
Il vantaggio della programmazione ad oggetti che il programma
non si preoccupa di come fare ad eseguire lazione, esso deve semplicemente chiedere di eseguirla. Dunque, se voglio accendere/spegnere la radio, eseguir il metodo spegni oppure accendi senza
preoccuparmi di come questo sia realizzato fisicamente nelloggetto.
47
48
7.2
le propriet in vba
Nellesempio Cells(21,1) rappresenta loggetto; Value la propriet costituita dal contenuto (il valore); Gio unespressione nella
forma pi semplice (il nome di una variabile).
In generale, nel caso di unassegnazione, la sintassi sar del tipo:
Oggetto.Propriet = espressione
mentre per la lettura, il riferimento alloggetto ed alla propriet, potr
essere ottenuto riferito in vari modi (si veda il codice poco oltre).
Si tenga presente che espressione una qualsiasi espressione che
abbia come risultato un valore compatibile con la propriet (Value nel
caso del nostro esempio) riferita alloggetto Cells in base al criterio
della compatibilit. Infine Propriet una qualsiasi propriet valida
per loggetto Cells.
Nella cartella di lavoro proprieta_metodi.xls sono presenti diverse procedure ricche di esempi significativi. I commenti a fianco delle
istruzioni dovrebbero bastare a chiarirne il significato.
La prima di queste, denominata proprieta, visualizza con una funzione MsgBox, le propriet di altrettanti oggetti del foglio. In tutti questi esempi il carattere . separa loggetto (a sinistra) dalla propriet
(a destra).
MsgBox
MsgBox
MsgBox
MsgBox
MsgBox
Solo una notazione sulla scrittura di una formula in una cella. Nellultima istruzione dellesempio si nota che la formula deve essere
racchiusa tra doppi apici (come se si trattasse di una stringa).
7.4
i metodi in vba
49
50
Exit Sub
Per capire bene il suo effetto sul foglio Excel consigliabile eliminare
il carattere di commento che abbiamo inserito davanti allistruzione di
uscita dalla procedura per evitare di eseguire le istruzioni successive.
La sintassi definita allinizio del paragrafo relativa all esecuzione
di un metodo non sempre cos lineare. Nel prossimo esempio la
zona di selezione, costituita da una sola cella, individuata in base
ad uno spostamento rispetto alla cella corrente.
. . .
si usa il riferimento denominato R1C1
dunque 5 righe in avanti, 4 colonne indietro
rispetto alla cella F7
Range("F7").Offset(5, 4).Select
Exit Sub
. . .
ActiveSheet .Range("A1").CurrentRegion.Select
. . .
51
52
Range("F7:E5").Clear
alla generalizzazione del metodo, il codice della prossima procedura. Se largomento di Range una stringa di caratteri, possibile
esprimere la zona sotto forma di variabile. Di conseguenza sar possibile il riutilizzo di questa procedura, opportunamente modificata,
per essere generalizzata.
7.6
le collezioni di oggetti
4 Come vedremo tra poco possibile creare oggetti e quindi anche collezioni. Agli
oggetti creati dallutente, a differenza di quelli predefiniti, possono essere assegnate
propriet a piacimento.
MsgBox esempio.Rows.Count
MsgBox esempio.Columns.Count
ritorna 4
ritorna 3
7.7
loggetto excel
In alcuni casi, nel codice VBA, necessario riferirsi al programma Excel come, p. e., quando dobbiamo utilizzare una funzione di questo
programma che non ha corrispondenti in VBA. Il problema era stato posto, senza che venisse data una spiegazione, nel paragrafo 3.1.
Abbiamo ora la possibilit di risolvere il problema con il riferimento
alloggetto Application che in VBA il nome del programma Excel.
Cos la somma di una zona di celle sar calcolata con la funzione Sum
che richiede come argomento loggetto Range. Nella stessa procedura
viene impiegata unaltra interessante funzione del foglio che calcola
il numero di celle piene di una zona. Si ricorda che il nome della
53
54
totCelle = Application.Sum(Range("A1:B3"))
MsgBox "la somma dei numeri in A1:B3 e " & CStr(totCelle)
CountA e lequivalente inglese della funzione CONTAVALORI
conta_piene = Application.CountA(Range("A1:C4"))
MsgBox "le celle piene in A1:C4 sono " & CStr(conta_piene)
End Sub
7.8
Nella programmazione VBA risulta di notevole importanza la gestione dei fogli di una cartella di lavoro. Negli esempi che andiamo ad
illustrare, relativi a questo argomento, consigliabile partire da una
cartella di lavoro vuota. consigliabile inoltre, per comprendere bene
cosa accade allesecuzione del codice, tenere aperta la finestra VBA in
modo da vedere, in secondo piano, la finestra Excel nella parte che
visualizza le linguette corrispondenti ai fogli come evidenziato nella
figura seguente.
che si differenzia dal precedente oltrech per la posizione di inserimento, anche perch loggetto non ha un riferimento costituito dal
nome5
Con i comandi visti fono ad ora, ai nuovi fogli veniva dato un
nome costituito dal prefisso Foglio seguito da un numero progressivo.
Volendo attribuire un nome diverso possiamo agire sulla propriet
costituita dal nome delloggetto attribuendogli un nome diverso. Il
codice per fare questo dato da:
Worksheets.Add
si ipotizza che non esista un foglio con lo stesso nome
diversamente si verifichera una condizione di errore
55
56
miscellanea
7.9 miscellanea
Si tratta del codice che definisce il colore di fondo di una zona. Volendo inserire dei bordi per le celle della zona dobbiamo utilizzare il
codice sottostante:
. . .
Range("B2:C4").Select
With Selection .Borders(xlEdgeLeft)
. LineStyle = xlContinuous
.Weight = xlThin
. ColorIndex = xlAutomatic
End With
With Selection .Borders(xlEdgeTop)
. LineStyle = xlContinuous
.Weight = xlThin
. ColorIndex = xlAutomatic
End With
With Selection .Borders(xlEdgeBottom)
. LineStyle = xlContinuous
.Weight = xlThin
. ColorIndex = xlAutomatic
End With
With Selection .Borders(xlEdgeRight)
. LineStyle = xlContinuous
.Weight = xlThin
. ColorIndex = xlAutomatic
End With
queste due istruzioni servono ad inserire
le righe orizzontali/verticali interne alla zona
Range("B2:C4").Borders.LineStyle = xlContinuous
Range("B2:C4").Borders.Weight = xlThin
57
58
. . .
esercizi
1. Assegnato il risultato di Cells(5,2).Address ad una opportuna
variabile, si scriva la funzione che trasforma tale risultato da
riferimento assoluto a riferimento relativo. Si tenga presente il
risultato di MsgBox Cells(3,3).Address visto dianzi.
2. La colonna A, a partire da una riga qualsiasi, contiene una sequenza di celle piene. Contare le celle piene della zona utilizzando 2 differenti modalit.
LE LIBRERIE DI PROGRAMMI
Nei programmi presentati fino ad ora, il codice era stato scritto senza
prestare attenzione alla sua collocazione. In tal caso esso si trova associato al foglio Foglio1. Una semplice verifica di questo si pu avere sia
aprendo una qualunque delle cartelle riferite nei capitoli precedenti,
sia aprendo un foglio vuoto. Da un esame della figura, che si riferisce
il modulo
Quando il numero di procedure di una cartella di lavoro incomincia a diventare cospicuo pu ritornare utile organizzarle in una qualche forma. Il primo mattone di questa organizzazione costituito dal
concetto di modulo definibile come una raccolta di procedure.
Un modulo pu essere creato con la sequenza di comandi Inserisci
Modulo. Dopo aver eseguito questa operazione si noter, nella finestra del progetto la comparsa di una cartella denominata Moduli ed al
1 Si pensi al lavoro da fare qualora si dovesse procedere allaggiornamento di una
procedura copiata in svariate cartelle!
59
60
le librerie di programmi
la libreria
61
62
le librerie di programmi
3. confermare il tutto con la selezione del pulsante Apri; fatto questo la finestra di dialogo Riferimenti - VBAProject mostra un
segno di spunta mentre nella finestra del progetto vedremo
comparire il nome del progetto appena collegato;
4. terminare tutto con il pulsante OK.
Da questo momento in poi tutte le modifiche alla libreria comune
si rifletteranno in automatico sul programma/i che contiene/contengono riferimenti a quella libreria (ricordarsi di salvare dopo queste
modifiche la cartella di lavoro su cui abbiamo appena operato).
Se ancora non lavessimo fatto, possiamo scrivere le istruzioni che
fanno riferimento a procedure della libreria anche se, va detto per
correttezza, questo fatto viene rilevato soltanto durante lesecuzione.
Prima di chiudere il capitolo ricordiamo al lettore che uno degli
errori pi frequenti nelluso delle librerie quello di un collegamento
non attivo con la libreria di programmi. Perci, quando si dovesse
verificare un errore su una procedura di una libreria chiamata da un
qualche programma, verificare sempre lesistenza di un collegamento
alla cartella/libreria comune con il comando del menu del menu Strumenti > Riferimenti. In particolare verificare la presenza del carattere
di spunta corrispondente alla cartella che contiene la libreria.
esercizi
1. La padronanza nelluso delle librerie di programmi di importanza fondamentale in VBA. Si consiglia perci di ripetere pi
volte la creazioe e la chiamata di una libreria a partire da una
cartella vuota.
Parte II
FINANZA
L E VA R I A B I L I C O N I N D I C E
definizione
65
66
risolviamo non conosciuto a priori il numero di osservazioni riportate nella colonna A (nel nostro esempio si tratta di 20 osservazioni).
In queste condizioni la fine dei dati segnalata da una cella vuota. La
soluzione del problema riassunta nei seguenti punti:
1. dichiarazione delle variabili;
2. azzeramento del vettore delle frequenze (si ricordi quanto detto
nel paragrafo 2.4 e quanto riportato nel listato 5.1);
3. inizializzazione dellindice di riga utile ad individuare, una alla
volta nel ciclo, le celle che contengono le et;
4. ciclo da ripetere a condizione che la cella contenga un dato;
- calcolo dellindice del vettore delle frequenze in cui conteggiare quella et 6 ;
- controllo dellindice ed eventuale correzione7 ;
- incremento del vettore delle frequenze;
- incremento dellindice di riga (per la cella dellet);
5. terminati i dati da suddividere in classi, procediamo alla copia
del vettore delle frequenze nelle celle del foglio (zona E4:E14).
Nella procedura calcola_distribuzione_frequenza sono scritte le
istruzioni del programma. Tra le dichiarazioni notiamo quella relativa
alla variabile con indici destinata a memorizzare le frequenze (freq).
Si tratta di una variabile con un indice composta di 11 elementi.
67
68
Sub calcola_distribuzione_frequenza ()
Dim classe_eta As Integer
dichiarazione e dimensionamento della variabile con indici
Nel codice visibile la parte iniziale del programma quella che procede alla dichiarazione ed al dimensionamento della variabile con indici. Tra le prime istruzioni del programma abbiamo riprodotto anche
il punto 2 della soluzione.
esercizi
1. Risolvere il problema trattato in questo capitolo utilizzando i
comandi visti nei paragrafi 7.4 e 7.5 per il conteggio delle celle
piene della zona da utilizzare in un ciclo For Next che sostituisce
il Do While.
10
L E O P E R A Z I O N I S U L L E M AT R I C I
Nella soluzione dei problemi di finanza, si ricorre di frequente ad operazioni su variabili con indice. Queste operazioni, disponibili in Excel
sotto forma di funzioni matrice, possono essere eseguite anche con
la programmazione VBA. In questo capitolo ci occuperemo di questo
problema calcolando: la matrice trasposta, il prodotto di matrici e la
matrice inversa.
10.1
la matrice trasposta
Data una matrice A di n righe e m colonne, la trasposta di A, che indicheremo con AT , una matrice in cui ciascun elemento si ottiene dal
corrispondente elemento di A scambiando la posizione righe-colonne.
In termini pi rigorosi sar:
ATji = Aij
, i, j
69
70
Le parti del codice che qui non sono riprodotte sono quelle che assegnano il contenuto delle celle alla matrice in memoria e viceversa. Lassegnazione del contenuto delle celle alla matrice in memoria
viene fatto in vista della riutilizzabilit del codice sotto forma di sottoprogramma da includere nella libreria comune. Nella figura sottostante si riproduce il foglio Excel in cui abbiamo calcolato la trasposta
di una matrice data.
10.2
il prodotto di matrici
a11
a21
A= .
..
a12
a12
..
.
...
...
..
.
am1 am2 . . .
a1n
a1n
b11
b21
B= .
..
amn
c11
c21
C= .
..
...
...
..
.
bn1 bm2 . . .
la matrice Cm,k
b12
b12
..
.
c12
c12
..
.
...
...
..
.
cm1 cm2 . . .
1k
c1k
cmk
b1k
b1k
bnk
n
X
a1i bi1
c12 =
i=1
n
X
a1i bi2
...
i=1
...
c1k =
n
X
a1i bik
i=1
10.3
la matrice inversa
1 0 ...
0 1 . . .
I = . .
..
.. ..
.
0 0 ...
0
0
71
72
ovvero una matrice che ha tutti gli elementi della diagonale principale
pari a 1 e i restanti elementi uguali a 0.
Normalmente il calcolo dellinversa presenta una certa difficolt.
Fortunatamente facile trovare in Internet una versione di questo
programma liberamente disponibile. La versione che abbiamo reperito si deve a Franco Languasco (+ www.flanguasco.org) a cui va il
nostro ringraziamento.
10.4
Le sub mat_prodotto, mat_trasposta, mat_inversa, come anticipato nel paragrafo 10.1, sono scritte in modo tale da poter essere utilizzate per qualunque dimensione del problema. Queste dunque, a
pieno titolo, possono far parte della libreria comune. Il lettore le inserisca in un apposito modulo di questa libreria. Il modulo che abbiamo
definito noi a questo scopo si chiama Modulo_matrici.
esercizi
1. Scrivere il programma che calcola la matrice trasposta a partire
da una matrice di 4 righe e 3 colonne. La matrice originale si
trova gi nel foglio in una posizione nota a priori. La trasposta
deve essere riprodotta nel foglio in una posizone a scelta.
2. Scrivere il programma che calcola il prodotto di due matrici di
dimensioni opportune (diverse da quelle trattate nel capitolo).
Le matrici originali si trova gi nel foglio in una posizione nota
a priori. La matrice prodotto essere scritta in una posizone a
scelta.
3. Cercare su Internet un esempio relativo al calcolo dellinversa di
una matrice. Riportare la matrice di partenza nel foglio e calcolare la sua inversa modificando opportunamente il programma
trattato in questo capitolo.
I L P I A N O D I A M M O R TA M E N T O A R AT E C O S TA N T I
Un piano di ammortamento una tabella nella quale viene rappresentata la situazione relativa al rimborso rateale del prestito di un
capitale ad ogni scadenza. Nella tabella la somma da rimborsare
ripartita in rata, quote interessi, debito residuo ed estinto. Nel caso
che stiamo per trattare, il rimborso a rate costanti posticipate ed
chiamato ammortamento francese1 . Un esempio piano di ammortamento francese visibile nella figura sottostante. Nella cartella lavoro
Si tratta di una soluzione generalizzata a questo problema. Viene richiesto allutente di inserire, con altrettante InputBox, tre dati: il capitale da restituire, il numero di rate ed il tasso di interesse. Nella stessa
cartella di lavoro disponibile unaltra procedura che si occupa di ritornare ad un foglio di lavoro vuoto2 . Il programma articolato nei
seguenti passaggi:
1. un ciclo gestisce lacquisizione, sotto forma di input da parte dellutente, di capitale, tasso di interesse e numero di rate;
questi dati vengono inseriti nelle celle B1, B2, B3 insieme alle
corrispondenti intestazioni
2. si scrivono in altrettante celle le intestazioni delle colonne del
piano;
3. si imposta la propriet larghezza delle colonne da B a G che
dovr essere pari a 12 (la larghezza standard di 8,43 caratteri);
4. la zona che conterr le testate di colonna (C6:G7) dovr avere
ridefinite le propriet relative a tipo e allineamento del carattere
(grassetto e centrato);
5. calcolo della numero dellultima riga del piano. Essa in funzione del numero di rate. In base a questa riga, sar possibile
1 Per approfondimenti su questi argomenti si veda [4].
2 Se infatti il calcolo di un nuovo piano comporta un numero di rate inferiore a quello
calcolato in precedenza, si crea una sovrapposizione tra il piano nuovo e quello
vecchio.
73
11
74
definire la zona che conterr tutti i dati del del piano e la zona
in cui copiare le formule della prima riga;
6. definizione, per tutte le celle del piano, del numero di cifre
decimali (pari a zero);
7. scrittura delle formule necessarie al calcolo del piano: valore
attuale di una rendita..., rata; impostazione di debito residuo
e debito estinto iniziali (rispettivamente pari a 0 ed al capitale);
scrittura delle formule che si trovano nella prima riga del piano;
8. copia delle formule;
9. abbellimenti finali costituiti dal nascondere la riga 9 del foglio
(contiene i valori iniziali del debito estinto e residuo) e dalleliminazione della griglia.
La traduzione in istruzioni dei punti da 1 a 2 non riveste particolare importanza. Meritano un approfondimento invece la definizione
delle propriet delle testate delle colonne interessate dal prospetto
(punto 3) e le propriet della zona in cui verr scritto il piano (punto
4). La parte di codice che si occupa di questo riportata di seguito.
Range("B:G").Columns.ColumnWidth = 12
With Range("C6:G7")
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With
Listruzione della prima riga assegna un opportuno valore alla larghezza delle colonne dalla B alla G. In essa visibile la scansione nella
gerarchia degli oggetti a partire da Range, passando per Columns fino
ad arrivare alla propriet ColumnWidth. Successivamente sono visibili
le istruzioni corrispondenti al punto 4.
Il comando With serve definire uno o pi oggetti di una gerarchia
che debbono essere riferiti nelle istruzioni successive. La sua validit
si estende a tutte le righe successive fino al prossimo End With ed evita di riscrivere il riferimento alloggetto Range("C6:G7"). Riportiamo
di sotto il codice equivalente3 .
Range("C6:G7).Font.Bold = True
Range("C6:G7).HorizontalAlignment = xlCenter
La parte restante del programma si occupa della scrittura delle formule della prima riga del piano e della loro copia nelle righe successive in funzione delle rate. I commenti, presenti in abbondanza a
3 Anche se in questo caso la convenienza nellutilizzarlo quantomeno dubbia, lo
abbiamo voluto proporre a titolo didattico.
75
12
LA USER FORM
la finestra userform
stre: una intitolata UserForm1, laltra dal titolo Casella degli strumenti. Si
tratta di due finestre fluttuanti1 . Nella finestra del progetto notiamo
la presenza di un nuovo elemento chiamato UserForm1.
La finestra Casella degli strumenti, elenca le interfacce di colloquio
con lutente che si possono inserire nella finestra che comparir durante lesecuzione del programma. Ne viene mostrato un esempio
nella figura sottostante La finestra Casella degli strumenti elenca tutti
gli strumenti di colloquio che possono essere inseriti in una finestra di
dialogo. Nella tabella 12.1 alla fine del capitolo descriviamo gli strumenti standard pi importanti in base allordine con cui compaiono
nella stessa finestra. Si tenga presente che il primo di questi strumenti
1 Possono essere spostate facendo clic e mantenendo premuto il tasto sinisto del
mouse.
77
78
la user form
1. fare clic sullo strumento scelto nella casella degli strumenti (decidiamo di inserire la prima etichetta, quella intitolata CAPITALE);
2. spostarsi nella finestra intitolata UserForm1 (il puntatore cambia
aspetto assumendo la forma di una piccola croce cui si affianca
licona dello strumento prescelto);
3. portarsi nella posizione corrispondente ad uno dei quattro vertici del rettangolo che vogliamo disegnare fare clic e, mantenendo premuto il tasto sinistro, allargare il rettangolo fino a
raggiungere approssimativamente (vedi punto 4) la dimensione
voluta;
4. rilasciare il tasto del mouse senza preoccuparsi se le dimensioni
o la posizione che abbiamo impostato siano giuste o meno. Di
fianco allo strumento appena inserito si nota la comparsa del
titolo Label1 e di otto quadrati sulla cornice del controllo. Questi
segnalano che si tratta di un contorno ridimensionabile nonch
di un elemento fluttuante.
Fatto questo, ripartendo dal punto 1 delle spiegazioni precedenti, possiamo passare allimmissione degli altri elementi che compongono la
finestra. Per ora non ci preoccupiamo dei nomi che vediamo comparire, delle dimensioni dei vari oggetti nonch delle loro posizioni.
Selezioniamo loggetto e modifichiamo le sue dimensioni agendo
su uno dei quadrati neri che appaiono sui lati. Consigliamo di fare
pratica su questa parte in modo da velocizzare le proprie capacit di
realizzare interfacce utente pi o meno complesse.
Dopo aver inserito un oggetto possibile, tramite le consuete procedure di copia/incolla, effettuarne la duplicazione. Questo risulta
particolarmente utile soprattutto quando si devono inserire strumenti simili tra loro. Eseguita la copia possibile spostare loggetto duplicato nel punto che riteniamo opportuno con le funzionalit di
trascinamento disponibili con il mouse.
12.3
79
80
la user form
Selezionato loggetto UserForm facendo click, lo vediamo evidenziato con una cornice di otto quadratini. Adesso possiamo modificare
le due propriet suddette considerando nella finestra Propriet (visibile in figura a destra) le righe Caption e (Name). Sostituiano in
corrispondenza della seconda colonna di queste:
UserForm1 con Calcola Piano .... (o quello che riteniamo pi idoneo come titolo della finestra);
ufPianoDiAmmortamento come nome delloggetto nella seconda
colonna della riga (Name).3
Si raccomanda di prestare attenzione al nome delloggetto perch
questo sar importante in seguito. Ripetiamo questa procedura per i
tre oggetti etichette cambiando la relativa propriet da Label1, Label1,
Label3 rispettivamente in CAPITALE, TASSO, N.RATE con i passaggi:
1. selezionare loggetto nella finestra di dialogo;
2. spostarsi nella finestra delle propriet e modificare il titolo delletichetta che si trova nella seconda colonna in corrispondenza
della riga intitolata Caption.
Lo stesso procedimento va seguito per i due pulsanti di comando. In
questo caso oltre a modificare il loro titolo rispettivamente in Calcola
e Chiudi cambiamo anche il nome in btnCalcola e btnChiudi.
Le motivazioni di quanto appena fatto diventano evidenti osservando cosa accade se si eseguono i comandi del menu Visualizza>
Codice (la finestra Progetto dovrebbe trovarsi ancora su ufPianoDiAmmortamento). In questa finestra si notano due elenchi a discesa. In
quello di sinistra sono presenti gli oggetti inseriti nella finestra di dialogo secondo lordine alfabetico. Nellelenco a discesa di destra sono
mostrati gli eventi disponibili per quelloggetto (si veda la prossima
figura).
3 La scelta di questi nomi dovuta a motivazioni mnemoniche. Noi abbiamo usato una
convenzione che nomina gli oggetti dello stesso tipo con un prefisso identico seguito
da un opportuno nome mnemonico e cos sar nel seguito. Per fare un esempio
abbiamo scelto btnNome per i pulsanti di comando, ufNome per le finestre di dialogo,
txtNome per le caselle di testo.
Selezionato un elemento da questa lista, la finestra del codice mostrer le istruzioni di inizio/fine della procedura associata a quellevento. Se ancora non stato scritta nessuna istruzione del programma, questa finestra, a differenza di quanto apare nella figura, conterr
soltanto la dichiarazione della procedura con il nome delloggetto e
dellevento collegati costituita, nel nostro caso, da btnCalcola_Click.
12.4
lordine di tabulazone
La modifica di controlli della finestra di dialogo, pu portare a situazioni in cui durante lesecuzione del programma, al momento in
cui viene visualizzata la finestra di dialogo, il tasto di di tabulazione
non segue lordine sequenziale con cui i controlli sono visibili nella
finestra (in presenza di numerosi campi dove sar finito il cursore
lampeggiante?).
Per fare un esempio relativo ai controlli di cui sopra, potrebbe accadere di aver inserito la casella di testo che contiene il numero delle
rate capitale in un momento successivo a quello in cui stata inserita, p.e., la casella del tasso. Se cos fosse, durante lesecuzione del
programma luso del tasto di tabulazione provocherebbe un salto al
campo del numero di rate invece che a quello del tasso. La modifica di
questo sgradevole comportamento, si ottiene ricorrendo alla sequenza di comandi del men Visualizza Visualizza Ordine di Tabulazione
che visualizza unapposita finestra. Si nota la presenza dei tasti Spo-
81
82
la user form
Nella modalit di funzionamento vista finora, lesecuzione del programmma procede in base ad una logica che protremmo definire sequenziale. Le istruzioni sono eseguite una dopo laltra dallalto verso
il basso con eventuali salti in presenza di comandi condizionali o di
ciclo. La programmazione con le finestra di dialogo modifica questa
logica a causa della presenza dei pulsanti di comando. Il loro impiego nel programma rivoluziona completamente la logica di esecuzione
che da sequenziale diventa una esecuzione ad eventi. Questo si traduce in una modifica della soluzione del problema cos come presentata
nel capitolo precedente.
Tutto ci premesso, ridefiniamo le funzionalit del programma che
calcola il piano di ammortamento. Ladozione della finestra di dialogo personalizzata comporta una diversa organizzazione del codice
che si baser sul verificarsi dellevento click su uno dei due pulsanti
CALCOLA e CHIUDI. Il programma sar composto da due sole procedure: una di visualizzazione della finestra di dialogo, laltra di ripristino del foglio. Queste parte del Modulo1 che stato inserito prima
di procedere alla scrittura delle istruzioni che le compongono (si veda
la finestra del progetto nelle figure precedenti).
Sub ammortamento_francese()
ufPianoDiAmmortamento.Show
End Sub
Sub RipristinaFoglio ()
Dim Ciccio As String
....
End Sub
La procedura ammortamento_francese consiste del comando Show applicato alloggetto ufPianoDiAmmortamento. Il comando esegue la visualizzazione della finestra di dialogo.
La procedura RipristinaFoglio non ha bisogno di alcun commento
essendo identica a quella gi vista nel capitolo precedente.
Entrambe le procedure fanno parte di un nuovo modulo, chiamato
Modulo1, inserito con i comandi del menu Inserisci Modulo.
Per quanto attiene al codice associato agli eventi, pur avendone accennato in precedenza, considerata limportanza di questo passaggio,
ripetiamo la sequenza delle operazioni:
1. selezione delloggetto ufPianoDiAmmortamento nella finestra del
progetto;
2. apertura della finestra del codice con i comandi del menu Visualizza Codice;
3. selezione del pulsante btnCalcola nella casella a discesa di sinistra e dellevento Click in quella a destra.
Possiamo ora scrivere le istruzioni da eseguire al verificarsi dellevento costituito dal clic sul tasto CALCOLA. Si tratta di una parziale
modifica delle istruzioni scritte nel capitolo precedente che quindi
possono essere copiate.
Private Sub btnCalcola_Click()
Dim Richiesta(3) As String , Dato(3) As String
Dato(1) = txtCapitale .Text
Dato(2) = txtTasso.Text
Dato(3) = txtNrate.Text
. . .
83
84
la user form
calcoli
Cells ( I , 2).Value = _
CSng(Replace(Dato(I), ".", ",")) scrive i tre dati acquisiti
in B1, B2, B3
A2, A3
Next I
Cells (4, 3).Value = " v.a. rendita unitaria annua posticipata temporanea"
.......
End Sub
Dopo aver assegnato alla variabile con indici Richiesta tre costanti,
controlliamo che i dati inseriti siano congrui (presenza del dato e
controllo che si tratti di un numero).
Si nota, dopo il primo ciclo For il comando Unload Me necessario
a scaricare il form dopo aver effettuato i controlli sui dati. A questo proposito si tenga presente che Me si riferisce al nome dellUserForm in esecuzione in quel momento. Ultimo, ma necessario, il codice
corrispondente allevento Click associato al pulsante CHIUDI.
Private Sub btnChiudi_Click()
ufPianoDiAmmortamento.Hide
End Sub
esercizi
1. Tenendo presente il codice del paragrafo 4.5, scrivere il programma che visualizza una UserForm che richiede i dati necessari al calcolo delle radici di unequazione di secondo grado.
Eventualmente riutilizzare, con le opportune modifiche, linterfaccia di dialogo impiegata nel calcolo del piano di ammortamento francese.
85
Etichetta/Label
Casella di testo/TextBox
Cornice/Frame
Puls. di comando/CommandButton
Casella di controllo/CheckBox
Pulsante di opzione/OptionButton
Pulsante interruttore/ToggleButton
Casella di riepilogo/ListBox
Disegna un elenco a discesa composto da diversi valori su cui effettuare una scelta. Selezionando
la propriet MultiSelect permette
scelte multiple.
Casella combinata/ComboBox
13
I L G E N E R AT O R E D I N U M E R I C A S U A L I N O R M A L I
definizioni ed esempi
il generatore di mersenne-twister
Alla fine degli anni 90 due studiosi giapponesi, Matsumoto e Mishimura, idearono un algoritmo utilizzabile con un sistema di elaborazione che minimizza le criticit appena accennate valido per gran
parte delle applicazioni in cui si richiede un generatore di numeri
casuali1 .
La versione VBA di questo algoritmo, che abbiamo reperito su Internet, si deve a Pablo Mariano Ronchi, cui va il nostro ringraziamento. Per quanto ci riguarda stata inserita come sottoprogramma nella
libreria comune in Modulo_varie e collegata con le modalit illustrate
nel paragrafo 8.3.
1 per una pi approfondita discussione di questi aspetti, assieme ad altri documenti
reperibili in rete, si consulti larticolo allUlr:
http://www.antoniogrande.uniroma1.it/VBA/the_twisted_road.pdf
ottima sintesi di brevit e chiarezza espositiva
87
88
Il sottoprogramma, per poter funzionare, richiede un seme, nonch la scelta di una procedura in relazione alla variabilit del numero
casuale che si vuole generare.
Per quanto riguarda il seme si tratta di un numero compreso nellintervallo -2147483648, 2147483647. Per ciascuno dei numeri interi
compresi in questo intervallo viene generata una sequenza diversa
di numeri casuali ovvero, a partire da uno stesso seme, la sequenza
generata sempre identica. La riproduzione della stessa sequenza di
numeri importante quando si debbano controllare i calcoli a partire
da numeri cos generati.
La variabilit dei valori del generatore si riferisce al valore massimo/minimo del numero prodotto dal generatore. Cos, per esempio, la procedura genrand_int32() genera una sequenza di numeri
compresi tra 0 e 232 1, la procedura genrand_real3b() genera una
sequenza di numeri compresi nellintervallo 0.0 e 1.0 estremi esclusi.
13.3
la trasformazione di marsaglia-bray
La trasformazione di Marsaglia-Bray una variante di quella di BoxMuller. Queste due trasformazioni, risalenti agli anni 60, sono impiegate per generare una sequenza di numeri casuali normalmente distribuiti a partire da una sequenza di numeri casuali uniformemente
distribuiti. La preferenza generalmente accordata alla prima si spiega con il fatto che la trasformazione Box-Muller richiede il calcolo
di seno e coseno per ogni numero casuale che viene generato il che
comporta un allungamento dei tempi di esecuzione. Per quanto con i
sistemi di elaborazione attuali questo problema possa essere di poca
rilevanza, nella nostra soluzione abbiamo scelto Marsaglia-Bray.
Questo algoritmo, a partire da coppie di numeri casuali u, v, appartenenti al disco unitario , calcola una coppia di numeri casuali
distribuiti normalmente con le formule:
r
2 ln R
R
2 ln R
R
x=u
y=v
in cui
(u, v) R : u2 + v2 < 1
Vengono perci ammesse le coppie per cui la cui somma dei quadrati sia inferiore a 1. Questa propriet garantisce che si tratti di numeri, distribuiti uniformemente, che appartengono allinsieme disco
unitario centrato nellorigine.
Nella cartella generatore_ncasuali_normali.xls si trova il codice
che descriviamo per sommi capi. A partire dalla richiesta di quanti numeri generare, si produce una sequenza di numeri casuali uniformemente distribuiti (algoritmo di Mersenne-Twister) che vengono
trasformati in numeri distribuiti normalmente (con Marsaglia-Bray).
Allo scopo di provare che la sequenza dei numeri si distribuisce in
modo normale, abbiamo conteggiato questi numeri in una distribuzione di frequenza suddivisa in classi. Ad ulteriore dimostrazione di
questo, oltrech a scopi didattici VBA, rappresentiamo graficamente
la distribuzione di questi numeri con un istogramma.
Il generatore dei numeri e le istruzioni di calcolo della distribuzione, listogramma, la cancellazione dellistogramma e la cancellazione
dei dati eventualmente presenti nel foglio sono suddivisi rispettivamente in quattro procedure tutte contenute nello stesso modulo e
facilmente riconoscibili. Non sono state impiegate finestre di dialogo
ma si devono inserire due dati in altrettante celle del foglio: quanti
numeri si dovranno generare ( cella D1) e in quante classi suddividere la distribuzione (cella D2). Le classi hanno ampiezza pari a 0,1. La
mancanza dei dati necessari ai calcoli viene controllata e, se del caso,
fatta rilevare con un apposito messaggio.
Nella parte iniziale del programma vediamo le istruzioni che generano i numeri. La prima definisce il seme del generatore, le altre
due - poste dentro un ciclo - estraggono i numeri.
. . .
init_genrand 6
For I = 1 To N
. . .
inizializza il seme
rand1 = genrand_real4b()
rand2 = genrand_real4b()
poi calcoliamo il valore da sottoporre al test di accettazione
s1 = rand1 ^ 2 + rand2 ^ 2
If s1 <= 1 Then
Ok = False
s2 = Sqr(2 Log(s1) / s1)
due numeri casuali distribuiti normalmente
ncas(1) = rand1 s2
ncas(2) = rand2 s2
. . .
89
90
Nelle figura 13.1 vediamo lo stato del foglio dopo lesecuzione del
programma di estrazione. Oltre a produrre la distribuzione il programma scrive in due celle, rispettivamente in D4 e D5, il minimo
ed il massimo tra tutti i numeri generati (solo a fini di controllo). La
distribuzione, come si vede dalla figura, occupa le prime due colonne del foglio. Per velocizzare lesecuzione si individua la classe cui
appartiene ciascun numero con la tecnica del puntatore.
Nella figura 13.2 visibile la relazione che sta alla base dei puntatori: il numero da classificare, che sappiamo essere compreso tra -50 e
50, viene posto in corrispondenza biunivoca con un altro numero che
rappresenta lindice cui della classe di appartenenza. Le istruzioni che
eseguono queste funzionalit sono riprodotte nel codice seguente:
...
Indice = Int(ncas(K) / 0.1)
Indice = Punta(Indice)
Freq( Indice ) = Freq(Indice) + 1
...
La prima istruzione trasforma il numero casuale decimale in un intero e lo assegna alla variabile Indice. Nella seconda istruzione questa
variabile lindice del vettore Punta (si veda nella seconda colonna della figura i suoi elementi) che viene assegnato nuovamente ad
Indice. Il gioco fatto. La terza istruzione incrementa il vettore della
distribuzione di frequenza.
Supponiamo, per esempio, che ncas(K) valga -4,7545. La prima
istruzione assegna -47 ad Indice, la seconda gli assegna -35 (tutti i
valori del vettore compresi tra -50 e -35 valgono -35). Nella terza istruzione lelemento del vettore delle frequenze con indice -35 incrementa
di uno il suo precedente valore.
Lassegnazione al vettore Punta dei valori che realizzano questa fun-
zionalit viene ottenuta con due cicli. Nel primo si inizializzano gli
elementi che si trovano nelle code (con lesempio di sopra i valore
compresi tra -50 e -35 e quelli compresi tra 35 e 50). Nel secondo ciclo
si assegnano i valori rimanenti. Queste istruzioni si trovano allinizio
del programma e sono riportate di seguito.
For Indice = 50 To nClassi
Punta(Indice) = nClassi
Punta(Abs(Indice)) = nClassi
Next Indice
For Indice = nClassi To nClassi
Punta(Indice) = Indice
Next Indice
13.4
La creazione di un grafico in ambiente VBA un argomento che richiederebbe una trattazione a parte data la notevole quantit di nozioni correlate nonch le molteplici tecniche disonibili. In questa parte
ci limiteremo ad una trattazione elementare dei concetti relativi al
grafico che vogliamo realizzare rimandando ai prossimi capitoli per
ulteriori esempi.
La prima scelta da fare quella relativa alla posizione del grafico
ovvero se si tratta di un grafico interno ad un foglio o in un foglio
a s stante. La seconda attiene al tipo di grafico ovvero se vogliamo
un grafico a barre, a punti, a torta etc. Le altre scelte relative a scala
dei valori, legende, stile dei caratteri delle legende e del titolo sono
abbastanza simili tra loro indipendentemente dalla posizionie e dal
tipo. Nel nostro caso abbiamo deciso di disegnare un grafico in un
foglio a parte ed inoltre abbiamo scelto un istogramma.
91
92
Una volta controllata la presenza dei dati necessari, calcoliamo lestensione della zona con i dati del grafico. A questo punto passiamo
alle istruzioni relative al grafico.
aggiunge un oggetto Grafico (non appartenente ad alcun foglio)
Charts.Add
With ActiveChart
grafico tipo istogramma
.ChartType = xlColumnClustered
elimina le serie di dati eventualmente presenti
Le prime istruzioni aggiungono un oggetto di tipo grafico, definiscono questo oggetto con il comando With per non ripeterlo nelle
istruzioni successive, ne definiscono il tipo con una istruzione di
assegnazione alla propriet ChartType2 .
Fatto questo bisogna definire le serie di dati che compongono il
grafico, il nome del foglio ed il suo titolo. Ricordiamo che la zona
con la serie dei dati a dimensioni variabili il suo riferimento stato
calcolato in precedenza sotto forma di stringa.
. . .
definisce le serie del grafico
.Name = "frequenze"
End With
propedeutico allinserimento del nome dell
oggetto Grafico
. HasTitle = True
nome delloggetto grafico
.Name = "GraficoMio"
titolo
Sub CancellaIstogramma
If Application .ActiveWorkbook.Charts.Count > 0 Then Charts.Delete
End Sub
Nella figura 13.3 abbiamo riprodotto il grafico che mostra la distribuzione dei numeri casuali normali. Ad un esame visivo si apprezza
la bont della distribuzione chiaramente normale. Si nota, al termine
delle code, un rialzamento della distribuzione dovuto alla frequenze
di numeri esterni alle classi che, a programma, sono stati classificati
nelle due classi estreme.
93
14
St
X
2
+ +
(T t)
2
T t
d2 = d1 T t
tenendo presente che:
Ct il prezzo della call,
St il prezzo del titolo o sottostante,
la volatilit del sottostante,
X il prezzo desercizio,
lintensit istantanea di interesse,
T la scadenza (data di esercizio dellopzione),
t lepoca della valutazione,
N(.) il valore della distribuzione normale standardizzata.
Nella formula le quantit d1 e d2 sono date da:
ln
d1 =
St
X
2
+ +
(T t)
2
T t
d2 = d1 T t
La formula per una Put invece data da:
Pt = Xe(T t) N(d2 ) St N(d1 )
95
96
14.1
la formula excel
la formula in vba
97
15
L E S C E LT E D I P O R TA F O G L I O
la soluzione
La soluzione VBA che presentiamo, che individua i portafogli efficienti, si caratterizza per lindipendenza dalla numerosit dei dati sia
in relazione alla lunghezza dei periodo di osservazione sia per il numero degli asset che compongono il portafogli. Si nota come lunico
input necessiario, supponendo la presenza delle quotazioni nel foglio
di lavoro (si veda il capitolo 16), sia costituito dalla definizione con il
mouse della zona che contiene le osservazioni! (a titolo di confronto
si consideri la soluzione proposta in Benninga [1]).
La soluzione prevede che le quotazioni dei titoli che fanno parte dellasset si trovano gi sul foglio. La specificazione della zona che contiene le quotazioni viene acquisita dal programma grazie ad un controllo RefEdit incluso nella UserForm disegnata per acquisire i dati.
99
100
le scelte di portafoglio
15.3
il calcolo di refedit
Una volta definita la della zona con le quotazioni dei titoli, dovremo procedere a calcolare, in base ad essa, una serie di dati utili ai
calcoli successivi costituiti dalle matrici inverse, trasposte, etc. e, di
consguenza degli spazi necessari nel foglio di lavoro per riprodurle a
fini di controllo.
La trasformazione della stringa costituita nel nostro esempio da:
Foglio1!$B$4:$G$15
cella fine
lunZona = Len(Zona)
cerco il carattere ":", se non ce e stata selezionata solo una cella
e non una zona
per proseguire la zona Foglio1!\$B\$3 deve diventare Foglio1!\$B\$3:\
$B\$3
101
102
le scelte di portafoglio
dei dati relativi ai calcoli e degli eventuali grafici sono state definite
suddividendole in:
la definizione del pulsante CANCELLA CALCOLI che provvede
alla cancellazione parziale/totale di tutti i dati e del grafico
eventualmente presente in un foglio a parte allinterno dellintergaccia di dialogo;
la definizione di una procedura sotto Modulo1 che provvede alla
cancellazione del grafico eventualmente presente allinterno di
Foglio1.
16
L E Q U O TA Z I O N I D E I T I T O L I
Nel capitolo precedente abbiamo utilizzato le quotazioni di un insieme di titoli per il calcolo della frontiera efficiente in base al modello
di Markowitz. In quella occasione non abbiamo accennato alle modalit con cui le quotazioni venivano immesse. Esclusa la possibilit di inserirle a mano, esiste un modo automatico di risolvere il
problema prelevando le quotazioni da Internet. In questo capitolo ci
occuperemo di questo. Si tenga presente che lo scaricamento in un
foglio di lavoro Excel delle quotazioni di un titolo ha come risultato
una situazione simile a quella visibile nella figura 16.1. In particolare
in ogni colonna sono presenti rispettivamente la data della rilevazione, la quotazione di apertura, la quotazione massima, la minima, etc.
Come visto nel capitolo precedente, dobbiamo invece avere in differenti colonne le quotazioni di altrettanti titoli. Vedremo dunque, sia
come risolvere il problema dello scaricamento da Internet della quotazione di uno o pi titoli (figura 16.1), sia come passare alla loro
predisposizione in una modalit simile a quello richiesto dal problema di Markowitz (figura 15.1). La soluzione, per motivi di logica, si
articola in due parti corrispondenti ad altrettante cartelle: la gestione
dei nomi/codici dei titoli e lo scaricamento delle quotazioni.
16.1
i codici di borsa
La cartella di lavoro elenco_titoli.xls deputata alla gestione anagrafica dei titoli. Bisogna sapere che le quotazioni dei titoli di una
determinata societ sono individuati da una sigla o codice, in gergo borsistico. Il codice individua univocamente societ e la borsa cui
103
104
1 nomi e sigle si riferiscono allestate 2011 e potrebbero essere diversi a seconda del
riferimento temporale.
2 Non sono ammesse righe vuote; per una loro eliminazione bisogna procedere
manualmente.
16.2
Una seconda applicazione si occupa dello scaricamento vero e proprio delle quotazioni. Si tratta di una parte abbastanza articolata anche in relazione al fatto che, per ciascun titolo, vengono comunque restituite ben 6 colonne di dati. Nella figura sottostante viene mostrato
un esempio dei dati scaricati per un titolo.
I dati sono organizzati sotto forma di matrice a due dimensioni.
Nelle righe abbiamo le osservazioni per data di rilevazione in base a
quanto selezionato nella finestra di dialogo (si veda in seguito). Nelle
colonne, in corrispondenza di ciascuna data, sono elencati quotazione
di apertura, massima, minima, etc. Poich per il calcolo della fontiera
efficiente ne potremo utilizzare solo una, nella finestra di dialogo
stato inserito un opportuno strumento nel frame intitolato COLONNA
DA SCARICARE.
Nella figura sottostante visibile la finestra di dialogo che abbiamo
definito per questa applicazione. Al suo interno sono presenti due
nuovi strumenti costituiti da:
il calendario;
la casella di riepilogo.
Il calendario uno strumento di grande utilit nellacqusizione di date perch impedisce errori formali quali p. e. 45 come numero del
giorno oppure marzio come nome del mese. Non disponibile nella dotazione standard di Excel 2003 e in questa versione, affinch sia
visibile nellinterfaccia di dialogo, necessario scaricare da Internet
unapposito programma3 .
105
106
16.3
La seconda parte della nostra applicazione si occupa dello scaricamento vero e proprio dei dati da Internet. Trattandosi di una soluzione piuttosto articolata la riassumiamo nei seguenti punti:
1. visualizzazione della finestra di dialogo;
2. ciclo che si ripete per il numero di titoli selezionati;
per ogni titolo, aggiunta di un nuovo foglio inteso come
worksheet;
ufQuotaz.optGiorna.Value = vbChecked
. . .
107
108
. . .
dInizio = cldInizio .Value
dFine = cldFine.Value
ggI = Format(Day(dInizio), "00")
mmI = Format(Month(dInizio) 1, "00")
aaI = Format(Year(dInizio) , "00")
ggF = Format(Day(dFine), "00")
mmF = Format(Month(dFine) 1, "00")
aaF = Format(Year(dFine), "00")
. . .
Worksheets(Sheets(I) .Name).Activate
ActiveSheet .Range(zonaInput, ActiveSheet.Range(zonaInput).End(xlDown)).
Select
Selection .Copy
Range("A1").Select
seleziona il foglio di output
Worksheets(Sheets(1).Name).Activate
scrive la testata delle colonne (sigla dei titoli
Lultima osservazione riguarda la cancellazione dei tutti i fogli scaricati (quelli che contengono i dati grezzi). La funzionalit associata
allevento Click sul pulsante di comando ELIM. FOGLI D. GREZZI.
Questa operazione sfrutta un ciclo For each che permette di indirizzare tutti gli oggetti di una collezione. Nel nostro caso loggetto
aSheet mentre la collezione ActiveWorkbook.Sheets. Terminato il
ciclo si scarica la finestra di dialogo.
Private Sub btnEliminaDGrezzi_Click()
Dim aSheet As Object
For Each aSheet In ActiveWorkbook.Sheets
109
17
metodologia risolutiva
S11
S21
S= .
..
S12
S22
...
...
..
.
Sn1 Sn2 . . .
S1m
S2m
..
.
Snm
Z11
Z21
Z= .
..
Z12
Z22
...
...
..
.
Zn1 Zn2 . . .
Z1m
Z2m
..
.
Znm
111
112
Ci = exp(rt) max(0, S i X)
che finalmete permetter di calcolare il valore attuale stimato della
call in base alla relazione:
1 X
Cj
m
m
C=
j=1
17.2
la soluzione vba
=
=
=
=
=
=
.txtCamm
.txtSottop
. txtPrezzoIniziale
.txtPrezzoFissato
.txtTassoInt
.txtScadenza
Dato(7) = .txtSigma
End With
For I = 1 To 7
If IsNumeric(Dato(I)) = False Then
MsgBox prompt:=Richiesta(I) & _
" manca o non e numerico", _
Buttons:= vbCritical , _
Title :="ERRORE NEI DATI"
Exit Sub
End If
Next I
Coerentemente con limplementazione dei dati in un foglio Excel, dovremo controllare di non superare i limiti imposti dal numero di colonne disponibili (al massimo 256). Qui abbiamo supposto un numero
massimo di 100 colonne e 1000 righe. Questi dati sono stati assegnati
alle due celle riferite nellistruzione condizionale.
If Cells (1, 4).Value > 100 Or _
Cells (2, 4).Value > 1000 Then
MsgBox prompt:=" Superati i limiti per n, oppure m", _
Buttons:= vbCritical , _
Title :="ERRORE NEI DATI"
Come da nostra consuetudine generiamo i numeri casuali con lalgoritmo di Mersenne Twister che si trova nella nostra libreria dei
programmi.
. . .
REM innesca il
generatore
init_genrand 4
For I = 1 To N
riempie la zona a
partire da Cells(10,1)
con i numeri casuali
For J = 1 To M
ok = True
Do While ok
genera le coppie
rand1 = 2 genrand_real3() 1
rand2 = 2 genrand_real3() 1
113
114
salvaS = s0
STotCi = 0
iRiga = 10 + N + 2
Cells ( iRiga , 1).Value = "Media"
Cells ( iRiga , 2).Value = "C"
Cells ( iRiga , 3).Value = "Media C(i)"
For I = 1 To N
sTot = 0
s0 = salvaS
For J = 1 To M
Cells ( I + iRiga, J + 2).Value = _
s0 Exp((erre 0.5 sigma ^ 2) t + sigma _
Sqr(t) Cells (11 + I, J) .Value)
s0 = Cells( I + iRiga, J + 2).Value
sTot = sTot + s0
Next J
sMed(I) = sTot / CDbl(M)
Ci( I ) = Exp(erre t) Application .Max(0, sMed(I) kappa)
Cells ( I + iRiga, 1).Value = sMed(I)
Cells ( I + iRiga, 2).Value = Ci(I)
STotCi = STotCi + Ci(I)
Next I
Cells (2, 8) = STotCi / CDbl(N)
Lultima riga del codice, calcolato il valore stimato della Call con il
metodo Monte Carlo, riporta il risultato nella cella H2.
Parte III
APPENDICI
I L R E G I S T R AT O R E D E L L E M A C R O
117
118
a.2
pro e contro
A questo punto il lettore pi smaliziato potrebbe pensare che questa funzionalit renda del tutto vano il significato di un libro sulla
programmazione VBA ma non cos perch la tecnica della registrazione comporta diverse conseguenze che possono essere facilmente
comprese considerando il seguente esempio.
Dopo aver attivato il registratore, inseriamo in tre celle a piacere
altrettati dati ed analizziamo il codice ottenuto con la registrazione.
. . .
Range("F18").Select
ActiveCell .FormulaR1C1 = "ahrd"
Range("F19").Select
ActiveCell .FormulaR1C1 = "djue"
Range("F20").Select
ActiveCell .FormulaR1C1 = "deks"
Range("F21").Select
End Sub
119
BIBLIOGRAFIA
Matematica Finanziaria.
121