Transcript Lezione 12

Lezione 12
Esercizi
Lez. 12 (10/11) - PB
Elementi di Programmazione
1
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
2
Domanda 8 (ex lex.11)
•
Indicare il contenuto delle celle B1 ed B2 dopo l’esecuzione del
seguente codice VBA:
Option Explicit
Sub 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 = y
End Sub
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 Explicit
Sub ex()
Dim x As Double, y As Double
x = 4
y = 8
x
4
4
75.3333
y
8
65.333
65.333
y = y ^ 2 + x / 3
x = y + 10
Range("B1").Value = _
Application.WorksheetFunction.Floor(x, 1)
Range("B2").Value = y
End 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 Explicit
Sub 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 = y
End Sub
Lez. 12 (10/11) - PB
x
4
4
75.3333
y
8
65.333
65.333
B1 = 75
B2 = 65.333
Elementi di Programmazione
5
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
6
Esercizio 1
Option Explicit
Sub 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 #1
End Sub
Lez. 12 (10/11) - PB
Elementi di Programmazione
7
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
8
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
9
Esercizio 2
Private 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
10
Esercizio 2
Private Sub parti_Click()
ModuloAcquisizione.Show
End Sub
nel Foglio dove vi è il bottone di nome parti
Lez. 12 (10/11) - PB
Elementi di Programmazione
11
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
12
Esercizio 3 – Note sugli array
• X(5) con option base 0 o senza
0
1
2
4
3
5
• X(5) con option base 1
1
Lez. 12 (10/11) - PB
2
3
Elementi di Programmazione
4
5
13
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
14
Esercizio 3
Option Base 1
Option Explicit
Function 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
Next
End Function
Lez. 12 (10/11) - PB
•
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
Elementi di Programmazione
15
Esercizio 3
Sub 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
Lez. 12 (10/11) - PB
ReDim X(i - 1)
For j = LBound(y) To i - 1
X(j) = y(j)
Next
Range("F1").Value = max(X)
End Sub
Elementi di Programmazione
16
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
17
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
18
Esercizio 4
Option Explicit
Function 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
Lez. 12 (10/11) - PB
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
Next
End Function
Elementi di Programmazione
19