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
Scarica

EP1314Lz09