Lezione 8
Date
Valutazione di espressioni
File di testo sequenziali
Lez. 8 (11/12) - PB
Elementi di Programmazione
1
Tipo Date (1)
• Serve per gestire le date che vengono
memorizzate come numeri decimali di 8 byte
– Le date fra
•
•
•
•
01/01/100 e 30/12/1899 sono numeri negativi
31/12/1899 e 31/12/9999 sono numeri positivi
0 rappresenta il giorno 0.0.0000
Se si usano i numeri decimali la parte decimale rappresenta
l’ora
– Possono essere dei valori letterali compresi fra # che
somigliano ad una data
• #15 Apr 2009# #12/5/2007#
Lez. 8 (11/12) - PB
Elementi di Programmazione
2
Tipo Date (2)
• Le principali funzioni di manipolazione:
– Dai valori orologio di sistema:
• Date(): restituisce gg/mm/aaaa
• Time(): restituisce hh:mm:ss
• Now(): gg/mm/aaa hh:mm:ss
– Restituire date:
• DateSerial(aaaa,mm,gg)
• DateValue(stringaConData)
– Restituire orari:
• TimeSerial(hh,mm,ss)
• TimeValue(stringaConOrario)
Lez. 8 (11/12) - PB
Elementi di Programmazione
3
Tipo Date (3)
DatePart(interval, data, primoGset,primaSanno)
• Restituisce una parte delle informazioni contenute in data
• interval indica quale parte interessa (valore fra “):
–
–
–
–
yyyy Anno
y
Giorno dell’anno
w
Giorno della settimana
h
Ora
q Trimestre
d
Giorno
ww Settimana
n
Minuti
m
Mese
s
Secondi
• primoGset indica quale è il primo giorno della settimana
– vbUseSystem
– vbMonday Lu
– vbThursday Gi
impostazione API
vbTuesday Ma
vbFriday Ve
vbSunday Do (predefinita)
vbWednesday Me
vbSaturday Sa
• primaSanno indica da quando si iniziano a contare le settimane di un
anno
–
–
–
–
vbUseSystem impostazione API
vbFirstJan1 settimana 1 gennaio (predefinita)
vbFirstFourDays prima settimana di almeno quattro giorni
vbFirstFullWeek Inizia con la prima settimana completa dell'anno.
Lez. 8 (11/12) - PB
Elementi di Programmazione
4
Esercizio
• Le celle da A1 a F1 contengono delle
date. Scrive il codice necessario per
– Verificare se la cella contiene effettivamente
una data
– Scrivere nella riga sottostante il giorno della
settimana o nulla se non ha la forma di una
data
Lez. 8 (11/12) - PB
Elementi di Programmazione
5
Esercizio
Sub giornoSettimana()
Dim gS(7) As String
Dim el As Variant, i As Integer, g As Integer
gS(1)
gS(2)
gS(3)
gS(4)
gS(5)
gS(6)
gS(7)
=
=
=
=
=
=
=
"lunedì"
"martedì"
"mercoledì"
"giovedì"
"venerdì"
"sabato"
"domenica"
i = 1
For Each el In Range("A1:F1")
If IsDate(el.Value) Then
g = DatePart("w", el.Value, vbMonday)
Cells(2, i).Value = gS(g)
End If
i = i + 1
Next
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
6
Tipo Date (4)
• Alle date si possono aggiungere dei giorni
con l’operatore +
• Più corretto è usare le funzioni
– DateAdd(interval, periodi, data)
• Somma il numero periodi a data aumentando
del valore di interval specificato
– DateDiff(interval, data1,
data2,primoGset,primaSanno)
• Restituisce i periodi trascorsi fra due date specificate
Lez. 8 (11/12) - PB
Elementi di Programmazione
7
Valutazione di espressioni
Lez. 8 (11/12) - PB
Elementi di Programmazione
8
Valutare Espressioni
– Se una stringa contiene una formula
sintatticamente corretta per Excel con una
variabile si può valutare la formula per diversi
valori della variabile creando una tabella
• Si deve usare la proprietà Formula di una cella
insieme alla funzione Replace
– Nella formula i numeri debbono avere come separatore il
punto decimale
– La variabile da sostituire è meglio che non sia un
carattere o una sequenza di caratteri che può essere
contenuta in funzioni di libreria
» Preferire ad esempio _x ad x (x è contenuto anche
in funzioni come Exp())
Lez. 8 (11/12) - PB
Elementi di Programmazione
9
Valutazione di una Espressione
– Supponiamo che
• la cella A2 contenga una formula con una
incognita _x
(es: _x*2+C2 )
• La cella B2 il primo valore per _x
• La cella C2 l’ultimo valore per _x
• La cella D2 il passo
(es: 1)
(es: 100)
(es: 5)
– Il codice nella pagina che segue permette di
tabulare tutti i valori della formula
Lez. 8 (11/12) - PB
Elementi di Programmazione
10
Valutazione di una Espressione
Sub Tabula()
Dim x As Double, y As Double, iniX As Double
Dim finX As Double, passo As Double
Dim formula As String, i As Integer
formula = Cells(2, 1).Value
formula = Replace(formula, ",", ".")
iniX = Cells(2, 2).Value
finX = Cells(2, 3).Value
passo = Cells(2, 4).Value
i = 0
For x = iniX To finX Step passo
Cells(4 + i, 2).Value = x
Cells(4 + i, 3).formula = "=" & _
Replace(formula, "_x", _
CStr(Replace(x, ",", ".")))
Cells(4 + i, 3).NumberFormat = ".##"
i = i + 1
Next
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
11
Lettura e scrittura file
Lez. 8 (11/12) - PB
Elementi di Programmazione
12
Lettura e scrittura file
• VB presenta diverse possibilità di accesso
ai file ma si illustrerà solo quella per la
gestione dei file di testo sequenziali
• Si ricorda che è possibile esportare o
importare in Excel file separati da virgola
(Comma Separated Values) direttamente
Lez. 8 (11/12) - PB
Elementi di Programmazione
13
Lettura e scrittura file sequenziali (1)
• Questo genere di file sono utili come
meccanismo di deposito e scambio di dati
• Le fasi in cui si suddividono le operazioni
sono:
– Apertura (Open)
– Lettura (Input) o scrittura (Write)
– Chiusura (Close)
Lez. 8 (11/12) - PB
Elementi di Programmazione
14
Lettura e scrittura file sequenziali (2)
Apertura file
Open percorso For modalità As #nfile
• percorso indica il percorso compreso il nome del
file da aprire
– Per ottenere il percorso della directory dove si trova il
foglio di lavoro usare:
» ThisWorkbook.Path
• modalità indica come si accederà al file:
– Input, Output, Append
• nfile numero fra 1 e 511 che identificherà il file
aperto
Lez. 8 (11/12) - PB
Elementi di Programmazione
15
Lettura e scrittura file sequenziali (3)
PERCORSO
Attenzione :
– Per ottenere il percorso della directory dove si trova il
foglio di lavoro usare:
» ThisWorkbook.Path
•Ma
questo
valore
non
è
utilizzabile fino a che non si
salva il file Excel almeno la
prima volta !!!
Lez. 8 (11/12) - PB
Elementi di Programmazione
16
Lettura e scrittura file sequenziali (4)
Chiusura file
close #nfile
• SEMPRE CHIUDERE I FILE !!!
• Se un file non viene chiuso non lo si
può
riaprire,
bisogno
prima
richiuderlo
– È possibile chiudere un file prima di aprirlo …..
Lez. 8 (11/12) - PB
Elementi di Programmazione
17
Lettura e scrittura file sequenziali (5)
Scrittura
Write #nfile, elencoDati
• Nfile: numero del file da aprire
• elencoDati: elenco dei dati da scrivere separato
da virgola
– I dati decimali sono sempre scritti separando col punto la
parte decimale
– Per i tipi Boolean viene scritto #True# o #False#
– Per i tipi Date si usa il formato #aaaa-mm-gg#
– Se omesso scrive il carattere di a capo
• Scrive elencoDati e poi va a capo
Lez. 8 (11/12) - PB
Elementi di Programmazione
18
Lettura e scrittura file sequenziali (6)
Sub usoFileScritt()
Dim i As Integer, j As Integer
Open ThisWorkbook.Path & "\p.txt" For Output As #1
For i = 1 To 6
Write #1, Cells(i, 1), "
Next
", Cells(i, 2)
Close #1
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
19
Lettura e scrittura file sequenziali (7)
Sub usoFileScritt()
Dim i As Integer, j As Integer
Close #1 ‘per non restare bloccati se file già aperto
Open ThisWorkbook.Path & "\p.txt" For Output As #1
For i = 1 To 6
Write #1, Cells(i, 1), "
Next
", Cells(i, 2)
Close #1
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
20
Esempio
• Scrivere il codice che dato il foglio di
lavoro corrente che contiene dalla
posizione A1 alla posizione D2 dei numeri
interi scrive sul file pari.txt i valori pari, sul
file dispari.txt i valori dispari
• Attenzione x Mod 2 restituisce -1 se X è
un numero dispari negativo (fare il test su
0)
Lez. 8 (11/12) - PB
Elementi di Programmazione
21
Esempio
Option Explicit
Sub usaFile()
Dim Y
As Variant
‘deve essere per forza variant
Open ThisWorkbook.Path & "\pari.txt" For Output As #1
Open ThisWorkbook.Path & "\dispari.txt" For Output As #2
For Each Y In Range("A1:D2")
If Y Mod 2 = 0 Then
Write #1, CInt(Y)
Else
Write #2, CInt(Y)
End If
Next
Close #1
Close #2
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
22
Lettura file sequenziali (1)
Lettura
Input #nfile, elencovariabili
• nfile: numero identificativo del file
• elencovariabili: elenco delle variabili in cui
scrivere i valori (usare solo variabili)
• Per verificare la fine del file si usa la funzione
EOF(nfile)
– True se fine file, False altrimenti
Lez. 8 (11/12) - PB
Elementi di Programmazione
23
Lettura file sequenziali (2)
Sub usoFileLett()
Dim i As Integer, j, k, h
Open ThisWorkbook.Path & "\p.txt" For Input As #1
i = 0
Do While Not EOF(1)
Input #1, k, j, h
Cells(i + 10, 10) = k
Cells(i + 10, 11) = h
i = i + 1
Loop
Close #1
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
24
Esempio
• Scrivere il programma che legge i valori
dal file dati.txt, li scrive nel foglio corrente
a partire dalla colonna A e quindi su
ciascuno applica la formula contenuta
nella cella C1 (dove la variabile si chiama
_x) e scrive nella colonna B il valore
ottenuto sostituendo nella formula in C1 il
valore in A
Lez. 8 (11/12) - PB
Elementi di Programmazione
25
Esempio
Option Explicit
Sub leggiTabula()
Dim val As Double, i As Integer
Dim fml As String, fmlS As String
fml = Range("C1").Value
Open ThisWorkbook.Path & "\dati.txt" For Input As #1
i = 1
While Not EOF(1)
Input #1, val
Cells(i, 1) = val
fmlS = Replace(fml, "_x", Replace(CStr(val), ",", "."))
Cells(i, 2).Formula = "=" & fmlS
i = i + 1
Wend
Close #1
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
26
Esercizi di ripasso
Di seguito alcuni esercizi per ripassare i
concetti principali visti nelle lezioni
precedenti e fondamentali per la
risoluzione di un tipico tema d’esame
Lez. 8 (11/12) - PB
Elementi di Programmazione
27
Esercizio 1
• Date le seguenti
dichiarazioni
Dim a As Integer
Dim b As Boolean
• Ed i seguenti valori iniziali
a=4
b=true
• Indicare il valore delle
seguenti espressioni
a = b + 7
b = a - 6
Lez. 8 (11/12) - PB
Elementi di Programmazione
28
Esercizio 1
• Date le seguenti
dichiarazioni
Dim a As Integer
Dim b As Boolean
• Ed i seguenti valori iniziali
a
4
6
7
b
true (-1)
true (-1)
false (0)
a=b+7
b=a-6
a=4
b=true
• Indicare il valore delle
seguenti espressioni
a = b + 7
b = a - 6
Lez. 8 (11/12) - PB
Elementi di Programmazione
29
Esempio di risoluzione
Option Explicit
Sub esercizio()
Dim a As Integer
Dim b As Boolean
a = 4
b = True
a = b + 7
b = a - 6
Cells(2, 2) = a
Cells(2, 3) = b
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
30
Esercizio 2
• Data la seguente dichiarazione
Dim vt(3) As Double
Dim i As Integer
• indicare il contenuto di vt dopo aver eseguito il
seguente codice
For i = UBound(vt) To LBound(vt) Step -1
vt(i) = UBound(vt) - i * 3
Next
Lez. 8 (11/12) - PB
Elementi di Programmazione
31
Risultato 2
Option Explicit
Sub leggiTabula()
Dim vt(3) As Double
Dim i As Integer
For i = UBound(vt) To LBound(vt) Step -1
vt(i) = UBound(vt) - i * 3
Next
For i = LBound(vt) To UBound(vt)
cells(2,i+1) = vt(i)
Next
End Sub
3
0
0
1
LBound
Lez. 8 (11/12) - PB
Elementi di Programmazione
-3
2
-6
vt
3
UBound
32
Review Esercizio 2
• Data la seguente dichiarazione
Dim vt(3) As Double
Dim i As Integer
3
0
0
1
LBound
-3
2
-6
vt
3
UBound
• indicare il contenuto di vt dopo aver eseguito il
seguente codice
For i = UBound(vt) To LBound(vt) Step -1
vt(i) = UBound(vt) - i * 3
Next
Lez. 8 (11/12) - PB
Elementi di Programmazione
33
Note sull’esercizio precedente
• Nel ciclo dell’esercizio precedente è
fondamentale lo step -1, dato che iniziamo da
Ubound ed usciamo confrontando con Lbound.
• Lo step negativo impone che il confronto di
uscita sia per i > Lbound
• Se facciamo senza lo step -1
For i = UBound(vt) To LBound(vt)
vt(i) = UBound(vt) - i * 3
Next
NON ENTRA NEL CICLO!
Lez. 8 (11/12) - PB
Elementi di Programmazione
34
Esercizio 3 – Stack di Chiamate
Option Explicit
Function fz(ByRef x As Integer, _
ByVal y As Integer) As Double
Dim a As Integer
a = 0
x = y * 2 + a
y = y * 3
fz = a + 2
End Function
Sub ric()
Dim x As Integer, y As Integer
Dim z As Integer
x = 0
y = 0
z = 1
While (z < 4)
x = fz(y, 5 + x)
z = z + 2
Wend
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
35
Esercizio 3 – Stack di Chiamate
Option Explicit
Function fz(ByRef x As Integer, _
ByVal y As Integer) As Double
Dim a As Integer
x = y * 2 + a
y = y * 3
fz = a + 2
End Function
Sub ric()
Dim x As Integer, y As Integer
Dim z As Integer
z = 1
While (z < 4)
x = fz(y, 5 + x)
z = z + 2
Wend
End Sub
Lez. 8 (11/12) - PB
Elementi di Programmazione
36
Esercizio 3 – Stack di Chiamate
Option Explicit
Function fz(ByRef x As Integer, _
ByVal y As Integer) As Double
Dim a As Integer
x = y * 2 + a
y = y * 3
fz = a + 2
End Function
Sub ric()
Dim x As Integer, y As Integer
Dim z As Integer
z = 1
While (z < 4)
x = fz(y, 5 + x)
z = z + 2
Wend
End Sub
Lez. 8 (11/12) - PB
x
0
0
0
0
0
0
0
2
2
2
2
2
2
2
2
ric
y
0
0
0
0
10
10
10
10
10
10
14
14
14
14
14
Elementi di Programmazione
z
0
1
1
1
1
1
1
1
3
3
3
3
3
3
5
x
^yric
^yric
^yric
^yric
fz()
y
5
5
15
15
a
0
0
0
0
fz
0
0
0
2
^yric
^yric
^yric
^yric
7
7
21
21
0
0
0
0
0
0
0
2
37
Scarica

Lezione 08 - 21/11/2011