di Ingegneria Meccanica e Industriale
Università degli Studi di Brescia
Elementi di Informatica e
Dipartimento di Ingegneria Meccanica e Industriale
Programmazione
Corso di laurea: Ingegneria Gestionale
Elementi di informatica e programmazione
PROGRAMMAZIONE
Docente: Marco Sechi
E‐mail: marco.sechi@unibs.it
Vers. 25/11/2015.B*
Do While condizione Do
istruzioni istruzioni
Loop Loop While condizione
Nella forma Until l’uscita dall’iterazione avviene nel momento
in cui la condizione diventa VERA.
Per uscire da questi cicli in anticipo si usa Exit Do.
Docente: Marco Sechi ‐ Elementi di informatica e programmazione – Università degli studi di Brescia D.I.M.I
5
Esempio: genera una sequenza crescente di numeri a partire da 1
fino a 10
Private Sub GeneraSequenza_Click()
Dim counter As Integer
counter=0
Do
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
counter = counter + 1
Range("A1") = counter
Loop While counter < 10
End Sub
Sub EsempioDOWHILELOOP()
Dim X As Integer
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Dim Y As Integer
X = 10
Y = 0
Do While X >= 5
MsgBox "X=" & X & " - Y=" & Y
Y = Y + 1
X = X - 1
Loop
MsgBox "Fine"
End Sub
Sub EsempioDOLOOPWHILE()
Dim X As Integer
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Dim Y As Integer
X = 10
Y = 0
Do
MsgBox "X=" & X & " - Y=" & Y
Y = Y + 1
X = X - 1
Loop While X >= 5
MsgBox "Fine"
End Sub
Sub EsempioDOUNTILLOOP()
Dim X As Integer
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Dim Y As Integer
X = 10
Y = 0
Do Until X < 5
MsgBox "X=" & X & " - Y=" & Y
Y = Y + 1
X = X - 1
Loop
MsgBox "Fine"
End Sub
Sub EsempioDOLOOPUNTIL()
Dim X As Integer
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Dim Y As Integer
X = 10
Y = 0
Do
MsgBox "X=" & X & " - Y=" & Y
Y = Y + 1
X = X - 1
Loop Until X < 5
MsgBox "Fine"
End Sub
Sub EsempioWHILEWEND()
Dim X As Integer
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Dim Y As Integer
X = 10
Y = 0
While X >= 5
MsgBox "X=" & X & " - Y=" & Y
Y = Y + 1
X = X - 1
Wend
MsgBox "Fine"
End Sub
Dove
cont: è una variabile numerica
valIniziale: è il valore iniziale di cont
valFinale: è il valore finale
passo: è la quantità di cui incrementare ad ogni ciclo. Se il
passo è omesso passo vale 1. Per uscire dal ciclo anzitempo
si usa Exit For.
E' possibile far scorrere indietro il contatore cont
For cont = valFinale To valIniziale Step -passo
istruzioni
Next
Docente: Marco Sechi ‐ Elementi di informatica e programmazione – Università degli studi di Brescia D.I.M.I
12
Il FOR viene eseguito in questo modo (il nostro algoritmo, che
risolve un determinato problema, dovrà quindi adattarsi a queste
regole di funzionamento!)
1) Esegue l'assegnamento iniziale
Cont=valIniziale
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
2) Se passo è positivo valuta la condizione
Cont<=valFinale altrimenti
Cont>=valIniziale. Nel caso restituisca
false passa al punto 6)
3) Esegue l'Istruzione all'interno del FOR
4) Esegue l'istruzione che incrementa il
contatore Cont di una quantità pari a
passo. Se passo è negativo avremo un
decremento;
5) Salta incondizionatamente al punto 2)
6) Termina il FOR e continua con le istruzioni
successive.
Docente: Marco Sechi ‐ Elementi di informatica e programmazione – Università degli studi di Brescia D.I.M.I
13
For cont = valIniz To valFin Step passo
istruzioni
Next
Equivale a:
cont = valIniziale
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Next
Dove Gruppo è un insieme di oggetti (esempio cells,
worksheets, workbooks, etc…)
Per uscire dal ciclo prima del tempo si può usare Exit For.
Sub esempioFOREACH1()
Dim tot As Double
Dim cella as Range
tot = 0
For Each cella In Range("A1:A5")
tot = tot + cella.Value
Next
Range("A6") = tot
End Sub
Come il precedente ma esclude i valori non numerici.
Sub EsempioFOREACH2()
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Esempio A
Scrivere un programma VBA che:
‐ Acquisisca delle date fino a che non digito "0/0/0"
‐ Mostri a video la data più recente
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Scrivere un programma VBA che
‐ Acquisisca delle date fino a che non digito "0/0/0"
‐ Mostri a video la data più recente
‐ Acquisisca delle date fino a che non digito "0/0/0"
‐ Mostri a video la data più recente
Public Sub RichiediData() START
Frase as string
Giorno as variant
Frase="Immetti la data (g/m/a)" Giorno
do
Giorno=InputBox(Frase,"") Leggo il giorno, il mese e
l’anno: g/m/a
SI
Loop While (Giorno<>"0/0/0") Giorno<>"0/0/0"
Leggo il giorno, il mese
e l’anno: g/m/a
Giorno <>"0/0/0" SI
NO
Me.Range("D3") = DataMassima Mostra data massima
STOP
Docente: Marco Sechi ‐ Elementi di informatica e programmazione – Università degli studi di Brescia D.I.M.I
Esempio A
' INIZIALIZZAZIONE
Frase = "Immetti la data (g/m/a): "
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
DataMassima = #12/31/1899#
Do
' INPUT
Giorno = InputBox(Frase, "")
' DETERMINO LA DATA PIU' RECENTE
If IsDate(Giorno) Then
If CDate(Giorno) > DataMassima Then
DataMassima = CDate(Giorno)
End If
End If
Loop While Giorno <> "0/0/0"
' OUTPUT
Me.Range("D3") = DataMassima
End Sub
Docente: Marco Sechi ‐ Elementi di informatica e programmazione – Università degli studi di Brescia D.I.M.I
23
Non richiesto per il test d'esame
Esercizio B
Scrivere un programma VBA che
‐ Acquisisca (sfruttando 4 celle) 2 frazioni
‐ Mostri a video la somma delle frazioni ridotta ai minimi termini.
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
(Suggerimento: per ridurre una frazione ai minimi termini è
necessario calcolare il MCD.)
24
Scrivere un programma VBA che
‐ Acquisisca (sfruttando 4 celle) 2 frazioni
‐ Mostri a video la somma delle frazioni ridotta ai minimi termini.
(Suggerimento: Per ridurre una frazione ai minimi termini è necessario
calcolare il MCD.)
Scrivere un programma VBA che
‐ Acquisisca (sfruttando 4 celle) 2 frazioni DIM N, D;
‐ Mostri a video la somma delle frazioni ridotta ai minimi termini. . . .
(Suggerimento: Per ridurre una frazione ai minimi termini è D = D1 * D2
necessario calcolare il MCD.) N = N1 * D2 + N2 * D1
𝑁 𝑁 𝑁 ·𝐷 𝑁 ·𝐷 𝑁
𝐷 𝐷 𝐷 ·𝐷 𝐷
25 Scrivere un programma VBA che Per ridurre ai minimi termini ci basta
‐ Acquisisca (sfruttando 4 celle) 2 frazioni
‐ Mostri a video la somma delle frazioni ridotta ai minimi termini. dividere il numeratore N e il
(Suggerimento: Per ridurre una frazione ai minimi termini è necessario denominatore D per il MCD(N,D)
calcolare il MCD.)
𝑁 𝑁 𝑀𝐶𝐷 𝑁, 𝐷 𝑁
·
𝐷 𝑀𝐶𝐷 𝑁, 𝐷 𝐷 𝐷
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Per determinare il MCD(N,D) posso seguire questa procedura:
a) imposto m=min(N,D)
START
b) provo a dividere N e D per m.
c) Se N e D sono divisibili per m allora m è il m=min(D,N)
MCD e termino saltando a d). Altrimenti
decremento m e ripeto il controllo b) D e N sono SI
d) Fine. divisibili per m ?
NO
DIM m as LONG m=m‐1
m=IIF(N<D,N,D)
WHILE NOT ((N MOD m)=0 AND (D MOD m)=0)
m=m-1
m è il MCD
WEND
Scrivere un programma VBA che
‐ Acquisisca (sfruttando 4 celle) 2 frazioni
Me.Range("I3") = N
‐ Mostri a video la somma delle frazioni ridotta ai minimi termini. Me.Range("I4") = D
(Suggerimento: Per ridurre una frazione ai minimi termini per Me.Range("K3") = N / m
prima cosa calcolare il MCD.) Me.Range("K4") = D / m
Dim N, d
Dim M As Long ' ALGORITMO ALTERNATIVO
m = 2
Do
' INIZIALIZZAZIONE/INPUT If (D Mod m = 0 And N Mod m = 0) Then
N1 = Me.Range("E3") D = D / m
D1 = Me.Range("E4") N = N / m
N2 = Me.Range("G3") Else
D2 = Me.Range("G4") m = m + 1
End If
Loop While (m <= N And m <= D)
' ALGORITMO
d = D1 * D2
N = N1 * D2 + N2 * D1
M = IIf(N < d, N, d)
While Not ((N Mod M) = 0 And (d Mod M) = 0)
M = M - 1
Wend
' OUTPUT
Me.Range("I3") = N ' Visualizzazione per verifica
Me.Range("I4") = d
Me.Range("K3") = N / M
Me.Range("K4") = d / M
End Sub
Esempio C
Analizzare il secondo file di esempio contenuto nella sezione "VBA2 ‐
File di supporto"
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale
Esempio D
Partendo dall'esempio B della sezione VBA – 1° parte ampliare le
funzionalità del programma di fatturazione in modo che sia possibile
ottenere l'elenco di tutte le fatture emesse.
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale