Sei sulla pagina 1di 28

Dipartimento 

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*

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


2
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Visual Basic for Application

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


3
Visual Basic for Application – parte 2
ISTRUZIONI ITERATIVE ‐ FOR
VBA presenta diversi tipi di istruzioni cicliche. Alcune con condizione 
di permanenza (While) altre con condizioni di uscita (Until)
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Do While condizione Do
istruzioni istruzioni
Loop Loop While condizione

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


4
Nella forma While l’uscita dall’iterazione avviene nel momento 
in cui la condizione diventa FALSA. 
Do Until condizione Do
istruzioni istruzioni
Loop Loop Until condizione
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

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

Il ciclo Do While condizione


istruzioni
Loop
è spesso scritto nella  While condizione
forma più sintetica istruzioni
Wend
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
6
Esempio DO WHILE LOOP

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

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


7
Esempio equivalente con: DO LOOP WHILE

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

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


8
Esempio equivalente con: DO UNTIL LOOP 

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

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


9
Esempio equivalente con: DO LOOP UNTIL

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

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


10
Esempio equivalente con: WHILE WEND

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

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


11
ISTRUZIONI ITERATIVE ‐ FOR
For cont = valIniziale To valFinale Step passo
istruzioni
Next
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

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 

Do While (cont <= valFinale)


istruzioni
cont = cont + passo
Loop
Pertanto il While computazionalmente può essere utilizzato in 
alternativa al FOR. Non è sempre possibile effettuare l'operazione 
inversa. Vediamo l'esempio seguente:
N=1
Do While (N<>0)
N=InputBox("Scrivi un numero: ","")
Loop
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
14
Il numero di iterazioni dell'esempio precedente non è noto a priori 
ma dipende dall'input dell'utente (termina quando digito 0!). 
Con il for (che richiede sempre un inizio ed una fine) devo ricorrere 
ad un espediente che mi genera un loop infinito (passo 0).
For I = 1 To 10 Step 0
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

N = InputBox("Scrivi un numero: ", "")


If n = 0 Then Exit For
Next
Esempio 1 ‐ Elenca tutti i valori compresi tra 10 e 1 con passo 0,5
Sub esempioFOR1()
Dim X As Double
Dim i As Integer
i = 1
For X= 10 To 1 Step -0.5
Range("A" & i) = X
i = i + 1
Next
End Sub
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
15
Esempio 2 ‐ FOR
Somma tutti i valori contenuti nell'intervallo [A1, A2]  dove ogni 
valore (partendo da A1) dista dal suo successore una distanza dt.
Sub EsempioFOR2()
Dim S As Double, D As Double, P As Double
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Dim tot As Double, ct As Double


tot = 0
S = Range("A1").Value 'Partenza
D = Range("A2").Value 'Arrivo
P = Range("A3").Value 'Passo
For dt = S To D Step P
tot = tot + dt
Next
Range("A4") = tot
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


16
ISTRUZIONI ITERATIVE – FOR insiemistico
Per gestire un ciclo su di un intervallo di oggetti si usa:
For Each elemento In Gruppo
istruzioni
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.

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


17
Esempio 1 – FOR EACH
Deposita in A6 la somma dei valori contenuti nell'area A1:A5. La 
seguente scritta Range("A1:A5") è equivalente a
Range("A1","A5")
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

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

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


18
Esempio 2 – FOR EACH

Come il precedente ma esclude i valori non numerici.

Sub EsempioFOREACH2()
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Dim c As Variant, som As Double


som=0
For Each c In Range("A1:A5")
If (IsNumeric(c.Value)) Then
som = som + c.Value
End If
Next
Range("A6") = som
End Sub

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


19
Non richiesto per il test d'esame

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 

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


20
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

Public Sub RichiediData()


Impostiamo la struttura della routine che  ...
agganceremo ad un bottone End Sub
Scrivere un programma VBA che
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

‐ 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

' Nel caso sia un data Se si tratta di una data


' determino se è la più recente determino se è la più recente

SI
Loop While (Giorno<>"0/0/0") Giorno<>"0/0/0"

' Mostro il risultato NO


End Sub
STOP
Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I
21
Esempio A
Scrivere un programma VBA che
‐ Acquisisca delle date fino a che non digito "0/0/0" START
‐ Mostri a video la data più recente
Iniziamo a considerare la data più remota. Ad esempio 31/12/1899:
Ipotizzo una  data 
Dim DataMassima as Date massima iniziale:
DataMassima
DataMassima=#12/31/1899# 31/12/1899
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Leggo il giorno, il mese 
e l’anno: g/m/a

// Nel caso sia un data


// determino se è più recente SI
Man mano che procediamo con la lettura valutiamo se la data appena letta  IsDate(Giorno) NO
g/m/a (che deve  essere diversa da "0/0/0") è una data reale e se risulta 
maggiore rispetto a quella più recente contenuta in DataMassima. Se così è  SI NO
aggiorno la data massima attuale con g/m/a.
If IsDate(Giorno) Then DataMassima<Cdate(Giorno)

If CDate(Giorno) > DataMassima Then


DataMassima = CDate(Giorno) SI
End If DataMassima=Cdate(Giorno)
End If

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

22 Public Sub RichiediData()


Dim Frase As String
Dim DataMassima As Date

' 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.)

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


Esempio B

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

Impostiamo la struttura della routine che  Public Sub SommaFrazioni()


...
agganceremo ad un bottone End Sub
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

Dim N1, N2, D1, D2 Scrivere un programma VBA che


N1 = Me.Range("E3") ‐ Acquisisca (sfruttando 4 celle) 2 frazioni
D1 = Me.Range("E4") ‐ Mostri a video la somma delle frazioni ridotta ai minimi termini.
N2 = Me.Range("G3") (Suggerimento: Per ridurre una frazione ai minimi termini è 
necessario calcolare il MCD.)
D2 = Me.Range("G4")

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

𝑁 𝑁 𝑁 ·𝐷 𝑁 ·𝐷 𝑁
𝐷 𝐷 𝐷 ·𝐷 𝐷

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


Esempio B

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

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


Esempio B

26 Scrivere un programma C che printf("Somma (ridotta): %d/%d\n",NS/d,DS/d);


‐ Acquisisca da tastiera 2 frazioni
‐ Stampi a video la somma delle frazioni ridotta ai minimi termini.
(Suggerimento: Per ridurre una frazione ai minimi termini per La soluzione definitiva è la seguente
prima cosa calcolare il MCD.)
Public Sub SommaFrazioni()
Dim Frase As String
Dim DataMassima As Date
Dim N1, N2, D1, D2
Dipartimento di Ingegneria Meccanica e Industriale – Corso di laurea: Ingegneria Gestionale 

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

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


27
Non richiesto per il test d'esame

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 

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I


28
Non richiesto per il test d'esame

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 

Docente: Marco Sechi  ‐ Elementi di informatica e programmazione – Università degli studi di Brescia  D.I.M.I

Potrebbero piacerti anche