Lezione 12
description
Transcript of Lezione 12
Lez. 12 (10/11) - PB Elementi di Programmazione 1
Lezione 12
Esercizi
Lez. 12 (10/11) - PB Elementi di Programmazione 2
INFORMAZIONI
• Esami – Orale non previsto (eventuali domande a
facoltà del professore)– Uso libero di excel– Il compito è tutto nel file xls– 2 ore di tempo
Lez. 12 (10/11) - PB Elementi di Programmazione 3
Domanda 8 (ex lex.11)• Indicare il contenuto delle celle B1 ed B2 dopo l’esecuzione del
seguente codice VBA:
Option ExplicitSub ex() Dim x As Double, y As Double x = 4 y = 8 y = y ^ 2 + x / 3 x = y + 10 Range("B1").Value = Application.WorksheetFunction.Floor(x, 1) Range("B2").Value = yEnd Sub
Lez. 12 (10/11) - PB Elementi di Programmazione 4
Domanda 8 (ex lex.11)• Indicare il contenuto delle celle B1 ed B2
dopo l’esecuzione del seguente codice VBA:
Option ExplicitSub ex() Dim x As Double, y As Double x = 4 y = 8 y = y ^ 2 + x / 3 x = y + 10 Range("B1").Value = _ Application.WorksheetFunction.Floor(x, 1) Range("B2").Value = yEnd Sub
x y 4 8 4 65.333 75.3333 65.333
Lez. 12 (10/11) - PB Elementi di Programmazione 5
Domanda 8 (ex lex.11)• Indicare il contenuto delle celle B1 ed B2
dopo l’esecuzione del seguente codice VBA:
Option ExplicitSub ex() Dim x As Double, y As Double x = 4 y = 8 y = y ^ 2 + x / 3 x = y + 10 Range("B1").Value = _ Application.WorksheetFunction.Floor(x, 1) Range("B2").Value = yEnd Sub
x y 4 8 4 65.333 75.3333 65.333
B1 = 75B2 = 65.333
Lez. 12 (10/11) - PB Elementi di Programmazione 6
Esercizio 1
• Scrivere la sub VBA che legge dei numeri decimali dal file di testo dati.txt dove sono scritti uno per riga e quindi riempie consecutivamente la colonna A del foglio di lavoro con i valori positivi, la colonna B con quelli negativi.
Lez. 12 (10/11) - PB Elementi di Programmazione 7
Esercizio 1Option ExplicitSub carica() Dim v As Variant Dim pos As Integer, neg As Integer Open ThisWorkbook.Path & "\dati.txt" For Input As 1 pos = 1 neg = 1 While Not EOF(1) Input #1, v If (IsNumeric(v)) Then If (v > 0) Then Cells(pos, 1) = v pos = pos + 1 Else Cells(neg, 2) = v neg = neg + 1 End If End If Wend Close #1End Sub
Lez. 12 (10/11) - PB Elementi di Programmazione 8
Esercizio 2
• Scrivere una UserForm che viene richiamata nel foglio elettronico con un bottone che permette di acquisire due valori X ed Y e che scrive nella cella B3 del foglio "Esercizio2“ il maggiore dei due.
Lez. 12 (10/11) - PB Elementi di Programmazione 9
Esercizio 2
• Scrivere – una UserForm (“moduloAcquisizione”)– che viene richiamata nel foglio elettronico con
un bottone (“parti”)– che permette di acquisire due valori
• X (“primoVal”)• Y (“secondoVal”)
– e che (cliccando un bottone “calcolo”) scrive nella cella B3 del foglio “Esercizio2” il maggiore dei due
Lez. 12 (10/11) - PB Elementi di Programmazione 10
Esercizio 2Private Sub calcolo_Click() Dim x As Double, y As Double x = CDbl(moduloAcquisizione.primoVal.Value) y = CDbl(moduloAcquisizione.secondoVal.Value) If (x > y) Then Sheets("Esercizio2").Range("B3").Value = x Else Sheets("Esercizio2").Range("B3").Value = y End If
moduloAcquisizione.Hide End Sub
La UserForm1 si chiama “moduloAcquisizione” (ed il bottone del form per eseguire il calcolo si chiama “calcolo”)
Lez. 12 (10/11) - PB Elementi di Programmazione 11
Esercizio 2
Private Sub parti_Click() ModuloAcquisizione.ShowEnd Sub
nel Foglio dove vi è il bottone di nome parti
Lez. 12 (10/11) - PB Elementi di Programmazione 12
Esercizio 3
• Scrivere una sub VBA che legge i valori contenuti nelle celle da A1 a D5 e quindi – carica il vettore X con i primi 8 valori positivi
contenuti nell’intervallo. Se vi sono meno di 8 valori ridimensiona il vettore al numero di elementi effettivamente presenti
– Attraverso la funzione max restituisce l’elemento di valore massimo del vettore che viene scritto in F1
Lez. 12 (10/11) - PB Elementi di Programmazione 13
Esercizio 3 – Note sugli array
• X(5) con option base 0 o senza
• X(5) con option base 1
0 1 2 3 4 5
1 2 3 4 5
Lez. 12 (10/11) - PB Elementi di Programmazione 14
Esercizio 3• Scrivere una sub VBA (“lettura”)
che legge i valori contenuti nelle celle da A1 a D5 e quindi – carica il vettore X
• con i primi 8 valori positivi contenuti nell’intervallo. • Se vi sono meno di 8 valori ridimensiona il vettore
al numero di elementi effettivamente presenti– Attraverso la funzione max restituisce l’elemento di
valore massimo del vettore che viene scritto in F1• Funzione “max” :
– Riceve un vettore vt – Restituisce il valore massimo contenuto
Lez. 12 (10/11) - PB Elementi di Programmazione 15
Esercizio 3
Option Base 1Option ExplicitFunction max(vt() As _ Double) As Double Dim i As Integer max = vt(LBound(vt)) For i = LBound(vt) + 1 _ To UBound(vt) If max < vt(i) Then max = vt(i) End If NextEnd Function
• La soluzione del problema non può far caricare prima il vettore per poi ridimensionarlo perché
– Senza l’opzione Preserve di ReDim si perde il contenuto del vettore
– Con l’opzione non è possibile ridimensionarlo ad una lunhezza inferiore
Lez. 12 (10/11) - PB Elementi di Programmazione 16
Esercizio 3Sub lettura() Dim y() As Double, X() As Double Dim i As Integer, j As Integer, v i = 1 ReDim y(8) For Each v In Range("A1:D3") If IsNumeric(v) Then If (v > 0) Then y(i) = v i = i + 1 End If End If If i > 8 Then Exit For End If Next
ReDim X(i - 1) For j = LBound(y) To i - 1 X(j) = y(j) Next Range("F1").Value = max(X)End Sub
Lez. 12 (10/11) - PB Elementi di Programmazione 17
Esercizio 4
• Aggiungere al foglio elettronico la funzione opera che dato un intervallo di valori anche disgiunto restituisce la somma dei valori interi contenuti nell’intervallo – Definire ed usare la funzione eIntero per
verificare se un valore è un numero intero
Lez. 12 (10/11) - PB Elementi di Programmazione 18
Esercizio 4
• Aggiungere al foglio elettronico (modulo)– la funzione “opera” – che dato un intervallo di valori anche
disgiunto – restituisce la somma dei valori interi contenuti
nell’intervallo – Definire ed usare la funzione “eIntero” ()– per verificare se un valore è un numero intero
Lez. 12 (10/11) - PB Elementi di Programmazione 19
Esercizio 4Option ExplicitFunction eIntero(el As _ Variant) As Boolean eIntero = False If (IsNumeric(el)) Then If (CInt(el) = el) Then eIntero = True End If End If
End Function
Function Opera( _ ParamArray interv() As _ Variant) As Integer Dim i As Integer, v For i = LBound(interv) To _ UBound(interv) For Each v In interv(i) If eIntero(v) Then Opera = Opera + v End If Next NextEnd Function