Lezione 12

19
Lez. 12 (10/11) - PB Elementi di Programmazion e 1 Lezione 12 Esercizi

description

Lezione 12. Esercizi. 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. Indicare il contenuto delle celle B1 ed B2 dopo l’esecuzione del seguente codice VBA:  Option Explicit Sub ex() - PowerPoint PPT Presentation

Transcript of Lezione 12

Page 1: Lezione 12

Lez. 12 (10/11) - PB Elementi di Programmazione 1

Lezione 12

Esercizi

Page 2: Lezione 12

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

Page 3: Lezione 12

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

Page 4: Lezione 12

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

Page 5: Lezione 12

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

Page 6: Lezione 12

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.

Page 7: Lezione 12

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

Page 8: Lezione 12

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.

Page 9: Lezione 12

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

Page 10: Lezione 12

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”)

Page 11: Lezione 12

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

Page 12: Lezione 12

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

Page 13: Lezione 12

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

Page 14: Lezione 12

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

Page 15: Lezione 12

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

Page 16: Lezione 12

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

Page 17: Lezione 12

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

Page 18: Lezione 12

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

Page 19: Lezione 12

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