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