lez. 8 (11/12) - pbelementi di programmazione1 lezione 8 date valutazione di espressioni file di...
TRANSCRIPT
Lez. 8 (11/12) - PB Elementi di Programmazione 1
Lezione 8
Date
Valutazione di espressioni
File di testo sequenziali
Lez. 8 (11/12) - PB Elementi di Programmazione 2
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 3
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 4
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 q Trimestre m Mese– y Giorno dell’anno d Giorno– w Giorno della settimana ww Settimana– h Ora n Minuti s Secondi
• primoGset indica quale è il primo giorno della settimana– vbUseSystem impostazione API vbSunday Do (predefinita)– vbMonday Lu vbTuesday Ma vbWednesday Me – vbThursday Gi vbFriday Ve 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 5
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 6
EsercizioSub giornoSettimana() Dim gS(7) As String Dim el As Variant, i As Integer, g As Integer gS(1) = "lunedì" gS(2) = "martedì" gS(3) = "mercoledì" gS(4) = "giovedì" gS(5) = "venerdì" gS(6) = "sabato" gS(7) = "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 NextEnd Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 7
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 8
Valutazione di espressioni
Lez. 8 (11/12) - PB Elementi di Programmazione 9
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 10
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 (es: 1)• La cella C2 l’ultimo valore per _x (es: 100)• La cella D2 il passo (es: 5)
– Il codice nella pagina che segue permette di tabulare tutti i valori della formula
Lez. 8 (11/12) - PB Elementi di Programmazione 11
Valutazione di una EspressioneSub 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 NextEnd Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 12
Lettura e scrittura file
Lez. 8 (11/12) - PB Elementi di Programmazione 13
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 14
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 15
Lettura e scrittura file sequenziali (2)
Apertura fileOpen 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 16
Lettura e scrittura file sequenziali (3)
PERCORSOAttenzione :
– 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 17
Lettura e scrittura file sequenziali (4)
Chiusura fileclose #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 18
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 19
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), " ", Cells(i, 2)
Next
Close #1
End Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 20
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), " ", Cells(i, 2)
Next
Close #1
End Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 21
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 22
EsempioOption ExplicitSub 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 #2End Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 23
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 24
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 #1End Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 25
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 26
EsempioOption ExplicitSub 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 #1End Sub
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
Lez. 8 (11/12) - PB Elementi di Programmazione 28
Esercizio 1
• Date le seguenti dichiarazioni Dim a As IntegerDim b As Boolean
• Ed i seguenti valori inizialia=4b=true
• Indicare il valore delle seguenti espressionia = b + 7b = a - 6
Lez. 8 (11/12) - PB Elementi di Programmazione 29
Esercizio 1
• Date le seguenti dichiarazioni Dim a As IntegerDim b As Boolean
• Ed i seguenti valori inizialia=4b=true
• Indicare il valore delle seguenti espressionia = b + 7b = a - 6
a b4 true (-1)6 true (-1) a=b+77 false (0) b=a-6
Lez. 8 (11/12) - PB Elementi di Programmazione 30
Esempio di risoluzioneOption ExplicitSub esercizio()Dim a As IntegerDim b As Boolean
a = 4b = True a = b + 7b = a - 6
Cells(2, 2) = aCells(2, 3) = b
End Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 31
Esercizio 2
• Data la seguente dichiarazione
Dim vt(3) As DoubleDim 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 * 3Next
Lez. 8 (11/12) - PB Elementi di Programmazione 32
Risultato 2Option ExplicitSub leggiTabula()
Dim vt(3) As DoubleDim i As Integer
For i = UBound(vt) To LBound(vt) Step -1 vt(i) = UBound(vt) - i * 3Next
For i = LBound(vt) To UBound(vt) cells(2,i+1) = vt(i)
Next
End Sub0LBound
1 2 3UBound
vt-6-303
Lez. 8 (11/12) - PB Elementi di Programmazione 33
Review Esercizio 2
• Data la seguente dichiarazione
Dim vt(3) As DoubleDim 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 * 3Next
0LBound
1 2 3UBound
vt-6-303
Lez. 8 (11/12) - PB Elementi di Programmazione 34
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 * 3Next
NON ENTRA NEL CICLO!
Lez. 8 (11/12) - PB Elementi di Programmazione 35
Esercizio 3 – Stack di ChiamateOption ExplicitFunction 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 + 2End 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 WendEnd Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 36
Esercizio 3 – Stack di ChiamateOption ExplicitFunction fz(ByRef x As Integer, _ ByVal y As Integer) As Double Dim a As Integer x = y * 2 + a y = y * 3 fz = a + 2End FunctionSub 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 WendEnd Sub
Lez. 8 (11/12) - PB Elementi di Programmazione 37
Esercizio 3 – Stack di ChiamateOption ExplicitFunction fz(ByRef x As Integer, _ ByVal y As Integer) As Double Dim a As Integer x = y * 2 + a y = y * 3 fz = a + 2End FunctionSub 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 WendEnd Sub
ric x y z 0 0 0 0 0 1 fz() 0 0 1 x y a fz 0 0 1 ^yric 5 0 0 0 10 1 ^yric 5 0 0 0 10 1 ^yric 15 0 0 0 10 1 ^yric 15 0 2 2 10 1 2 10 3 2 10 3 ^yric 7 0 0 2 14 3 ^yric 7 0 0 2 14 3 ^yric 21 0 0 2 14 3 ^yric 21 0 2 2 14 3 2 14 5