Lezione 5 Procedure Funzioni Passaggio di parametri Lez

  • Slides: 29
Download presentation
Lezione 5 Procedure Funzioni Passaggio di parametri Lez. 5 (11/12 - PB) Elementi di

Lezione 5 Procedure Funzioni Passaggio di parametri Lez. 5 (11/12 - PB) Elementi di Programmazione 1

Le routine in VBA (1) • Il termine routine in VB racchiude tre modi

Le routine in VBA (1) • Il termine routine in VB racchiude tre modi diversi di gestire sottoprogrammi: – Subroutine o procedure (Sub) • sequenze di istruzioni parametrizzabili che non restituiscono alcun valore se non attraverso i parametri (equivalgono ad una void function() del C) – Function o funzioni (Function) • Simili alle procedure ma restituiscono un valore ed hanno un tipo (come le funzioni in C) – Property o proprietà (Property) • Usate per definire e manipolare le proprietà degli oggetti Lez. 5 (11/12 - PB) Elementi di Programmazione 2

Le routine in VBA (2) • Alle routine è possibile passare dei parametri •

Le routine in VBA (2) • Alle routine è possibile passare dei parametri • Il passaggio dei parametri è molto flessibile in VB: – passaggio per riferimento (indirizzo): By. Ref • Metodo usato se non diversamente indicato – passaggio per valore: By. Val – i parametri possono essere anche facoltativi (Optional) Lez. 5 (11/12 - PB) Elementi di Programmazione 3

Le routine in VBA (3) • Quando viene richiamata una routine il collegamento fra

Le routine in VBA (3) • Quando viene richiamata una routine il collegamento fra parametri formali (quelli con cui si è dichiarata la funzione) e parametri attuali (quelli usati per richiamare la funzione) può avvenire: – In maniera posizionale come in C – Con la sintassi nome. Parametro : = valore Lez. 5 (11/12 - PB) Elementi di Programmazione 4

Le routine in VBA (4) • Gli argomenti di una routine vanno dichiarati uno

Le routine in VBA (4) • Gli argomenti di una routine vanno dichiarati uno dopo l’altro separati da virgola come segue: – Per ogni parametro per valore By. Val nome. Parametro As Tipo – Per ogni parametro per riferimento By. Ref nome. Parametro As Tipo • La parola chiave By. Ref si può omettere Lez. 5 (11/12 - PB) Elementi di Programmazione 5

Procedure (1) Sub nome. Sub (parametri) dichiarazione variabili locali istruzioni End Sub – Per

Procedure (1) Sub nome. Sub (parametri) dichiarazione variabili locali istruzioni End Sub – Per terminare una procedura senza giungere a End Sub si usa Exit Sub – È meglio, non obbligatorio, dichiarare le variabili locali all’inizio della procedura Lez. 5 (11/12 - PB) Elementi di Programmazione 6

Procedure (2) – Per richiamare una procedura si possono usare due sintassi alternative: •

Procedure (2) – Per richiamare una procedura si possono usare due sintassi alternative: • Call nome. Procedura (argomenti) • nome. Procedura argomenti – DA NON USARE ALL’ESAME – Dove argomenti è l’elenco degli argomenti specificato in maniera posizionale o con la sintassi nome. Parametro : = valore – Si noti la mancanza delle parentesi nel secondo modo • Aggiungere le parentesi nel secondo modo ha un altro significato: – il parametro è passato By. Val (cioè viene creato un nuovo oggetto che ha gli stessi valori) nome. Procedura (a), (b), (c) Lez. 5 (11/12 - PB) Elementi di Programmazione 7

Esempio Sub prima. Proc(v 1 As Integer, By. Val v 2 As Integer) Dim

Esempio Sub prima. Proc(v 1 As Integer, By. Val v 2 As Integer) Dim L As Integer Parametri Formali v 1 = v 1 * 3 v 2 = v 2 * 2 L = v 1 + v 2 Msg. Box ("prima. Proc: " & vb. Cr. Lf & "v 1=" & v 1 & " v 2=" & v 2 & _ " l=" & l) End Sub – – – Si è dichiarata una procedura di nome prima. Proc Il parametro v 1 è di tipo Integer passato per riferimento Il parametro v 2 è di tipo Integer passato per valore L è una variabile locale Il carattere vb. Cr. Lf indica il carattere di a capo. Lez. 5 (11/12 - PB) Elementi di Programmazione 8

Esempio Sub richiama() Dim x As Integer, y As Integer Parametri attuali x =

Esempio Sub richiama() Dim x As Integer, y As Integer Parametri attuali x = 8 y = 100 Msg. Box ("richiama: " & vb. Cr. Lf & "x=" & x & " y=" & y) call prima. Proc (x, y) Msg. Box ("richiama: " & vb. Cr. Lf & "x=" & x & " y=" & y) End Sub – La procedura richiama non ha parametri – Vi sono due variabili locali di tipo Integer – Osservare i valori di x ed y prima e dopo il richiamo di prima. Proc Lez. 5 (11/12 - PB) Elementi di Programmazione 9

Esempio Sub prima. Proc(v 1 As Integer, _ By. Val v 2 As Integer)

Esempio Sub prima. Proc(v 1 As Integer, _ By. Val v 2 As Integer) Dim L As Integer v 1 = v 1 * 3 v 2 = v 2 * 2 L = v 1 + v 2 End Sub richiama() Dim x As Integer, y As Integer x = 8 y = 100 richiama() x y 0 0 8 100 24 100 prima. Proc() v 1 v 2 L ^x 100 0 ^x 200 224 call prima. Proc (x, y) End Sub Lez. 5 (11/12 - PB) Elementi di Programmazione 10

Esempio Sub prima(v 1 As Integer, _ By. Val v 2 As Integer) Dim

Esempio Sub prima(v 1 As Integer, _ By. Val v 2 As Integer) Dim L As Integer v 1 = v 1 * 5 v 2 = v 2 - 10 L = v 1 + v 2 Msg. Box ("prima: " & v 1 _ & " " & v 2 & " " & L) End Sub richiama() Dim g As Integer, _ q As Integer g = 10 q = -10 Call prima(g, q) Msg. Box (g & " " & q) Call prima (g, 78) Msg. Box (g & " " & q) End Sub Lez. 5 (11/12 - PB) richiama() g q 10 -10 50 -10 50 50 250 250 -10 -10 -10 Elementi di Programmazione v 1 (^g) (^g) prima() v 2 -10 -20 L / / / 30 prima() v 2 L 78 / 68 318 11

Esempio Option Explicit Sub prova(By. Ref a As_ Integer, _ By. Val b As

Esempio Option Explicit Sub prova(By. Ref a As_ Integer, _ By. Val b As Integer) a = a * 2 b = b * 2 End Sub richiama() Dim x As Integer, _ y As Integer x = 2 y = 10 call prova (x, y) End Sub Lez. 5 (11/12 - PB) richiama() x y 0 0 2 10 4 10 prova() a b (^x) 10 (^x) 20 tempo Elementi di Programmazione 12

Esempio Option Explicit Sub uno(a As Double) Dim b As Double b = a

Esempio Option Explicit Sub uno(a As Double) Dim b As Double b = a * 2 a = a - 2 End Sub richi() Dim x As Double, a As Double x = 10 a = 50 call uno (x) call uno (a) End Sub Lez. 5 (11/12 - PB) richi() x a 0 0 10 50 8 50 8 48 Elementi di Programmazione uno() a (^x) b 0 20 20 (^arichi) 100 13

Esempio Sub richiama 3() Dim x As Integer, y As Integer x = 8

Esempio Sub richiama 3() Dim x As Integer, y As Integer x = 8 y = 100 Msg. Box ("in richiama: " & vb. Cr. Lf & "x=" & x & " y=" & y) Call prima. Proc(x, y) Msg. Box ("in richiama: " & vb. Cr. Lf & "x=" & x & " y=" & y) End Sub • per richiamare la procedura si è usata l’istruzione Call – Si noti che i parametri attuali sono fra parentesi tonde – Anche in questa modalità è possibile passare i parametri usando l’operatore : = Lez. 5 (11/12 - PB) Elementi di Programmazione 14

Funzioni (1) Function nome. Funz (parametri) As Tipo dichiarazione variabili locali istruzioni End Function

Funzioni (1) Function nome. Funz (parametri) As Tipo dichiarazione variabili locali istruzioni End Function – Per terminare una funzione senza giungere a End Function si usa Exit Function – È meglio, non obbligatorio, dichiarare le variabili locali all’inizio della procedura – Il valore che deve restituire la funzione è assegnato al nome della funzione che in pratica è un ulteriore parametro – Le funzioni da aggiungere all’ambiente Excel vanno dichiarate in un modulo (module) Lez. 5 (11/12 - PB) Elementi di Programmazione 15

Funzioni (2) – Per richiamare una funzione si possono usare tre sintassi alternative: •

Funzioni (2) – Per richiamare una funzione si possono usare tre sintassi alternative: • Call nome. Funzione (argomenti) • nome. Funzione argomenti – DA NON USARE ALL’ESAME • Val = nome. Funzione (argomenti) – Dove argomenti è l’elenco degli argomenti specificato in maniera posizionale o con la sintassi nome. Parametro : = valore – Con le prime due notazioni si perde il valore restituito Lez. 5 (11/12 - PB) Elementi di Programmazione 16

Funzioni (3) – L’uso delle parentesi per racchiudere i parametri attuali è diverso rispetto

Funzioni (3) – L’uso delle parentesi per racchiudere i parametri attuali è diverso rispetto alle sub • Con l’istruzione Call è obbligatorio l’uso delle parentesi • Senza assegnare il valore restituito ad una variabile le parentesi vanno omesse; in caso contrario si ha un comportamento anomalo: – Se vi è un solo parametro è comunque passato By. Val – Se vi è più di un parametro è generato un errore di sintassi : • Quando si desidera assegnare il valore restituito ad una variabile le parentesi sono obbligatorie Lez. 5 (11/12 - PB) Elementi di Programmazione 17

Esempio Function pari (x As Integer) As Boolean Dim y As Integer y =

Esempio Function pari (x As Integer) As Boolean Dim y As Integer y = x Mod 2 Prepara il valore per la restituzione al chiamante pari = (y = 0) End Function Sub richiama () Dim r 1 As Boolean, r 2 As Boolean r 1 = pari (5) r 2 = pari (12) Msg. Box (r 1 & " End Sub Lez. 5 (11/12 - PB) " & r 2) Elementi di Programmazione 18

Esempio • Scrivere una funzione che ha come parametro un valore numerico e lo

Esempio • Scrivere una funzione che ha come parametro un valore numerico e lo restituisce raddoppiato • utilizzare questa funzione in Sub che legge un valore dalla cella A 3 lo passa alla funzione e quindi scrive il risultato nella cella C 8 Lez. 5 (11/12 - PB) Elementi di Programmazione 19

Esempio Function raddoppia(val As Double) as Double raddoppia = val * 2 End Function

Esempio Function raddoppia(val As Double) as Double raddoppia = val * 2 End Function Sub calcola() Dim v As Double v = Range("A 3"). Value Range("C 8"). Value = raddoppia(v) End Sub Lez. 5 (11/12 - PB) Elementi di Programmazione 20

Esempio Option Explicit Function raddoppia(A As Double) _ As Double raddoppia = A *

Esempio Option Explicit Function raddoppia(A As Double) _ As Double raddoppia = A * 2 A = A - 2 End Function Sub rch() Dim x As Double, y As Double Dim z As Double, w As Double x = 10 y = 20 z = 30 Call raddoppia(x) call raddoppia(y) w = raddoppia(z) rch() x y 0 0 10 20 8 20 z 0 30 30 w 0 0 0 8 8 20 20 20 18 30 30 0 0 8 8 18 18 30 30 30 28 0 0 8 18 raddoppia() A raddoppia (^x) 0 (^x) 20 20 <(^y) 0 (^y) 40 40 <(^z) 0 (^z) 60 60 <- 28 60 End Sub Lez. 5 (11/12 - PB) Elementi di Programmazione 21

Esempio di chiamata complessa Option Explicit Function raddoppia(A As Double) _ As Double raddoppia

Esempio di chiamata complessa Option Explicit Function raddoppia(A As Double) _ As Double raddoppia = A * 2 A = A - 2 End Function Sub rch() Dim x As Double, y As Double Dim z As Double, w As Double x y z w = = 10 20 30 raddoppia(z) + raddoppia(y) / 5 End Sub Lez. 5 (11/12 - PB) rch() x y 0 0 10 20 10 20 z 0 0 0 30 30 30 28 w 0 0 0 0 10 20 28 0 10 18 28 0 raddoppia() A raddoppia (^z) 0 (^z) 60 60<(^y) 0 (^y) 40 40 <- 10 18 28 68 Elementi di Programmazione 22

Esempio • Scrivere una subroutine che preleva il valore della cella C 7 e

Esempio • Scrivere una subroutine che preleva il valore della cella C 7 e scrive da D 7 in avanti tutti i divisori di C 7 Lez. 5 (11/12 - PB) Elementi di Programmazione 23

Sub divisori() Dim v As Integer, i As Integer Dim j As Integer v

Sub divisori() Dim v As Integer, i As Integer Dim j As Integer v = Range("C 7"). Value j = 1 For i = 1 To v If v Mod i = 0 Then Cells(7, (3 + j)) = i j = j + 1 End If Next ‘ Cancello tutto quello che potrebbe essere stato ‘ scritto da chiamate precedenti… While Not Is. Empty(Cells(7, (3+j))) Cells(7, (3 + j)) = "" j = j + 1 Wend End Sub Lez. 5 (11/12 - PB) Elementi di Programmazione 24

Parametri facoltativi (1) • In VB è molto semplice passare ad una routine una

Parametri facoltativi (1) • In VB è molto semplice passare ad una routine una serie di parametri facoltativi (optional parameter) – Si fa precedere dalla parola chiave Optional • By. Ref o By. Val se presenti • altrimenti Optional precede il nome del parametro I parametri Optional devono essere gli ultimi della lista – Si dichiara il parametro di tipo Variant • Strettamente parlando il parametro potrebbe essere di qualsiasi tipo ma se è di tipo Variant è possibile usare la funzione Is. Missing(nome. Parametro) che restituisce True se il parametro è stato passato alla funzione Lez. 5 (11/12 - PB) Elementi di Programmazione 25

Parametri facoltativi (2) – Quando si richiama la routine i parametri facoltativi possono essere

Parametri facoltativi (2) – Quando si richiama la routine i parametri facoltativi possono essere omessi • Usando la notazione posizionale si mette la virgola (, ) per i parametri che non si vogliono fornire quando si debbono dare dei valori ai parametri successivi a quello da saltare • usando la notazione : = per indicare solo i parametri necessari Lez. 5 (11/12 - PB) Elementi di Programmazione 26

Parametri facoltativi (3) • E’ buona norma dare un valore prefissato per i parametri

Parametri facoltativi (3) • E’ buona norma dare un valore prefissato per i parametri facoltativi : • usando la funzione Is. Missing() per stabilire se il parametro è presente e quindi dando il valore in caso non lo sia • usando la notazione: Optional nome. Parametro = valore. Default oppure Optional nome. Parametro As Tipo = valore. Default Lez. 5 (11/12 - PB) Elementi di Programmazione 27

Esempio Option Explicit Function facoltativi(x As Integer, _ Optional By. Val y = 2,

Esempio Option Explicit Function facoltativi(x As Integer, _ Optional By. Val y = 2, _ Optional k as Variant ) If Is. Missing(k) Then k = 3 facoltativi = x + y + k End Function Sub richiama () Msg. Box (facoltativi(8)) Msg. Box (facoltativi(8, 7)) Msg. Box (facoltativi(8, , 100)) End Sub Lez. 5 (11/12 - PB) Elementi di Programmazione 28

Richiamo : By. Ref e By. Val • By. Val: – il parametro viene

Richiamo : By. Ref e By. Val • By. Val: – il parametro viene passato come valore o COPIA, eventuali modifiche alla copia non influiscono sul valore della variabile originale. • By. Ref: – viene passato il riferimento alla variabile, ovverosia la locazione di memoria in cui risiede il dato. Quindi la procedura accede direttamente alla variabile in questione e può modificarne il valore. Lez. 5 (11/12 - PB) Elementi di Programmazione 29