Lezione 9 Valutazione di espressioni File di testo sequenziali Lez. 9 (13/14) Elementi di Programmazione 1 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. 9 (13/14) Elementi di Programmazione 2 Valutazione di una Espressione – Supponiamo che • la cella A2 contenga una formula con una incognita _x • La cella B2 il primo valore per _x • La cella C2 l’ultimo valore per _x • La cella D2 il passo – Il codice nella pagina che segue permette di tabulare tutti i valori della formula Lez. 9 (13/14) Elementi di Programmazione 3 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. 9 (13/14) Elementi di Programmazione 4 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. 9 (13/14) Elementi di Programmazione 5 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) Lez. 9 (13/14) Elementi di Programmazione 6 Lettura e scrittura file sequenziali 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. 9 (13/14) Elementi di Programmazione 7 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 Lez. 9 (13/14) Elementi di Programmazione 8 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), " Next ", Cells(i, 2) Close #1 End Sub Lez. 9 (13/14) Elementi di Programmazione 9 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. 9 (13/14) Elementi di Programmazione 10 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. 9 (13/14) Elementi di Programmazione 11 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 Lez. 9 (13/14) Elementi di Programmazione 12 Lettura e scrittura file sequenziali Sub usoFileLett() Dim i As Integer, j as integer, k as integer, Dim h as integer 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. 9 (13/14) Elementi di Programmazione 13 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 ciscuno applica la formula contenuta nella cella C1 (dove la variabile si chiama _x) e scrive nella colonna B il valore ottenuto sostuendo nella formula in C1 il valore in A Lez. 9 (13/14) Elementi di Programmazione 14 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. 9 (13/14) Elementi di Programmazione 15 Esercizi 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. 9 (13/14) 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 ^yric ^yric ^yric ^yric fz() y a 5 0 5 0 15 0 15 0 7 7 21 21 0 0 0 0 fz 0 0 0 2 0 0 0 2 16 Esercizi • Date le seguenti dichiarazioni Dim a As Integer Dim b As Boolean • Ed i seguenti valori iniziali a b 4 true (-1) 6 true (-1) 6 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. 9 (13/14) Elementi di Programmazione 17 Esercizi • 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. 9 (13/14) Elementi di Programmazione 18 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 NON ENTRA NEL CICLO! For i = UBound(vt) To LBound(vt) vt(i) = UBound(vt) - i * 3 Next Lez. 9 (13/14) Elementi di Programmazione 19