Sei sulla pagina 1di 83

Dipartimento 

di Ingegneria Meccanica e Industriale

Università degli Studi di Brescia

Elementi di Informatica e 
Dipartimento di Ingegneria Meccanica e Industriale

Programmazione
Corso di laurea: Ingegneria Gestionale
Elementi di informatica e programmazione

PROGRAMMAZIONE

Docente: Marco Sechi
E‐mail: marco.sechi@unibs.it
Vers. 02/11/2015.B

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


2
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Array e Matrici

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


3
ARRAY e MATRICI
Talvolta succede che occorra svolgere ripetutamente la stessa operazione su un 
gruppo di variabili omogenee (dello stesso tipo)
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Essendo variabili distinte non è possibile ripetere la stessa operazione 
sfruttando i costrutti iterativi precedentemente visti. Possiamo ovviare 
ricorrendo agli array. Gli array sono gruppi di variabili, tutte dello stesso tipo, 
nelle quali si accede al singolo elemento mediante un indice.

La dimensione dell'array (numero di elementi) può essere fissa o dinamica 
(cambia durante l'esecuzione del programma). L'elemento iniziale ha indice 0. Si 
può impostare che tutti gli indici degli array partano tutti da 1 scrivendo in cima 
al modulo, fuori da qualsiasi routine, l'istruzione: Option Base 1
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
4
In realtà è possibile definire l'indice di partenza e di arrivo in modo del tutto 
arbitrario durante la dichiarazione dell'array. 
Dim nomeVariabile(da To a) As Tipo
Esempio:
Dim X(3 to 10) AS Integer
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Sub Esempio()
Dim Nome(1 to 5) As String
For i = 1 To 5 ' INPUT
Nome(i) = InputBox("Nome " & i & "-esimo studente")
Next
For i = 1 To 5 ' OUTPUT
Cells(i, 1) = Nome(i)
Next
End Sub
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
5 Gli array con una dimensione sono detti vettori mentre quelli con più 
dimensioni vengono chiamati matrici. La dichiarazione degli array avviene 
specificando l'indice massimo per ogni dimensione:

Dim nomeMatrice(dim1, ...,dimN) As Tipo


Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Per accedere ad un preciso elemento si utilizzano le sue coordinate:

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


6
Se si cerca di accedere ad un elemento 
utilizzando un indice esterno all'intervallo 
definito dai limiti inferiore e superiore 
dell'array, si genera un errore di esecuzione
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Per inizializzare la tabella 2x2 con i valori in figura occorre utilizzare le 
seguenti istruzioni
Sub Esempio()
Dim x(1, 1) As Long
x(0, 0) = 1
x(0, 1) = 2
x(1, 0) = 3
x(1, 1) = 4
End Sub

Le variabili di tipo numerico sono inizializzate a 0, quelle di tipo Variant ad 


Empty.
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
7 Come avveniva nei vettori anche nelle matrici è possibile indicare 
esplicitamente l’intervallo di variazione degli indici sulle singole dimensioni. 

Dim nomeMatrice(Da1 TO A1, ...,Dan TO An) As Tipo

E’ possibile conoscere quale è il limite inferiore e superiore degli indici di 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

una matrice grazie alle funzioni:
LBound(nomeMatrice, dimensione)
UBound(nomeMatrice, dimensione)
Se non specificato dimensione vale 1. L'uso di tali funzioni è fortemente 
consigliato. Vediamo il seguente esempio:
Sub provaIndici()
Dim Vet(5 To 9) As Double, i As Integer
For i = LBound(Vet) To UBound(Vet)
Vet(i) = i * 10
Next
End Sub
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
8
Esempi su ARRAY e MATRICI
Esempio 1
L'esempio seguente mostra l'utilizzo del parametro dimensione (2°
argomento) nelle funzioni Lbound e Ubound, relativamente ad un array 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

tridimensionale.

Sub ProvaRangeIndici()
Dim Vet(2 To 4, 5 To 7, 8 To 10) As Byte
Debug.Print LBound(Vet, 1) ' restituisce 2
Debug.Print UBound(Vet, 1) ' restituisce 4
Debug.Print LBound(Vet, 2) ' restituisce 5
Debug.Print UBound(Vet, 2) ' restituisce 7
Debug.Print LBound(Vet, 3) ' restituisce 8
Debug.Print UBound(Vet, 3) ' restituisce 10
End Sub
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
9 Esempio 2
Scrivere una funzione che legge il contenuto dell'area A1:A5 e lo memorizza 
in un vettore. Successivamente raddoppia il valore di ogni elemento e scarica 
il risultato nell'area che inizia con B7.
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Option Base 1
Sub EsempioVettore()
Dim celle(5) As Double, i As Integer
For i = LBound(celle) To UBound(celle)
celle(i) = Cells(i, 1).Value
Next
For i = LBound(celle) To UBound(celle)
Cells(i + 6, 2).Value = celle(i) * 2
Next
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


10 Esempio 3
L'esempio successivo mostra che per inizializzare una 
matrice N‐dimensionale servono N cicli for

Sub ProvaScorrimento3Dimensioni()
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Dim X(1 To 2, 1 To 2, 1 To 2) As Long


Randomize
For i = LBound(X, 1) To UBound(X, 1)
For j = LBound(X, 2) To UBound(X, 2)
For k = LBound(X, 3) To UBound(X, 3)
X(i, j, k) = Rnd() * 10
Next
Next
Next
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


11
MATRICI DINAMICHE
Il VBA ammette l'utilizzo di matrici dinamiche ovvero array che possono 
cambiare la loro dimensione durante l’esecuzione. La dichiarazione di una 
matrice dinamica non ammette alcuna indicazione sulla dimensione. La 
sintassi è la seguente:
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Dim nomeMatrice() As Tipo

Per ridimensionare una matrice si utilizza l'istruzione ReDim:

ReDim [preserve] nomeMatrDim(dim1, ..., dimN)

Una matrice può essere 
ridimensionata più volte durante  Dim X() As Long
l’esecuzione. Ogni ridimensionamento  ReDim X(1)
fa perdere il contenuto precedente a 
meno che non si usi l’opzione  X(1) = 2: X(0) = 1
Preserve. Le dimensioni indicate in  ReDim Preserve X(2)
ReDim possono essere l'estremo 
X(2) = 3 Si osservi l'uso dei : per 
superiore oppure un intervallo scrivere 2 istruzioni 
(valoreIniziale To ValoreFinale). sulla stessa riga

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


12 Il VBA consente di creare array anche mediante la funzione Array la cui 
sintassi è:

VarVariant=Array(Arg1,Arg2, … , ArgN)
La variabile che conterrà il vettore restituito da Array() deve essere 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

dichiarata come variant

Dim Stagioni As Variant Si osservi l'uso dell'underscore 


_ per scrivere la stessa 
Dim Esiti istruzione su più righe

Stagioni = Array("Inverno", _
"Primavera", _
"Estate", _
"Autunno")
Esiti = Array(18, 19, "...", 30, "30 e Lode")

Il limite inferiore di una matrice creata utilizzando la funzione Array() è 
determinato dall'istruzione Option Base. Se questa istruzione non viene 
utilizzata il limite inferiore è 0.
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
13
Un'utile funzione che consente di trasformare una stringa (contenente un 
elenco di valori separati da uno specifico delimitatore) in un array è split().

SPLIT(Stringa,Separatore)
Sub provaSplit()
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Dim Stagioni As Variant


Const StagioniStr = "Inverno;Primavera;Estate;Autunno"

Stagioni = Split(StagioniStr, ";")


For i = LBound(Stagioni) To UBound(Stagioni)
MsgBox Stagioni(i)
Next
End Sub

Split() estrae i singoli valori sfruttando il simbolo separatore. Join() è 
invece la sua funzione inversa (si veda il vademecum delle funzioni VBA).
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
14
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Sub e Function

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


15
SUB e FUNCTION
Già agli albori della programmazione ci si rese conto di come spesso accada di 
dover codificare ripetitivamente identici gruppi di istruzioni.

Scrivere una sola volta il codice e riutilizzarlo per tutti i dati da elaborare 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

riduceva gli errori insiti nella riscrittura e diminuiva la dimensione dei 
programmi: nacquero così le subroutine.

Una subroutine è un sottoprogramma che 
consiste sostanzialmente in frammenti di 
codice ai quali è possibile passare dei  Esecuzione
parametri (rappresentano  i dati da  della
elaborare!). Con un’istruzione apposita di  SubRoutine
subroutine call si richiama l'esecuzione del 
sottoprogramma, che termina appena 
incontra un punto di uscita.  SubRoutine Call
Il flusso del programma principale 
prosegue dall’istruzione successiva alla  Istruzione Succ.
chiamata.

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


16 I sottoprogrammi si rivelano utili anche per un altro motivo: con essi, infatti, è 
possibile suddividere un programma in unità più piccole, più facili da scrivere e 
manutenere.

SOTTOPROBLEMA
1
ALGORITMO 1 Funzione 1
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

SOTTOPROBLEMA
2
ALGORITMO 2 Funzione 2

PROBLEMA DA
RISOLVERE

SOTTOPROBLEMA
N ALGORITMO N Funzione N

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


17
Concettualmente le subroutine possono essere ricondotte a due tipi:
 Funzioni: sottoprogrammi descrivibili come vere e proprie 
funzioni matematiche che possiedono un dominio ed un 
codominio. Pertanto restituiscono un risultato.

 Procedure: sottoprogrammi che con la loro esecuzione 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

modificano lo stato di alcune variabili di programma e 
contrariamente alle funzioni non restituiscono alcun valore.

Funzioni e procedure hanno:
 un unico punto d’ingresso
 uno o più punti di uscita
Inoltre consentono:
 la possibilità di poter accettare in ingresso uno o più
parametri passati dal routine chiamante;
 la definizione di variabili visibili solo all'interno della 
subroutine (variabili locali);
 (solo per le funzioni) la possibilità di restituire un dato
come risultato della loro esecuzione
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
18
L’utilizzo dei sottoprogrammi necessita di 2 elementi:

 La Definizione del sottoprogramma
 La Chiamata al sottoprogramma
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Per quanto riguarda la definizione della funzione occorre 
indicare:
 Il tipo del risultato (codominio della funzione)
 Il nome della funzione
 La lista dei parametri formali (con relativo tipo di dato) 
utilizzati dalla funzione (sono gli argomenti sul dominio
della funzione):

 Ogni parametro formale è definito mediante il nome della 
variabile seguita dal tipo associato.
 Si chiamano formali perché non hanno un valore proprio
ma sono i riferimenti (variabili) agli argomenti della 
funzione

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


19
I vantaggi nell’utilizzo di sottoprogrammi possono essere cosi riassunti:

 Modularità del codice: la scomposizione in sottoprogrammi facilita la
lettura e la  comprensione dell'algoritmo;
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

 Riutilizzo del codice: Una subroutine può essere utilizzata 
 in più punti di uno stesso  programma;
 può essere utilizzata in altri programmi

 Manutenzione del codice: Correzioni di errori e miglioramenti 
dell'efficienza si  concentrano su una sola porzione di codice

Ogni funzione deve svolgere un solo compito. Funzioni complesse (che 
svolgono più compiti) devono essere scomposte secondo la logica top‐down 
(approccio illustrato successivamente in queste slide).

La distinzione Programma principale e sottoprogramma evidenzia il rapporto 


tra due funzioni. La prima utilizza la  seconda per svolgere una parte del 
compito assegnato.
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
20 La sintassi per dichiarare una function in VBA è la seguente: 

Function nomeFunzione (parametri) As Tipo


dichiarazione variabili locali
Istruzioni ...
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

NomeFunzione=valorerestituito
End Function

 Per terminare una funzione senza giungere alla fine (End Function) si 
usa Exit Function

 È buona norma, anche se non obbligatorio, dichiarare le variabili locali  
all’inizio della funzione onde evitare di "modificare" inavvertitamente 
durante l'esecuzione i contenuti di variabili globali omonime.

 Il valore da restituire viene assegnato al nome della  funzione

 Le funzioni che devono essere utilizzate globalmente all'interno della 
cartella di excel vanno dichiarate come public all'interno di un modulo.
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
21
La sintassi per dichiarare una sub non è molto differente (a parte la 
non restituzione di un valore) da quella delle function:
Sub nomeSub (parametri)
dichiarazione variabili locali
istruzioni ...
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

End Sub
 Per terminare una procedura senza giungere alla fine (End Sub) si usa  
Exit Sub
 Come nelle funzioni è buona norma, anche se non strettamente 
obbligatorio,  dichiarare le variabili locali all’inizio della procedura
Esempio di function Esempio di Sub
Function pari (x As byte) As Boolean Sub Aspetta(sec As Byte)
Dim y As Integer Dim t As String
y = x Mod 2 t = "00:00:" & Format(sec, "00")
pari = (y = 0) Application.Wait (Now + TimeValue(t))
End Function End Sub
Esempio di chiamata ad una function Esempio di chiamata ad una sub
Risultato=Pari(9) Call Aspetta(3)
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
22
Il passaggio dei parametri
Il passaggio dei parametri in VBA è molto flessibile. Esistono 2 tipologie:
 passaggio per riferimento (indirizzo). Il parametro è preceduto dalla parola 
chiave ByRef. E' il metodo di default usato quando non diversamente indicato
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

 passaggio per valore: il parametro è preceduto dalla keyword ByVal
I parametri possono essere anche facoltativi (optional). La differenza principale 
consiste nel fatto che i parametri passati per valore non possono essere modificati 
da parte delle subroutine chiamata.

Sub Programma() Sub Programma()


Dim X as long Dim X as long
X = 100 X = 100
Call Azzera(X) Stampa 100 poiché  Call Azzera(X) Stampa 0 poiché Azzera() 
debug.print(X) Azzera() non modifica  debug.print(X) è in grado di modificare il 
il parametro passato. parametro passato.
End Sub End Sub
Sub Azzera(ByVal Y as long) Sub Azzera(ByRef Y as long)
Y=0 Y=0
End Sub End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


23
Gli argomenti di una routine vanno dichiarati, uno dopo l’altro, separandoli 
con la virgola come segue:
 Per i parametri passati per valore:

ByVal nomeParametro As Tipo


Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

 Per i parametri passato per riferimento
ByRef nomeParametro As Tipo
La parola chiave ByRef si può omettere

Quando viene richiamata una routine il collegamento fra parametri formali
(quelli presenti nella dichiarazione della routine) e parametri attuali (quelli 
usati nella chiamata di routine) può avvenire:
 in maniera posizionale 
 oppure con la sintassi

nomeParametro:= valore

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


24
Quando si richiama una  routine i parametri facoltativi possono essere ignorati 
con queste modalità:
 Evitando di indicarli, lasciando la virgola qualora si debba dare dei valori ai 
parametri successivi a quelli ignorati.
 Usando la notazione := solo con i parametri necessari
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Msgbox "Ho finito!",,"titolo finestra"


Msgbox Prompt:="Ho finito!", Title:="Titolo"
E' possibile passare un numero arbitrario di parametri utilizzando la direttiva 
ParamArray seguito dal nome dell'array dei parametri.
Function Somma(ParamArray X()) As Long
s=0
For i = LBound(X) To UBound(X)
s = s + X(i)
Next
Somma = s
End Function

Possiamo poi richiamare la nostra funzione con un numero arbitrario di 
argomenti. Y=Somma(1,2,3)
Z=Somma(1,2,3,4,5)
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
25
Chiamata a Funzione o a Sub
Per richiamare una funzione si possono usare tre sintassi alternative:

Call nomeFunzione (argomenti)


nomeFunzione argomenti
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

val = nomeFunzione (argomenti)

dove argomenti rappresenta l’elenco dei parametri
Si osservi che:
 con le prime due notazioni si perde il valore restituito
 Quando si desidera assegnare il valore restituito ad una  variabile le parentesi 
tonde sono obbligatorie
Per richiamare una procedura si possono usare le due sintassi alternative:
Si noti la mancanza delle 
Call nomeProcedura(argomenti) parentesi nel secondo modo 
mentre con l’istruzione 
Call è obbligatorio l’uso 
nomeProcedura argomenti delle parentesi

dove argomenti rappresenta l’elenco dei parametri
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
26
Aggiungere le parentesi nel secondo modo nelle sub provoca un  
comportamento anomalo (è quindi bene evitarlo!):
 Se vi è un solo parametro è comunque passato ByVal
 Se vi è più di un parametro è generato un errore di sintassi
Nelle function l’uso delle parentesi per racchiudere i parametri attuali è  
diverso rispetto alle sub. Se non si assegna il valore restituito ad una variabile 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

le parentesi  vanno omesse; in caso contrario si ha un comportamento  
anomalo:
 Se vi è un solo parametro è comunque passato ByVal
 Se vi è più di un parametro è generato un errore di sintassi:

Stampa 100 poiché Azzera 
Sub Programma() è scritto con le () senza  Sub Programma()
l'istruzione Call e pertanto 
Dim X as long il parametro, anche se  Dim X as long
X = 100 dichiarato ByRef, viene  X = 100
Azzera(X) trattato come se fosse 
Azzera(X)
ByVal
debug.print(X) debug.print(X)
End Sub Stampa 100 poiché Azzera  End Sub
è scritto con le () senza 
Sub Azzera(ByRef Y as long) alcun assegnamento e  Function Azzera(ByRef Y as long) as long
Y=0 pertanto il parametro,  Y=0
anche se dichiarato 
End Sub ByRef, viene trattato  End Function
come se fosse ByVal

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


27
Esempio 1:
Scrivere una funzione che restituisce raddoppiato il valore numerico passato 
come parametro. Inoltre utilizzare questa funzione in una Sub che legge il 
valore dalla cella A3, lo passa alla funzione e quindi scrive il risultato nella 
cella C8
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Function raddoppia(val As Double)


raddoppia = val * 2
End Function

Sub calcola()
Dim v As Double
v = Range("A3").Value
Range("C8").Value = raddoppia(v)
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


28
Esempio 2:
Scrivere una funzione che restituisce vero se il numero passato come argomento 
è pari, falso altrimenti. Scrivere un'ulteriore funzione che genera un intero 
compreso tra A e B dove A e B sono i parametri della funzione. Generare in un 
ulteriore sub 10 numeri compresi tra A e B e dire quanti sono i pari.
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Function GeneraInteroTra(A As byte, B as Byte) As Byte


GeneraInteroTra = round((B-A)*Rnd())+A
End Function

Function pari (x As Byte) As Boolean


pari = ((x Mod 2) = 0)
Sub ContaPari()
End Function
Dim n as long, x as byte
n=0
For i=1 to 10
x=GeneraInteroTra(1,10)
n = n + iif(pari(x),1,0)
Next
msgbox "Generati " & n & " pari!"
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


29
Esempio 3: Esecuzione di una subroutine
Sub Programma() Variabili locali di Programma()
allocate dopo l'avvio della sub in
Dim m1 As Double, m2 As Double corrispondenza dell'istruzione DIM
o del primo assegnamento (solo
Dim a As Double, b As Double, z As Double se non dichiarate!).
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
w=7
m1 = calcoloMedia(a, b)
Non ancora allocata poiché
m2 = calcoloMedia(2, 4) non è stata dichiarata ne
utilizzata
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y
calcoloMedia = somma / 2
End Function

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


30

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
Passaggio dei
m3 = calcoloMedia(z, w) parametri (byRef)

End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y
calcoloMedia = somma / 2
End Function

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


31

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Allocazione
Dim somma As Double variabili locali di
calcolaMedia()
somma = x + y x y
5.0 11.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function
La variabile somma viene allocata quando
l'esecuzione arriva alla dichiarazione
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
32

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y x y
5.0 11.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function
La variabile somma viene allocata

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


33

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y x y
5.0 11.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function 16.0

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


34

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y x y
5.0 11.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function 16.0 8.0

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


35

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Restituzione
Dim somma As Double del risultato
somma = x + y x y
5.0 11.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function 16.0 8.0

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


36

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Deallocazione
Dim somma As Double variabili locali di
calcolaMedia()
somma = x + y x y
5.0 11.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function 16.0 8.0

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


37

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0
w=7
m1 = calcoloMedia(a, b)
Passaggio dei parametri
m2 = calcoloMedia(2, 4) (essendo costanti verranno
passati come byVal)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y
calcoloMedia = somma / 2
End Function

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


38

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Allocazione
Dim somma As Double variabili locali di
calcolaMedia()
somma = x + y x y
2.0 4.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function
La variabile somma viene allocata quando
l'esecuzione arriva alla dichiarazione
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
39

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y x y
2.0 4.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function
La variabile somma viene allocata

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


40

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y x y
2.0 4.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function 6.0

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


41

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y x y
2.0 4.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function 6.0 3.0

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


42

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Restituzione
Dim somma As Double del risultato
somma = x + y x y
2.0 4.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function 6.0 3.0

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


43

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0 3.0
w=7
m1 = calcoloMedia(a, b)
m2 = calcoloMedia(2, 4)
m3 = calcoloMedia(z, w)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Deallocazione
Dim somma As Double variabili locali di
calcolaMedia()
somma = x + y x y
2.0 4.0
calcoloMedia = somma / 2
somma calcoloMedia
End Function 6.0 3.0

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


44

Sub Programma()
Dim m1 As Double, m2 As Double
Dim a As Double, b As Double, z As Double
a=5
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

a b z w
b = 11 5.0 11.0 3.0 7.0

z=3 m1 m2 m3
8.0 3.0
w=7
m1 = calcoloMedia(a, b) Appena viene
utilizzata viene
m2 = calcoloMedia(2, 4) allocata
Passaggio dei
m3 = calcoloMedia(z, w) parametri (byRef)
End Sub
Function calcoloMedia(x As Double, y As Double) As Double
Dim somma As Double
somma = x + y
calcoloMedia = somma / 2
End Function

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


45
Esempio 4: Passaggio parametri
Sub Programma() X Sub Programma() X
Dim X As Long 1 Dim X As Long 1
X=1 X=1
Call Proc1(X) ' o Proc1 X Call Proc1(X) ' o Proc1 X
MsgBox X MsgBox X
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Proc2 X ' <> da Proc2(X) Proc2 X ' <> da Proc2(X)


MsgBox X MsgBox X
X = Funct1(X) X = Funct1(X)
MsgBox X MsgBox X
End Sub End Sub ByVal crea
una variabile
locale
Sub Proc2(ByRef Y As Long) Sub Proc2(ByRef Y As Long) inizializzata
Y = Y + 77 Y = Y + 77 con il valore
End Sub End Sub passato come
parametro

Sub Proc1(ByVal X As Long) Sub Proc1(ByVal X As Long) X


X = X + 77 X = X + 77 1
End Sub End Sub

Function Funct1(ByVal Z As Long) _ Function Funct1(ByVal Z As Long) _


As Long As Long
Funct1 = Z + 77 Funct1 = Z + 77
End Function End Function
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
46

Sub Programma() XX Sub Programma() X


Dim X As Long 11 Dim X As Long 1
X=1 X=1
Call Proc1(X) ' o Proc1 X Call Proc1(X) ' o Proc1 X
MsgBox X MsgBox X
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Proc2 X ' <> da Proc2(X) Proc2 X ' <> da Proc2(X)


MsgBox X MsgBox X
X = Funct1(X) X = Funct1(X)
MsgBox X MsgBox X
End Sub End Sub

Sub Proc2(ByRef Y As Long) Sub Proc2(ByRef Y As Long)


Y = Y + 77 Y = Y + 77
End Sub End Sub

Sub Proc1(ByVal X As Long) X Sub Proc1(ByVal X As Long)


X = X + 77 78 X = X + 77
End Sub End Sub

Function Funct1(ByVal Z As Long) _ Function Funct1(ByVal Z As Long) _


As Long As Long
Funct1 = Z + 77 Funct1 = Z + 77
End Function End Function
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
47

Sub Programma() X Sub Programma() X


Dim X As Long 1 Dim X As Long 78
X=1 X=1
Call Proc1(X) ' o Proc1 X Call Proc1(X) ' o Proc1 X
MsgBox X MsgBox X
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Proc2 X ' <> da Proc2(X) Proc2 X ' <> da Proc2(X)


MsgBox X MsgBox X
X = Funct1(X) X = Funct1(X)
MsgBox X MsgBox X
End Sub End Sub

Sub Proc2(ByRef Y As Long) Y Sub Proc2(ByRef Y As Long) Y


Y = Y + 77 1 Y = Y + 77 78
End Sub End Sub

Sub Proc1(ByVal X As Long) Sub Proc1(ByVal X As Long)


X = X + 77 X = X + 77
End Sub End Sub

Function Funct1(ByVal Z As Long) _ Function Funct1(ByVal Z As Long) _


As Long As Long
Funct1 = Z + 77 Funct1 = Z + 77
End Function End Function
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
48

Sub Programma() X Sub Programma() X


Dim X As Long 78 Dim X As Long 78
X=1 X=1
Call Proc1(X) ' o Proc1 X Call Proc1(X) ' o Proc1 X
MsgBox X MsgBox X
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Proc2 X ' <> da Proc2(X) Proc2 X ' <> da Proc2(X)


MsgBox X MsgBox X
X = Funct1(X) X = Funct1(X)
MsgBox X MsgBox X
End Sub End Sub

Sub Proc2(ByRef Y As Long) Sub Proc2(ByRef Y As Long)


Y = Y + 77 Y = Y + 77
End Sub End Sub

Sub Proc1(ByVal X As Long) Sub Proc1(ByVal X As Long)


X = X + 77 X = X + 77
End Sub End Sub

Function Funct1(ByVal Z As Long) _ Function Funct1(ByVal Z As Long) _


As Long As Long Funct1 Z
Funct1 = Z + 77 Funct1 = Z + 77 78
End Function End Function
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
49

Sub Programma() X Sub Programma() X


Dim X As Long 78 Dim X As Long 155
X=1 X=1
Call Proc1(X) ' o Proc1 X Call Proc1(X) ' o Proc1 X
MsgBox X MsgBox X
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Proc2 X ' <> da Proc2(X) Proc2 X ' <> da Proc2(X)


MsgBox X MsgBox X
X = Funct1(X) X = Funct1(X)
MsgBox X MsgBox X
End Sub End Sub

Sub Proc2(ByRef Y As Long) Sub Proc2(ByRef Y As Long)


Y = Y + 77 Y = Y + 77
End Sub End Sub

Sub Proc1(ByVal X As Long) Sub Proc1(ByVal X As Long)


X = X + 77 X = X + 77
End Sub End Sub

Function Funct1(ByVal Z As Long) _ Function Funct1(ByVal Z As Long) _


As Long Funct1 Z As Long Funct1 Z
Funct1 = Z + 77 155 78 Funct1 = Z + 77 155 78
End Function End Function
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
50

Sub Programma() Analizzando l'esempio si evince che qualsiasi 


X
Dim X As Long 155 Function può essere riscritta in termini di Sub
X=1 passandogli come parametro ByRef la 
Call Proc1(X) ' o Proc1 X variabile a cui assegnavo la funzione
MsgBox X
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Proc2 X ' <> da Proc2(X)


MsgBox X
X = Funct1(X)
MsgBox X Y=F(X)
End Sub
Function F (ByVal X) as Tipo
Sub Proc2(ByRef Y As Long) …
Y = Y + 77 End Function
End Sub

Sub Proc1(ByVal X As Long)


X = X + 77 P(Y, X)
End Sub
Sub P (ByRef Y, ByVal X)
Function Funct1(ByVal Z As Long) _ Y=F(X)
As Long End Sub
Funct1 = Z + 77
End Function
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
51
Visibilità delle variabili
In VBA è possibile inserire dei moduli dove 
si possono scrivere sottoprogrammi utili a 
tutti i fogli della nostra cartella di lavoro 
(librerie)
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Questi moduli, contenenti funzioni d'uso comune, 
possono essere ricopiati in altre cartelle di lavoro 
consentendone il loro riuso

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


52
Per visibilità di una variabile si intende la possibilità di utilizzarla e modificarla 
all'interno di un determinato ambito come ad esempio una Sub. 
La visibilità di una variabile  è determinata dalle modalità di dichiarazione 
utilizzate. In VBA i livelli di visibilità (ambiti) sono tre:
 Livello Routine 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

 Livello Modulo
 Livello Pubblico
Una variabile con ambito routine o locale viene riconosciuta solo all'interno 
della routine in cui è dichiarata. Una variabile locale viene dichiarata con 
un'istruzione Dim o Static all'interno della routine.

Quando una variabile locale viene dichiarata con l'istruzione Dim, questa 
resta valida solo finché è in esecuzione la routine in cui è dichiarata. Al 
termine della procedura in esecuzione, i valori delle variabili locali della 
routine non vengono mantenuti poiché la memoria allocata per tali variabili 
viene rilasciata. 
Alla successiva esecuzione della procedura tutte le variabili locali vengono 
reinizializzate. 

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


53

Una variabile locale dichiarata con l'istruzione Static resta valida per tutto il 
tempo di esecuzione. La variabile viene reimpostata solo quando:
 La routine genera un errore di run‐time non intercettato (on error).
 L'esecuzione di Visual Basic viene interrotta.
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

 Si chiude Microsoft Excel

Esempio 5: Variabili locali e statiche

Sub Programma() Sub ProvaStatic()


ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
End Sub Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


54 Allocazione
variabili locali di
provaStatic()

Sub Programma() Sub ProvaStatic() num Accumula


ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

End Sub Accumula = Accumula + CDbl(num)


MsgBox "Il totale attuale è " & Accumula
End Sub

Si osservi che
Sub Programma()
num contiene
ProvaStatic una stringa

ProvaStatic Sub ProvaStatic() num Accumula


"1"
End Sub Static Accumula As Double
num = InputBox("Digita un numero: ")
Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


55

Sub Programma() Sub ProvaStatic() num Accumula


"1" 1
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

End Sub Accumula = Accumula + CDbl(num)


MsgBox "Il totale attuale è " & Accumula
End Sub

Sub Programma()
ProvaStatic
ProvaStatic Sub ProvaStatic() num Accumula
"1" 1
End Sub Static Accumula As Double
num = InputBox("Digita un numero: ")
Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


56

Sub Programma() Sub ProvaStatic() num Accumula


"1" 1
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

End Sub Accumula = Accumula + CDbl(num)


MsgBox "Il totale attuale è " & Accumula
End Sub

Deallocazione
variabili locali di
ProvaStatic()

Sub Programma() Sub ProvaStatic() num Accumula


"1" 1
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
End Sub Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


57

Sub Programma() Sub ProvaStatic() Accumula


1
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

End Sub Accumula = Accumula + CDbl(num)


MsgBox "Il totale attuale è " & Accumula
End Sub

Allocazione delle
variabili locali di
ProvaStatic()

Sub Programma() Sub ProvaStatic() num Accumula


1
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
End Sub Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


58

Sub Programma() Sub ProvaStatic() num Accumula


1
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

End Sub Accumula = Accumula + CDbl(num)


MsgBox "Il totale attuale è " & Accumula
End Sub

Sub Programma() Sub ProvaStatic() num Accumula


"1" 2
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
End Sub Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


59

Sub Programma() Sub ProvaStatic() num Accumula


"1" 2
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

End Sub Accumula = Accumula + CDbl(num)


MsgBox "Il totale attuale è " & Accumula
End Sub

Sub Programma() Sub ProvaStatic() num Accumula


"1" 2
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
End Sub Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


60
Deallocazione
variabili locali di
ProvaStatic()

Sub Programma() Sub ProvaStatic() num Accumula


"1" 2
ProvaStatic Static Accumula As Double
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

ProvaStatic num = InputBox("Digita un numero: ")


End Sub Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Sub Programma() Sub ProvaStatic() Accumula


2
ProvaStatic Static Accumula As Double
ProvaStatic num = InputBox("Digita un numero: ")
End Sub Accumula = Accumula + CDbl(num)
MsgBox "Il totale attuale è " & Accumula
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


61 Una variabile che viene riconosciuta in tutte le procedure di un modulo è 
denominata variabile "a livello di modulo". Una variabile a livello di modulo 
non è disponibile per le routine di altri moduli. Le variabili a livello di modulo 
possono essere dichiarate con un'istruzione Dim o Private nella parte 
superiore del modulo al di sopra della prima definizione di routine. L'uso di Dim
o Private è completamente equivalente.
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Solitamente si usa Private per la visibilità a livello di modulo mentre Dim
per le variabili locali allo scopo di rendere più chiaro l'ambito (visibilità) di una 
determinata variabile.
Le variabili pubbliche risultano visibili in ogni modulo della cartella di lavoro 
attiva. Una variabile pubblica viene sempre dichiarata con un'istruzione 
Public . Una variabile pubblica può essere dichiarata in qualsiasi foglio 
modulo ma non all'interno di una routine. Come per le variabili a livello di 
modulo anche le variabili pubbliche vanno dichiarate nella parte superiore del 
modulo, sopra la prima definizione di routine.
Il discorso della visibilità è applicabile anche alle costanti e alle sub/function. 
Pertanto una sub con ambito a livello modulo (Private) non potrà essere 
usata in altri moduli.

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


62
Esempio 6: Visibilità a livello di modulo
Private A As Long A B Private A As Long A B
0 0 0 0
Private B As Long Private B As Long

Sub Programma() Sub Programma() B


Dim B As Long Dim B As Long 0
A = 10 A = 10
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

B = 20 B = 20
Inizializza2 Inizializza2
MsgBox (A) MsgBox (A)
Inizializza1 Inizializza1
MsgBox (A) MsgBox (A)
MsgBox (B) MsgBox (B)
End Sub End Sub

Sub Inizializza1() Sub Inizializza1()


Dim A As Long Dim A As Long
A=7 A=7
End Sub End Sub

Sub Inizializza2() Sub Inizializza2()


A=1 A=1
B=1 B=1
End Sub End Sub
Modulo1.bas Modulo1.bas
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
63
Private A As Long A B Private A As Long A B
10 0 1 1
Private B As Long Private B As Long

Sub Programma() B Sub Programma() B


Dim B As Long 20 Dim B As Long 20
A = 10 A = 10
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

B = 20 B = 20
Inizializza2 Inizializza2
MsgBox (A) MsgBox (A)
Inizializza1 Inizializza1
MsgBox (A) MsgBox (A)
MsgBox (B) MsgBox (B)
End Sub End Sub

Sub Inizializza1() Sub Inizializza1()


Dim A As Long Dim A As Long
A=7 A=7
End Sub End Sub

Sub Inizializza2() Sub Inizializza2()


A=1 A=1
B=1 B=1
End Sub End Sub
Modulo1.bas Modulo1.bas
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
64
Esempio: Visibilità a livello di modulo
Private A As Long A B Private A As Long A B
1 1 1 1
Private B As Long Private B As Long

Sub Programma() B Sub Programma() B


Dim B As Long 20 Dim B As Long 20
A = 10 A = 10
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

B = 20 B = 20
Inizializza2 Inizializza2
MsgBox (A) MsgBox (A)
Inizializza1 Inizializza1
MsgBox (A) MsgBox (A)
MsgBox (B) MsgBox (B)
End Sub End Sub

Sub Inizializza1() Sub Inizializza1() A


Dim A As Long Dim A As Long 7

A=7 A=7
End Sub End Sub

Sub Inizializza2() Sub Inizializza2()


A=1 A=1
B=1 B=1
End Sub End Sub
Modulo1.bas Modulo1.bas
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
65
Private A As Long A B Private A As Long A B
1 1 1 1
Private B As Long Private B As Long

Sub Programma() B Sub Programma() B


Dim B As Long 20 Dim B As Long 20
A = 10 A = 10
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

B = 20 B = 20
Inizializza2 Inizializza2
MsgBox (A) MsgBox (A)
Inizializza1 Inizializza1
MsgBox (A) MsgBox (A)
MsgBox (B) MsgBox (B)
End Sub End Sub

Sub Inizializza1() Sub Inizializza1()


Dim A As Long Dim A As Long
A=7 A=7
End Sub End Sub

Sub Inizializza2() Sub Inizializza2()


A=1 A=1
B=1 B=1
End Sub End Sub
Modulo1.bas Modulo1.bas
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
66
Esempio 7: Una funzione inutile
Inseriamo in un modulo la seguente funzione:

Function ChiSono() As String


ChiSono = "Marco"
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

End Function

Andiamo su un qualsiasi foglio della cartella di lavoro corrente e digitiamo:

Funzione assolutamente inutile che però ci suggerisce che possiamo creare 
nuove funzioni utilizzabili a livello di MACRO di Excel. Possiamo quindi 
ampliare il set delle funzioni disponibili (oltre a quelle base fornite da excel)  
ma soprattutto costruire soluzioni alternative alle lunghissime formule che 
solitamente l'utilizzo delle MACRO di Excel ci impone. 

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


67
Esempio 8: Una funzione illuminante
Scarichiamo i files di supporto VBA3.supporto.zip ed estraiamo il file VBA3‐
Arduino.xlsm. Apriamo il file: 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Ipotizziamo di avere un scheda Arduino connessa alla porta USB del mio PC con un led 
montato sul pin 13 (?!? … non importa!)
Arduino è una piattaforma open‐source 
utilizzata per la costruzione di progetti di 
elettronica e automazione.
Arduino consiste in una scheda fisica 
programmabile con micro‐controllore e di 
una parte software, o IDE (Integrated 
Development Environment), che eseguito 
sul computer, viene usato per scrivere e 
caricare codice informatico in linguaggio 
"C" nella scheda fisica.
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
Cliccando sul radio button "Accendi" osserviamo il LED  … mentre cliccando sul radio button "Spegni", come 

68
accendersi … d'incanto, il LED si spegne.
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

La cartella VBA3‐Arduino.xlsm mette a disposizione 3 funzioni (evidentemente non 
standard per Excel!) che consentono: 1) di accendere il LED (=AccendiLED())

Possibili output prodotti dalla 
macro VBA =AccendiLED()

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


69
… 2) di spegnere il LED (=SpegniLED())

Possibili output prodotti dalla 
macro VBA =SpegniLED()
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

… 3) di valutare lo stato del LED (=StatusLED())

Possibili output prodotti dalla 
macro VBA =StatusLED()

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


70
Analizzando il contenuto del file VBA3‐Arduino.xlsm abbiamo:
Public Function Comanda_LED(Comando As String)
Dim lngStatus As Long
Dim strData As String
Dim Risposta As String
Dim intPortID As Integer

intPortID = 3 ' Porta Seriale usata per comunicare con ARDUINO


Comando = UCase(Comando)
If Comando = "A" Or Comando = "S" Or Comando = "M" Then ' Se è un comando valido ...
' Apro la comunicazione seriale sulla porta USB
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Call CommOpen(intPortID, "COM" & intPortID, "baud=9600 parity=N data=8 stop=1")


' Scrivo il comando che verrà recepito dal microcontrollore su Arduino
lngStatus = CommWrite(intPortID, Comando)
Sleep (50) ' Aspetto un attimino Apro la comunicazione
' Leggo in scioltezza il risultato del mio comando seriale USB (CommOpen)
lngStatus = CommRead(intPortID, Risposta, 100)
' Chiudo la comunicazione Invio il comando sulla
Call CommClose(intPortID) seriale (CommWrite)
' La funzione restituisce la risposta avuta dal Micro Controllore
Comanda_LED = Risposta Attendo un attimo che
Else Arduino elabori il comando
Comanda_LED = ("Comando """ & Comando & """ Errato!")
End If
Leggo la risposta
End Function (CommRead)

Public Function AccendiLED()


Chiudo la connessione
AccendiLED = Comanda_LED("A") USB (CommClose)
End Function

Public Function SpegniLED()


SpegniLED = Comanda_LED("S")
End Function Restituisco la
stringa ricevuta
Public Function StatusLED() da Arduino
StatusLED = Comanda_LED("M")
End Function

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


71
Nel codice noto la presenza di alcuni comandi che mi permettono di operare sulla 
connessione seriale USB (con la quale ho collegato il PC alla scheda Arduino)
Call CommOpen(intPortID, "COM" & intPortID, "baud=9600 parity=N data=8 stop=1")
lngStatus = CommWrite(intPortID, Comando)
lngStatus = CommRead(intPortID, Risposta, 100)
Call CommClose(intPortID)

Tali istruzioni (non appartenenti al set standard di 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

istruzioni messe a disposizione dal VBA) sono 
contenute nel modulo LIB_COMM. Tale modulo 
svolge la funzione di libreria di comandi che 
possiamo inserire all'interno di una cartella di Excel 
tutte le volte che abbiamo necessità di comunicare 
con  il mondo esterno tramite le porte seriali USB.
Public Function AccendiLED()
AccendiLED = Comanda_LED("A")
Le funzioni AccendiLED(), 
End Function SpegniLED() e StatusLED()
mettono a disposizione dell'utente 
Public Function SpegniLED()
SpegniLED = Comanda_LED("S") finale semplici ed intuitivi comandi.
End Function

Public Function StatusLED()


StatusLED = Comanda_LED("M")
End Function

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


72
#define led 13 // Il Pin 13 è quello connesso al LED

Arduino riceve, sulla  char rx = 0;

void setup()
// variabile per contenere il comando ricevuto

porta USB, dei  {
Serial.begin(9600); // imposto la seriale per lavorare a 9600 baud

comandi che deve  pinMode(led, OUTPUT); // imposta il pin 13 come pin di OUTPUT.


Serial.flush(); // Svuoto il buffer di ricezione seriale
Serial.println("Comandi disponibili:\nA -> accendi\nS -> Spegni\nM -> Stato LED");
interpretare per  }
Comando ricevuto da Arduino (una lettera) inviato con EXCEL
eseguire.  void loop()
{
if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
Pertanto Arduino  {
rx = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

deve essere istruito  Serial.flush(); // svuoto il buffer di ricezione seriale


if (rx=='A' || rx=='a') // ho ricevuto la A maiuscola o minuscola
{
opportunamente e  if (digitalRead(led) == LOW) // il led e' spento
{

questo avviene  }
digitalWrite(led,HIGH); // lo accendo
Serial.println("Comando \"A\" -> Ho acceso il LED");

mediante la scrittura  else
Serial.println("Comando \"A\" -> Ignorato! Il LED e' acceso!");

di un programma,  }
else if (rx=='S' || rx=='s') // ho ricevuto la S maiuscola o minuscola
{
questa volta scritto  if (digitalRead(led) == HIGH) // il led è acceso
{

in C (il micro non ha  }
digitalWrite(led,LOW); // lo spengo
Serial.println("Comando \"S\" -> Ho spento il LED");

la potenza  else
Serial.println("Comando \"S\" -> Ignorato! Il LED e' spento!");

computazionale per  }
else if (rx=='M' || rx=='m') // ho ricevuto la M maiuscola o minuscola
{
reggere l'interprete  if (digitalRead(led) == HIGH) // il led era acceso?
Serial.println("Comando \"M\" -> Stato LED: acceso");

VBA! E neppure la  }
else
Serial.println("Comando \"M\" -> Stato LED: spento");

necessità!). else // Ho ricevuto un altro carattere


{
Serial.print("Comando \"");
Serial.print((char)rx); Testo che Arduino 
Serial.println("\" -> Non riconosciuto!");
} invia ad EXCEL come 
}
}
risposta al comando

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


73
Lo schema applicativo è riassunto nella seguente figura:
Applicazione in VBA Applicazione EXE in C
Invece di scrivere in VBA potevo utilizzare un altro 
linguaggio di programmazione. Ad esempio il C. Il 
sorgente di questa applicazione è in VBA3.Supporto.zip
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

API (kernel.dll)

Comando "A" "S" "M"

Risposta Arduino

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


74
Esempio 9: Tasso di interesse applicato
Nell'Esercizio E1.06, di una precedente esercitazione, abbiamo che in base al 
capitale versato viene applicato un tasso di interesse che varia come indicato:
 se il capitale è maggiore di 20.000 il tasso è 10% (0,1).
 se il capitale è compreso tra 5.000 a 20.000 il tasso è 5% (0,05).
 se il capitale è un valore positivo inferiore a 5.000 il tasso è 4% (0,04).
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

 per importi negativi o non numerici deve apparire la scritta "Errore".
Con le Macro di Excel la soluzione (se il capitale è posto in una cella denominata 
Cap) è la seguente:
=SE(CELLA("tipo";Cap)="v";
SE(Cap>20000;
10%;
SE(Cap>5000;
0,05;
SE(Cap>0;0,04;"Errore")
)
);
"Errore")

Se la formula va applicata a diversi valori di capitale bisogna replicare e modificare 
la formula, piuttosto lunga, più volte. Inoltre se i tassi cambiano occorre scorrere il 
foglio alla ricerca di queste formule decisamente complesse da aggiornare.
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
75
In altre parole la manutenzione di formule così complesse può determinare seri 
problemi di gestione. In alternativa, utilizzando il VBA, possiamo scrivere la 
seguente funzione all'interno di un modulo:
Public Function TassoApplicato(c As Range) As Variant
If IsNumeric(c) Then
If c > 20000 Then
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

TassoApplicato = 0.1
ElseIf (c > 5000) Then
TassoApplicato = 0.05
ElseIf (c > 0) Then
TassoApplicato = 0.04
Else
TassoApplicato = "Errore"
End If
Else
TassoApplicato = "Errore"
End If
End Function

E poi utilizzarla all'interno di una cella come se fosse una normalissima macro.

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


76
Approccio top-down e bottom-up
I modelli top‐down e bottom‐up sono strategie utilizzate nell'ambito dello 
sviluppo del software. In linea generale definiscono l'approccio per analizzare 
un problema e costruire un'adeguata sequenza di operazioni volte alla sua 
risoluzione. La programmazione top‐down è uno stile di programmazione la cui 
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

strategia può essere cosi riassunta:

 Strategia: divide et impera
1. scomposizione del problema in sottoproblemi
2. risoluzione dei singoli sottoproblemi
3. "coordinamento" dei risultati
Pertanto l'Approccio:
 analizza i requisiti del problema
 li scompone in sottorequisiti
 termina quando i sottorequisiti sono compiti elementari

L'obiettivo è quello di facilitare nel processo di sviluppo la progettazione, 
l'implementazione, la manutenzione e l'aggiornamento di applicazioni 
complesse.
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
77
Nell'approccio bottom‐up lo schema è ribaltato:
 Si parte dai compiti elementari che si sanno già svolgere
 li si combina per crearne di più complessi
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

E' necessario quindi creare librerie di funzioni come punto di 
partenza.
dati finanziari dati meteo

AnalisiFinanziaria AnalisiMeteo

calcoloMedia(x) RISULTATI
RISULTATI

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


78
Esempio: metodo top-down
Problema
Si consideri un file "quotazioni.txt" dove sono memorizzate le quotazioni 
settimanali di un titolo di borsa.
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Obiettivo:
Produrre la stampa:
1. della media delle quotazioni, 
2. dell'elenco delle variazioni settimanali
3. della media delle  variazioni settimanali

Esempio
Quotazioni.txt  "10.50, 11.00, 10.80"
1. Media quotazioni = (10.50 + 11.00 + 10.80) / 3 = 10.767
2. Elenco delle variazioni settimanali:   0.50, ‐0.20
3. Media delle variazioni settimanali = (0.50 + (‐0.20) ) / 2 = 0.15

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


79
Traccia
La traccia generale per affrontare il problema potrebbe essere 
rappresentata dai 3 seguenti passi:
Leggi dati Stampa risultati
1. leggo il file quotazioni.txt e riverso i dati in un array
2. elaboro i dati contenuti nell'array per ottenere dei risultati Elabora dati

3. stampo i risultati
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Pensando al primo passo (leggi il file) dovrò seguire questi passaggi:
 Aprire il file
 Sulla base del formato elaborare opportunamente il contenuto del file
 Riversare in un array i dati prodotti 

Traccia

I sotto step relativi all'elaborazione dei dati possono 
essere così schematizzati: Leggi dati Stampa risultati

Elabora dati
1. calcola media array quotazioni
2. calcola array variazioni
3. calcola media array variazioni Calcolo media Calcolo array Calcolo media
Array quotazioni variazioni Array variazioni

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


80
La "logica" di ciascuno dei tre passi è autonoma  dagli altri. Ogni passo riceve 
dati dal precedente e fornisce  dati al successivo.

Traccia
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Leggi dati Stampa risultati

media quotazioni
array variazioni
media variazioni
Array Quotazioni
Elabora dati

Calcolo media Calcolo array Calcolo media


array quotazioni variazioni array variazioni

array variazioni

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


81
Il diagramma di flusso (flow chart) per affrontare il problema proposto è il 
seguente
INIZIO

arrayQuotazioni=LeggiQuotazioni("Quotazioni.txt")
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

quotazioni settimanali
arrayQuotazioni
mediaQuotazioni=CalcolaMedia(arrayQuotazioni)

arrayVariazioni()=EstraiVariazioni(arrayQuotazioni)
variazioni settimanali
arrayVariazioni
mediaVariazioni=CalcolaMedia(arrayVariazioni)

Stampa: CalcoloMedia(x)
- mediaQuotazioni
- Variazioni restituisci: media
- mediaVariazioni

FINE

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


82 Il codice VBA del programma principale potrebbe essere il seguente:

Sub Programma()
Dim ArrayQuotazioni as Variant, ArrayVariazioni
Dim mediaQuotazioni as Double, mediaVariazioni as Double
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

' passo 1
ArrayQuotazioni=LeggiFile("quotazioni.txt")

' passo 2
mediaQuotazioni=calcoloMedia(ArrayQuotazioni)
ArrayVariazioni=EstraiVariazioni(ArrayQuotazioni)
mediaVariazioni=calcoloMedia(ArrayVariazioni)

' passo3
Stampa (MediaQuotazioni,ArrayVariazioni,mediaVariazioni)
End sub
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
83
Function calcoloMedia(x() As Double) As Double Ecco un esempio di 
Dim somma As Double, i As Integer implementazione 
della funzione 
somma=0
CalcolaMedia()
For i = Lbound(x) To UBound(x)
somma = somma + x(i)
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Next
calcoloMedia = somma /(UBound(x)-Lbound(x)+1)
End Function

La funzione  Function EstraiVariazioni(Q As Variant) As Variant


EstraiVariazioni() Dim i As Long, ArrayVariazioni() As Double
può essere la seguente
ReDim ArrayVariazioni(LBound(Q) To UBound(Q) - 1)
For i = LBound(Q) To UBound(Q) - 1
ArrayVariazioni(i) = Q(i + 1) - Q(i)
Next
EstraiVariazioni = ArrayVariazioni()
End Function
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I

Potrebbero piacerti anche