![Page 1: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/1.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 1
Lezione 10
Funzioni e ModuliMacro
Analisi del flussoEsercizi
![Page 2: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/2.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 2
Aggiungere funzioni
• E’ possibile aggiungere alle funzioni predefinite in Excel e richiamabili nel foglio elettronico delle funzioni scritte dall’utente– Le nuove funzioni vanno aggiunte in un
modulo dall’editor di VBA:• Inserisci->Modulo
– Si scrivono le funzioni che compariranno nell’insieme delle funzioni selezionabili sotto la voce Definite dall’utente
![Page 3: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/3.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 3
Aggiungere funzioni
Creare la funzione progGeom che ha
– come argomento un intervallo di valori
– restituisce • True se i valori in esso contenuto sono in
progressione geometrica (il rapporto fra due valori consecutivi è costante)
• altrimenti False
![Page 4: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/4.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 4
Aggiungere funzioni– Creare la funzione progGeom che ha come argomento un intervallo di valori e
restituisce True se i valori in esso contenuto sono in progressione geometrica (il rapporto fra due valori consecutivi è costante), altrimenti False
Option ExplicitFunction progGeom(r As Range) As Boolean Dim x As Range, i As Integer progGeom = True If (r.Count > 2) Then For i = 1 To (r.Count - 3) If (r.Item(i).Value / r.Item(i + 1).Value _ <> r.Item(i + 1).Value / r.Item(i + 2).Value) Then progGeom = False End If Next End IfEnd Function
![Page 5: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/5.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 5
Registratore di macro
– Excel fornisce un utile strumento per poter registrare il codice generato in base alle azioni che compiamo mentre lavoriamo.
– In questo modo è possibile esaminare il codice prodotto e quindi regolarsi sui comandi da impiegare
– Per attivare questa funzionalità:Strumenti -> Macro -> Registra macro• Viene chiesto un nome da dare alla macro• Inizia la registrazione che termina schiacciando il tasto STOP
• Il codice generato si troverà nella cartella moduli di VBA
Tasto STOP Registra dando riferimentirelativi
![Page 6: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/6.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 6
Registratore di Macro
– Utilizziamo il registratore di macro per registrare i passi relativi alla creazione di un grafico a partire dai dati presenti in una tabella
• Si ha un insieme di valori nel range A2:B6• Si deve creare un grafico di dispersione
![Page 7: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/7.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 7
Registratore di MacroSub Grafico()Charts.Add ActiveChart.ChartType = xlXYScatterSmooth ActiveChart.SetSourceData Source:=Sheets("Foglio3").Range("A2:B6"), PlotBy _ :=xlColumns ActiveChart.SeriesCollection(1).Name = "=""valori Sperimentali""" ActiveChart.Location Where:=xlLocationAsObject, Name:="Foglio3" With ActiveChart .HasTitle = True .ChartTitle.Characters.Text = "valori Sperimentali" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "X" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Y" End With With ActiveChart.Axes(xlCategory) .HasMajorGridlines = False .HasMinorGridlines = True End With With ActiveChart.Axes(xlValue) .HasMajorGridlines = True .HasMinorGridlines = False End WithEnd Sub
![Page 8: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/8.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 8
Analisi del flusso - 1Option ExplicitSub prova(ByRef a As_ Integer, _ ByVal b As Integer) a = a * 2 b = b * 2End SubSub richiama() Dim x As Integer, _ y As Integer x = 2 y = 10 call prova (x, y)End Sub
richiama() x y 0 0 2 0 prova() 2 10 a b 2 10 (^x) 10 4 10 (^x) 10 4 10 (^x) 20 4 10
tempo
![Page 9: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/9.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 9
Analisi del flusso - 2
Sub prova() Dim v As Integer, q As Integer v = 10 q = 20 Do While v > 0 And q > 5 v = v - 1 q = q - 1 Loop Range("D1") = v Range("D2") = qEnd Sub
v q 10 20
9 19 8 18
……
1 11 0 10
![Page 10: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/10.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 10
Analisi del flusso - 3
Option ExplicitSub prova() Dim v As Integer v = 4 Do While True v = v + 1 Range("F1") = v Loop Range("D1") = vEnd Sub
v 4 5 6 : :32767
![Page 11: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/11.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 11
Sub primaProc(v1 As Integer, _ ByVal v2 As Integer) Dim L As Integer v1 = v1 * 3 v2 = v2 * 2 L = v1 + v2End Sub
Sub richiama() Dim x As Integer, y As Integer x = 8 y = 100
primaProc x, yEnd Sub
richiama() x y primaProc() 8 100 v1 v2 L 8 100 ^x 100 0 24 100 ^x 100 0 24 100 ^x 200 0 24 100 ^x 200 224 24 100
Analisi del flusso - 4
![Page 12: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/12.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 12
Analisi del flusso - 5Option ExplicitSub uno(a As Double) Dim b As Double
b = a * 2 a = a - 2End Sub
Sub richi() Dim x As Double, a As Double x = 10 a = 50 call uno (x) call uno (a)End Sub
richi() x a 0 0 10 0 uno() 10 50 a b 10 50 (^x) 0 10 50 (^x) 20 8 50 (^x) 20 8 50 8 50 (^arichi) 0 8 50 (^arichi) 100 8 48 (^arichi) 100 8 48
![Page 13: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/13.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 13
Analisi del flusso - 6Option ExplicitFunction raddoppia(A As Double) _ As Double raddoppia = A * 2 A = A - 2End FunctionSub 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) End Sub
rch() x y z w 0 0 0 0 raddoppia() 10 20 30 0 A raddoppia 10 20 30 0 (^x) 0 10 20 30 0 (^x) 20 8 20 30 0 (^x) 20 20 <- 8 20 30 0 8 20 30 0 (^y) 0 8 20 30 0 (^y) 40 8 18 30 0 (^y) 40 40 <- 8 18 30 0 8 18 30 0 (^z) 0 8 18 30 0 (^z) 60 8 18 28 0 (^z) 60 60 <- 8 18 28 60
![Page 14: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/14.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 14
Esercizi
![Page 15: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/15.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 15
Esercizio 1
• Scrivere la funzione sommaDis() da aggiungere a quelle definite nel foglio elettronico in uso in modo che calcoli la somma algebrica dei numeri contenuti in un intervallo.– L’intervallo di celle può essere formato da più
intervalli.• Il parametro ha quindi un numero variabile di
argomenti quindi è un ParamArray
![Page 16: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/16.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 16
Esercizio 1Function sommaDis(ParamArray r() As Variant) As Double Dim i As Integer, y As Variant sommaDis = 0 For i = LBound(r) To UBound(r) For Each y In r(i) If (IsNumeric(y)) Then sommaDis = sommaDis + y End If Next Next End Function
Indispensabile per gestirepiù intervalli di valori
![Page 17: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/17.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 17
Esercizio 2
• Calcolare in valor medio dell’intervallo di celle A1:B8 usando la funzione predefinita dei fogli di lavoro Excel– Tutte le funzioni contenute nel foglio di lavoro si
possono utilizzare mediante l’oggetto Application.WorksheetFunction
– I nomi delle funzioni sono quelle usate nella versione in Inglese
• L’elenco delle funzioni disponibili si può ottenere– Selezionare la voce Guida di Riferimento a Visual Basic per
Microsoft Excel– Quindi selezionare Concetti della programmazione– Quindi Eventi, funzioni di Foglio di lavoro, Forme– Infine la guida contiene un collegamento a tutte queste funzioni
![Page 18: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/18.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 18
Esercizio 2
Option ExplicitSub calcola() Range("D3") = _ Application.WorksheetFunction. _ Average(Range("A1:B8"))End Sub
L’intervallo è di tipo Range
![Page 19: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/19.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 19
Esercizio 2
• Ripetere l’esercizio precedente quando i valori sono nell’intervallo A1:B8 ed F1:F8– Appoggiare nella soluzione i valori nella
variabile x• La variabile sarà di tipo Variant o Double
![Page 20: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/20.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 20
Esercizio 2
Option ExplicitSub calcola() Dim x As Double x = _ Application.WorksheetFunction. _ Average(Range("A1:B8", "F1:F8")) Range("D3") = xEnd Sub
![Page 21: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/21.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 21
Esercizio 3
• Leggere il contenuto del file mieiDati.txt contenuto nella stessa cartella del foglio di lavoro. Questo file contiene su ogni riga due numeri decimali. Scrivere il contenuto del file nel foglio di lavoro a partire dalla cella A3 in questo modo:– Nella colonna A il primo valore della riga di dati– Nella colonna B il secondo valore della riga di dati– Utilizzando le funzione predefinite dal foglio elettronico min e
max calcolare per ogni colonna questi valori e scriverli nelle righe 1 e 2 del foglio di lavoro.
– Utilizzando la formula ben formata per Excel scritta come stringa nella cella D1 che ha come variabile _x, applicarla ad ogni elemento della colonna A a partire da A3 scrivendo il risultato nella colonna C nella riga corrispondente
![Page 22: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/22.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 22
Esercizio 3 (sol v1)Option ExplicitSub scaricaCalcola() Dim riga As Integer Dim v1 As Double, v2 As Double Dim rg As Range, frm As String Dim frms As String, i As Integer riga = 2 Open ThisWorkbook.Path & "\" & _ "mieiDati.txt" For Input As #1 Do While Not EOF(1) riga = riga + 1 Input #1, v1, v2 Cells(riga, 1) = v1 Cells(riga, 2) = v2 Loop
If riga <> 2 Then Set rg = Range("A3:A" & riga) Range("A1") =
Application.WorksheetFunction.Min(rg) Range("A2") =
Application.WorksheetFunction.Max(rg) Set rg = Range("B3:B" & riga) Range("B1") =
Application.WorksheetFunction.Min(rg) Range("B2") =
Application.WorksheetFunction.Max(rg) End If Close #1 frm = Range("D1").Value For i = 3 To riga frms = Replace(frm, "_x", CStr(Cells(i, 1).Value)) frms = "=" & Replace(frms, ",", “.") Cells(i, 3).Formula = frms Next End Sub
![Page 23: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/23.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 23
Esercizio 3 (sol v2)Option ExplicitOption Base 1Sub esercizio() Dim v1 As Double, v2 As Double Dim i As Integer, r As Range Dim formula As String, fmls As String Open ThisWorkbook.Path & _ "\mieiDati.txt" For Input As #1 formula = Range("D1") i = 3 Do While Not EOF(1) Input #1, v1, v2 Cells(i, 1).Value = v1 Cells(i, 2).Value = v2 fmls = "=" & Replace(formula, _ "_x", _ Replace(CStr(v1), ",", ".")) Cells(i, 3).formula = fmls i = i + 1 Loop
Set r = Range("A3:A" & (i - 1))
Cells(1, 1).Value = _
Application.WorksheetFunction.Min(r)
Cells(2, 1).Value = _
Application.WorksheetFunction.Max(r)
Set r = Range("B3:B" & (i - 1))
Cells(1, 2).Value = _
Application.WorksheetFunction.Min(r)
Cells(2, 2).Value = _
Application.WorksheetFunction.Max(r)
Close #1
End Sub
![Page 24: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/24.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 24
Esercizio 4
• Eliminare dal foglio di lavoro tutti i valori non numerici contenuti nell’intervallo A1:C7– Usare la funzione isnumeric()
![Page 25: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/25.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 25
Esercizio 4
Option ExplicitSub cancella() Dim el As Range For Each el In Range("A1", "C7") If Not IsNumeric(el.Value) Then el.Value = "" End If Next End Sub
![Page 26: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/26.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 26
Esercizio 5
• Dato un foglio di lavoro in cui nella colonna A e nella colonna B ci sono dei valori numerici disegnare i grafico di dispersione della colonna B in funzione della colonna A – Non so dove finiscono le due colonne
![Page 27: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/27.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 27
Esercizio 5Sub Macro2()'' Macro2 Macro' Macro recorded 12/18/2009 by %USERNAME%'
'Charts.Add ActiveChart.ChartType = xlXYScatterSmooth ActiveChart.SetSourceData Source:=Sheets("Sheet4").Range("B1:B" & ), PlotBy:= _ xlColumns ActiveChart.SeriesCollection(1).XValues = "=Sheet4!R1C1:R3C1" ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet4" ActiveSheet.Shapes("Chart 1").IncrementLeft 157.5 ActiveSheet.Shapes("Chart 1").IncrementTop -80.25 ActiveChart.PlotArea.Select Selection.Left = 1 Selection.Top = 16 ActiveChart.ChartArea.Select ActiveSheet.Shapes("Chart 1").IncrementLeft -135# ActiveSheet.Shapes("Chart 1").IncrementTop 165.75End Sub
Ricavato col registratore di macro;Poi è adattato nella paginasuccessiva
![Page 28: Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi](https://reader033.vdocuments.pub/reader033/viewer/2022051616/5542eb4b497959361e8b8da6/html5/thumbnails/28.jpg)
Lez. 10 (10/11) - PB Elementi di Programmazione 28
Esercizio 5Option ExplicitSub disegna() Dim riga As Integer riga = 1 While Not IsEmpty(Cells(riga, 1)) riga = riga + 1 Wend riga = riga - 1 If riga = 0 Then Exit Sub End If Charts.Add ActiveChart.ChartType = xlXYScatterSmooth ActiveChart.SetSourceData Source:=Sheets("Sheet4").Range("B1:B" & riga), PlotBy:= _ xlColumns ActiveChart.SeriesCollection(1).XValues = "=Sheet4!R1C1:R" & riga & "C1" ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet4" ActiveChart.ChartArea.Select
End Sub
Punti in cui è stato modificato