Lez. 8 (11/12) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di...

37
Lez. 8 (11/12) - PB Elementi di Programmazione 1 Lezione 8 Date Valutazione di espressioni File di testo sequenziali

Transcript of Lez. 8 (11/12) - PBElementi di Programmazione1 Lezione 8 Date Valutazione di espressioni File di...

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

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

Lezione 8

Date

Valutazione di espressioni

File di testo sequenziali

Page 2: Lez. 8 (11/12) - PBElementi di Programmazione1 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#

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

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)

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

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.

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

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

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

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

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

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

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

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

Valutazione di espressioni

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

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())

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

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

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

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

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

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

Lettura e scrittura file

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

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

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

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)

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

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

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

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 !!!

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

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 …..

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

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

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

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

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

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

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

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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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!

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

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

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

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

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

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