Lezione 6 Parametri Facoltativi Matrici di parametri Lez

  • Slides: 30
Download presentation
Lezione 6 Parametri Facoltativi Matrici di parametri Lez. 6 (10/11) - PB Elementi di

Lezione 6 Parametri Facoltativi Matrici di parametri Lez. 6 (10/11) - PB Elementi di Programmazione 1

Parametri facoltativi • In VB è possibile passare ad una routine una serie di

Parametri facoltativi • In VB è possibile 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 – 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. 6 (10/11) - PB Elementi di Programmazione 2

Parametri facoltativi – Quando si richiama la routine i parametri facoltativi possono essere omessi

Parametri facoltativi – 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. 6 (10/11) - PB Elementi di Programmazione 3

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

Parametri facoltativi • 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. 6 (10/11) - PB Elementi di Programmazione 4

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. 6 (10/11) - PB Elementi di Programmazione 5

Errata Corrige dell’Esempio Durante la lezione dell’ 8/11, nell’esempio appena sopra riportato era stato

Errata Corrige dell’Esempio Durante la lezione dell’ 8/11, nell’esempio appena sopra riportato era stato per errore indicato: Optional k As Integer) Invece di: Optional k As Variant) Lez. 6 (10/11) - PB Elementi di Programmazione 6

Vettori e matrici • Sono gruppi di variabili dello stesso tipo nelle quali si

Vettori e matrici • Sono gruppi di variabili dello stesso tipo nelle quali si fa riferimento agli elementi mediante un indice: – possono avere una (vettori) o più dimensioni (matrici) • Si userà matrice per indicare entrambi i casi – la dimensione può essere fissa o dinamica – gli indici partono da 0: • Si può fare in modo che gli indici partano sempre da 1, come le celle di Excel, scrivendo all’inizio del modulo fuori da tutte le routine: Option Base 1 • si può modificare il punto di partenza e di arrivo Lez. 6 (10/11) - PB Elementi di Programmazione 7

Una matrice monodimensionale • Dim v(n) v 0 1 2 n v(2) Lez. 6

Una matrice monodimensionale • Dim v(n) v 0 1 2 n v(2) Lez. 6 (10/11) - PB Elementi di Programmazione 8

Esempio Option Explicit Sub prv() Dim v(3) As Integer, i As Integer Dim a

Esempio Option Explicit Sub prv() Dim v(3) As Integer, i As Integer Dim a 1 As Integer, a 2 As Integer Dim a 3 As Integer For i = 0 To 3 v(i) = Input. Box("dammi intero " & i & ": ") Range("B" & (i + 1)). Value = v(i) * 2 Range("C" & (i + 1)). Value = v(i) Next End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 9

Matrici • Il singolo elemento di una matrice è una variabile del tipo con

Matrici • Il singolo elemento di una matrice è una variabile del tipo con cui è formata la matrice – Nelle matrici di tipo Variant possono essere presenti sia elementi di tipo numerico che di tipo stringa • Le matrici son passate solo per riferimento (By. Ref) ad una routine • Le matrici NON POSSONO essere – Assegnate in blocco – Confrontate in blocco Lez. 6 (10/11) - PB Elementi di Programmazione 10

Matrici Le matrici NON POSSONO essere – Assegnate in blocco – Confrontate in blocco

Matrici Le matrici NON POSSONO essere – Assegnate in blocco – Confrontate in blocco Lez. 6 (10/11) - PB Elementi di Programmazione 11

Matrici statiche • La dichiarazione avviene specificando il numero di elementi di ogni dimensione:

Matrici statiche • La dichiarazione avviene specificando il numero di elementi di ogni dimensione: Dim nome. Matrice(dim 1, . . . , dim. N) As Tipo – Se si cerca di accedere ad un elemento oltre le dimensioni viene generato un errore di esecuzione – Le variabili di tipo numerico sono inizializzate a 0, quelle di tipo Variant ad Empty • Ci si riferisce ad un elemento attraverso le sue coordinate: nome. Matrice(coord 1, . . . , coord. N) Lez. 6 (10/11) - PB Elementi di Programmazione 12

 • Dim matri(3, 2) • 1 2 • 1 1 2 4 •

• Dim matri(3, 2) • 1 2 • 1 1 2 4 • 2 2 • 3 3 6 Lez. 6 (10/11) - PB Elementi di Programmazione 13

Option Explicit Sub prova. Vettore() Dim vet(3) As Double, matr(4, 3) As Double Dim

Option Explicit Sub prova. Vettore() Dim vet(3) As Double, matr(4, 3) As Double Dim i, j As Integer For i = 0 To 3 vet(i) = Rnd Next For i = 0 To 4 For j = 0 To matr(i, j) Next - 1 3 - 1 = Rnd Range("A 1"). Value = "vettore" For i = 0 To 3 - 1 Cells(1, i + 2). Value = vet(i) Next Range("A 3"). Value = "matrice" For i = 0 To 4 - 1 For j = 0 To 3 - 1 Cells(3 + j, i + 2). Value = matr(i, j) Next End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 14

Esempio Option Explicit Sub matrix() – carica un matrice 2 x 3 di Dim

Esempio Option Explicit Sub matrix() – carica un matrice 2 x 3 di Dim Mt(2, 3) As Double di nome Mt Dim som As Double – somma tutti gli elementi Dim i As Integer contenuti nella matrice Dim j As Integer • la prima coordinata indica le som = 0 righe, la seconda le colonne For i = 0 To 1 0 1 2 For j = 0 To 2 Mt 0 (0, 0) (0, 1) (0, 2) Mt(i, j) =_ 2 5 6. 5 Input. Box("valore (" &_ 1 (1, 0) (1, 1) (1, 2) i & ", " & j & "): ") -6. 5 8 3 som = som + Mt(i, j) Next Cells(1, 1) = som End Sub • Scrivere un sub in VBA che Lez. 6 (10/11) - PB Elementi di Programmazione 15

Matrici statiche • In VB è possibile indicare esplicitamente l’intervallo di variazione degli indici:

Matrici statiche • In VB è possibile indicare esplicitamente l’intervallo di variazione degli indici: Dim nm. Matr (da 1 To a 1, . . . , da. N To a. N) • E’ possibile conoscere quali sono i valori degli indici minimo e massimo di una matrice grazie a LBound(Nome. Matrice, dimensione) UBound(Nome. Matrice, dimensione) – Se non specificato dimensione vale 1 – E’ meglio usare i valori di queste funzioni per gestire le matrici Lez. 6 (10/11) - PB Elementi di Programmazione 16

Sub prova. Vettore() Dim vet(3) As Double, matr(4, 3) As Double, i As Integer,

Sub prova. Vettore() Dim vet(3) As Double, matr(4, 3) As Double, i As Integer, j As Integer For i = LBound(vet) To UBound(vet) vet(i) = Rnd Next For i = LBound(matr, 1) To UBound(matr, 1) For j = LBound(matr, 2) To UBound(matr, 2) matr(i, j) = Rnd Next Range("A 1"). Value = "vettore" For i = LBound(vet) To UBound(vet) Cells(1, i + 2). Value = vet(i) Next Range("A 3"). Value = "matrice" For i = LBound(matr, 1) To UBound(matr, 1) For j = LBound(matr, 2) To UBound(matr, 2) Cells(3 + j, i + 2). Value = matr(i, j) Next End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 17

Matrici statiche Sub prova. Indici() Dim Vet(5 To 9) As Double Dim i As

Matrici statiche Sub prova. Indici() Dim Vet(5 To 9) As Double Dim i As Integer For i = LBound(Vet) To UBound(Vet) Vet(i) = i * 10 Next For i = LBound(Vet) To UBound(Vet) Cells(6, i + 2). Value = Vet(i) Next End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 18

Esempio • Scrivere una funzione che legge il contenuto delle celle da A 1

Esempio • Scrivere una funzione che legge il contenuto delle celle da A 1 ad A 5 e lo memorizza in un vettore • lo raddoppia e lo scrive nelle celle da B 7 in poi Lez. 6 (10/11) - PB Elementi di Programmazione 19

Option Explicit Option Base 1 Sub matri() Dim celle(5) As Double, i As Integer

Option Explicit Option Base 1 Sub matri() 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 Lez. 6 (10/11) - PB Elementi di Programmazione 20

Matrici dinamiche • Le matrici dinamiche possono cambiare la loro dimensione durante l’esecuzione Dim

Matrici dinamiche • Le matrici dinamiche possono cambiare la loro dimensione durante l’esecuzione Dim nm. Matr. Din() As Tipo – Prima dell’uso la matrice va dimensionata: Re. Dim nm. Matr. Dim(dim 1, . . . , dim. N) • Una matrice può essere ridimensionata più volte durante l’esecuzione – Ogni ridimensionamento fa perdere il contenuto precedente a meno di usare l’opzione Preserve. • Dimi può essere l’estremo superiore oppure un intervallo (valore. Iniziale To Valore. Finale) Lez. 6 (10/11) - PB Elementi di Programmazione 21

Matrici dinamiche Sub matr. Din() Dim n. D() As Double Modifica estremo superiore Dim

Matrici dinamiche Sub matr. Din() Dim n. D() As Double Modifica estremo superiore Dim i, j As Integer prima dimensione Re. Dim n. D(8) For i = LBound(n. D) To UBound(n. D) Modifica estremo n. D(i) = i Inferiore e superiore della Cells(1, i + 1). Value = n. D(i) seconda dimensione Next Re. Dim n. D(4, 8 To 13) For i = LBound(n. D, 1) To UBound(n. D, 1) For j = LBound(n. D, 2) To UBound(n. D, 2) n. D(i, j) = i * j + 100 Cells(3 + i, j + 1) = n. D(i, j) Next End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 22

Option Explicit Option Base 1 Sub allunga() Dim vt() As Double, i As Integer

Option Explicit Option Base 1 Sub allunga() Dim vt() As Double, i As Integer Dim v. Dim As Integer, j As Integer Re. Dim vt(4) For i = LBound(vt) To UBound(vt) vt(i) = Rnd: Cells(1, i) = vt(i) Next v. Dim = UBound(vt): Re. Dim vt(8, 2) For i = LBound(vt) To UBound(vt) For j = LBound(vt, 2) To UBound(vt, 2) vt(i, j) = Rnd Next: Next For i = LBound(vt) To UBound(vt) For j = LBound(vt, 2) To UBound(vt, 2) Cells(2 + i, j) = vt(i, j) Next: Next End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 23

Matrici Dinamiche • L’uso di Re. Dim con l’opzione Preserve impedisce la modifica: –

Matrici Dinamiche • L’uso di Re. Dim con l’opzione Preserve impedisce la modifica: – Delle dimensioni della matrice eccetto l’ultima • In un vettore a due dimensioni posso modificare solo la seconda • In un vettore ad una dimensione posso modificare la dimensione – Del numero delle dimensioni – Del tipo della matrice • Il tipo della matrice è modificabile quando non si usa Preserve e solo se il tipo è Variant Lez. 6 (10/11) - PB Elementi di Programmazione 24

Matrici Dinamiche Option Base 1 Sub matr. Din. Pre() Dim n. D() As Double

Matrici Dinamiche Option Base 1 Sub matr. Din. Pre() Dim n. D() As Double Dim i, j As Integer Re. Dim n. D(8) For i = LBound(n. D) To UBound(n. D) n. D(i) = i Cells(2, i + 1). Value = n. D(i) Next Re. Dim Preserve n. D(12) For i = LBound(n. D) To UBound(n. D) n. D(i) = i * 1000 Cells(3, i + 1) = n. D(i) Next End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 25

Matrici • Le matrici devono essere passate per riferimento ad una routine Sub carica(v()

Matrici • Le matrici devono essere passate per riferimento ad una routine Sub carica(v() As Double) Dim i As Integer For i = LBound(v) To UBound(v) v(i) = Input. Box("dammi un valore") Next End Sub stampa. Foglio(v() As Double, cx As Integer, cy As Integer) Dim i As Integer For i = LBound(v) To UBound(v) Cells(cx, cy + i) = v(i) Next End Sub x() Dim vt(5) As Double, vq() As Double Call carica(vt): Call stampa. Foglio(vt, 1, 1) End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 26

Matrici di Parametri • In VB è possibile richiamare con un numero di parametri

Matrici di Parametri • In VB è possibile richiamare con un numero di parametri non fissato a priori usando le matrici di parametri – Il parametro è preceduto dalla parola chiave Param. Array ed è di tipo Variant – è sempre l’ultimo elemento di una lista di parametri Lez. 6 (10/11) - PB Elementi di Programmazione 27

Matrici di Parametri Option Explicit: Option Base 1 Function argo. Var(uno As Integer, _

Matrici di Parametri Option Explicit: Option Base 1 Function argo. Var(uno As Integer, _ Param. Array vari() As Variant) Dim i As Integer, s As String s = "" For i = LBound(vari) To UBound(vari) s = s & i & " " & vari(i) & vb. New. Line Next Msg. Box ("uno vale " & uno & vb. New. Line & s) argo. Var = UBound(vari) End Function Sub usa. Arg. Var() Dim uno As Integer, due As Integer uno = argo. Var(8, "wer", 890, 34. 78) due = argo. Var(800, 0. 78, "casa") Msg. Box ("-> " & uno & vb. New. Line & " --> " & due) End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 28

Riferirsi ad intervalli di celle • Per le routine può essere necessario riferirsi a

Riferirsi ad intervalli di celle • Per le routine può essere necessario riferirsi a blocchi di celle di un foglio di lavoro – Per avere una interazione corretta basta ricordare: • Un intervallo di celle è SEMPRE una matrice bidimensionale • Una singola cella non è una matrice – Il predicato Is. Array(variabile) restituisce True se la variabile è una matrice • Il parametro che indica l’intervallo va passato come Variant e va poi assegnato ad una variabile locale di tipo Variant Lez. 6 (10/11) - PB Elementi di Programmazione 29

Riferirsi ad intervalli di celle Function interv(inte As Variant) As Double Dim X As

Riferirsi ad intervalli di celle Function interv(inte As Variant) As Double Dim X As Variant Dim i As Integer, j As Integer X = interv = 0 If Is. Array(X) Then For i = LBound(X) To UBound(X) For j = LBound(X, 2) To UBound(X, 2) if Is. Numeric(X(i, j)) Then interv = interv + X(i, j) End. If Next End If End Function Sub total() Range("A 10"). Value = interv(Range("a 1: d 5")) End Sub Lez. 6 (10/11) - PB Elementi di Programmazione 30