270 likes | 426 Views
Lezione 8. Date Valutazione di espressioni File di testo sequenziali. Tipo Date. 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
E N D
Lezione 8 Date Valutazione di espressioni File di testo sequenziali Elementi di Programmazione
Tipo Date • 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# Elementi di Programmazione
Tipo Date • 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) Elementi di Programmazione
Tipo Date 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) • vbMondayLu vbTuesdayMa vbWednesdayMe • vbThursdayGi vbFridayVe vbSaturdaySa • primaSanno indica da quando si iniziano a contare le settimane di un anno • vbUseSystem impostazione API • vbFirstJan1 settimana 1 gennaio (predefinita) • vbFirstFourDaysprima settimana di almeno quattro giorni • vbFirstFullWeekInizia con la prima settimana completa dell'anno. Elementi di Programmazione
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 Elementi di Programmazione
Esercizio Sub 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 Next End Sub Elementi di Programmazione
Tipo Date • 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 Elementi di Programmazione
Valutazione di espressioni Elementi di Programmazione
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()) Elementi di Programmazione
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 Elementi di Programmazione
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 Elementi di Programmazione
Lettura e scrittura file Elementi di Programmazione
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 Elementi di Programmazione
Lettura e scrittura file sequenziali • 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) Elementi di Programmazione
Lettura e scrittura file sequenziali Apertura file OpenpercorsoFormodalità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 Elementi di Programmazione
Lettura e scrittura file sequenziali 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 Elementi di Programmazione
Lettura e scrittura file sequenziali 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 Elementi di Programmazione
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) Elementi di Programmazione
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 Elementi di Programmazione
Lettura e scrittura file sequenziali 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 Elementi di Programmazione
Lettura e scrittura file sequenziali 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 Elementi di Programmazione
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 Elementi di Programmazione
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 Elementi di Programmazione
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 a b 4 true (-1) 6 true (-1) a=b+7 6 false (0) b=a-6 Esercizi Elementi di Programmazione
Esercizi • 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 vt 3 0 -3 -6 0 LBound 1 2 3 UBound Elementi di Programmazione
Esercizi • 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) vt(i) = UBound(vt) - i * 3 Next NON ENTRA NEL CICLO! Elementi di Programmazione
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 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 0 3 2 0 5 Esercizi Elementi di Programmazione