lez. 8 (10/11) - pbelementi di programmazione1 lezione 8 date valutazione di espressioni file di...

27
Lez. 8 (10/11) - P B Elementi di Programmazion e 1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Upload: enzo-renzi

Post on 01-May-2015

219 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 1

Lezione 8

Date

Valutazione di espressioni

File di testo sequenziali

Page 2: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 2

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#

Page 3: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 3

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)

Page 4: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 4

Tipo DateDatePart(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.

Page 5: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - 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

Page 6: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - 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

Page 7: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 7

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

Page 8: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 8

Valutazione di espressioni

Page 9: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - 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())

Page 10: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - 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

Page 11: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - 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

Page 12: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 12

Lettura e scrittura file

Page 13: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - 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

Page 14: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 14

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)

Page 15: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 15

Lettura e scrittura file sequenziali

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

Page 16: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 16

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

Page 17: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 17

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

Page 18: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 18

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)

Page 19: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 19

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

Page 20: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 20

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

Page 21: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 21

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 #1End Sub

Page 22: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 22

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

Page 23: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 23

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

Page 24: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 24

Esercizi

• Date le seguenti dichiarazioni Dim a As IntegerDim b As Boolean

• Ed i seguenti valori inizialia=4b=true

• Indicare il valore delle seguenti espressioni a = b + 7b = a - 6

a b4 true (-1)6 true (-1) a=b+76 false (0) b=a-6

Page 25: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 25

Esercizi

• 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

Page 26: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 26

Esercizi

• 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) vt(i) = UBound(vt) - i * 3Next

NON ENTRA NEL CICLO!

Page 27: Lez. 8 (10/11) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Lez. 8 (10/11) - PB Elementi di Programmazione 27

EserciziOption 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 0 3 2 0 5