Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
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
Array e Matrici
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:
Per accedere ad un preciso elemento si utilizzano le sue coordinate:
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
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
Sub ProvaScorrimento3Dimensioni()
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Per ridimensionare una matrice si utilizza l'istruzione ReDim:
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
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
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
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
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.
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
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
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).
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.
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
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:
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
Sub calcola()
Dim v As Double
v = Range("A3").Value
Range("C8").Value = raddoppia(v)
End Sub
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Questi moduli, contenenti funzioni d'uso comune,
possono essere ricopiati in altre cartelle di lavoro
consentendone il loro riuso
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.
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
Si osservi che
Sub Programma()
num contiene
ProvaStatic una stringa
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
Deallocazione
variabili locali di
ProvaStatic()
Allocazione delle
variabili locali di
ProvaStatic()
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.
B = 20 B = 20
Inizializza2 Inizializza2
MsgBox (A) MsgBox (A)
Inizializza1 Inizializza1
MsgBox (A) MsgBox (A)
MsgBox (B) MsgBox (B)
End Sub End Sub
B = 20 B = 20
Inizializza2 Inizializza2
MsgBox (A) MsgBox (A)
Inizializza1 Inizializza1
MsgBox (A) MsgBox (A)
MsgBox (B) MsgBox (B)
End Sub End Sub
B = 20 B = 20
Inizializza2 Inizializza2
MsgBox (A) MsgBox (A)
Inizializza1 Inizializza1
MsgBox (A) MsgBox (A)
MsgBox (B) MsgBox (B)
End Sub End Sub
A=7 A=7
End Sub End Sub
B = 20 B = 20
Inizializza2 Inizializza2
MsgBox (A) MsgBox (A)
Inizializza1 Inizializza1
MsgBox (A) MsgBox (A)
MsgBox (B) MsgBox (B)
End Sub End Sub
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.
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()
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()
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
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
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");
API (kernel.dll)
Risposta Arduino
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.
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
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
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
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
array variazioni
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
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