Lezione 5 Procedure Funzioni Passaggio di parametri Lez
- Slides: 29
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 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 • 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 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 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 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: • 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 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 = 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) 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 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 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 * 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 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 – 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: • 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 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 = 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 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 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 * 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 = 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 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 = 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 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 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 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, _ 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 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
- Lez testi
- Luis gonz lez de alba
- Matthew bourne facts
- Ana mar¡a god¡nez gonz lez
- Luis gonz lez de alba
- Temporizzazione ricostruzione carriera
- Condensazione passaggio di stato
- Passaggio dalla preistoria alla storia
- Il duecento letteratura mappa concettuale
- Passaggio dalla preistoria alla storia
- Adiabatica
- Lingue indoeuropee mappa
- Cometa di halley ultimo passaggio
- Passaggio segreto san pietro
- Bojl mariotov zakon
- Profondità di passata
- Bitrohanterian
- Schema parametri vitali
- Tabella battiti cardiaci sotto sforzo
- Parametri antropometrici neonato
- Abc matematika
- Parametri vitali definizione
- Iperventilazione sintomi
- Konakion intramuscolo
- Parametri vitali bambino
- Efektivna vrednost
- Schema parametri vitali
- Parametri cinetici
- Cvvhdf+impostazione parametri
- Is lezione masculine or feminine