Lavorare con dati esterni (1)

Ultima modifica: 29-05-2016

Molte volte ci capita di avere dei dati già disponibili in altre fonti, magari in un file .txt.

Perchè portarli in un file di Excel per elaborarli? Basta leggerli, metterli in memoria ed elaborarli direttamente in memoria. Finita l'elaborazione sul foglio di Excel metterò solo gli elaborati, se necessario.

A questo punto basta trovare il modo giusto per dialogare tramite VBA col file di testo e ricevere da questo i dati come in un flusso continuo, sequenziale.

Per comunicare con un file di testo dobbiamo innanzitutto trovare un canale di comunicazione che ci viene offerto dalla Funzione FreeFile che riporta un numero disponibile del canale di comunicazione col file. Se memorizzato in una variabile non è più necessario dover ricordare quale numero è associato a ciascun canale.

FileNum = FreeFile()

Trovato questo numero è possibile colloquiare col file in Scrittura e/o in Lettura.

I metodi di lettura e scrittura sono molti, ma noi useremo prevalentemente questi:

 

Open FileTesto For Output As #FileNum

Per far sì che i dati vengano scritti nel File di testo (Output --> Uscita --> Scrittura): se il file non esiste, viene creato, se esiste i nuovi dati sovrascrivono quelli vecchi

Open FileTesto For Append As #FileNum

Per far sì che i dati vengano aggiunti al File di testo (Append --> Uscita --> Scrittura): se il file non esiste, viene creato, se esiste i nuovi dati verranno accodati a quelli vecchi

Open FileTesto For Input As #FileNum

Per compiere l’operazione opposta (Input <-- Ingresso <-- Lettura): se il file non esiste, viene generato un errore, se esiste ne verranno letti i dati

 

La lettura del file di testo fatta con questi metodi avviene in modalità sequenziale a partire dall'inizio fel file scendendo via via fino alla fine del file e/o si chiude con l'Istruzione Close.

Questi che seguono sono i metodi che useremo per scrivere o leggere un file di testo.

Per scrivere in un file di testo:

Per scrivere (Output o Append) su un file di testo possiamo disporre di due istruzioni:

  • Istruzione Write #
  • Istruzione Print #

Queste istruzioni fanno uso di una sorta di punteggiatura:

  • un punto e virgola (;): Print #FileNum, Matrice(A, B);
  • una virgola (,): Print #FileNum, Matrice(A, B),
  • nessuna punteggiatura: Print #FileNum, Matrice(A, B)

Con l'istruzione Print:

Il punto e virgola permette la scrittura dei dati uno di seguito all'altro:
CognomeNomeViaCAPCittaProv

La virgola inserisce tra un dato ed un altro una specie di tabulazione:
Cognome      Nome      Via        CAP        Citta      

Nessuna punteggiatura manda ogni dato su una nuova riga
Cognome
Nome
Via
CAP
Citta
Prov

 

Con l'istruzione Write:

Il punto e virgola e la virgola scrivono i dati uno di sseguito all'altro racchiudendo i dati tra una coppia di doppi apici e separati da una virgola:
"Cognome","Nome","Via","CAP","Citta","Prov"

Nessuna punteggiatura ogni dato continua ad essere limitato entro la coppia di doppi apici, ma vengono scritti uno su ogni riga:
"Cognome"
"Nome"
"Via"
"CAP"
"Citta"
"Prov"

 

Per leggere (Input) da un file di testo possiamo disporre

  • Funzione Input che restituisce un detgerminato numero di caratteri letti da un file aperto in modalità Input. Tramite questa funzione è quindi possibile leggere da un file un numero limitato di caratteri o, aiutato dalla Funzione LOF, l'intero file.
    • La Funzione LOF restituisce un valore Long che rappresenta le dimensioni in byte di un file aperto con l'istruzione Open, cioè il numero totale di caratteri contenuti nel file di testo.
      MyChar = Input(10, #Filenum) ' legge 10 caratteri dal file di testo
      Tutto = Input$(LOF(Filenum), #Filenum) ' legge tutto il contenuto del file di testo
  • Istruzione Input # che legge i dati da un file ad accesso sequenziale aperto in modalità Input. I dati letti con la istruzione Input # vengono in genere scritti su un file con l'istruzione Write #. Questi dati sono delimitati da una coppia di doppi apici e separati da una virgola ("Poggi","Giuseppe","VIA SABIN 34/2","09071","Casone","VR")
    Input #Filenum, Parola
  • Istruzione Line Input # che legge una singola riga in un file aperto ad accesso sequenziale. I dati letti tramite Line Input # vengono in genere scritti su file con Print #.
    Line Input #Filenum, Linea

 

Se si tenta di leggere oltre la fine del file di testo viene generato un errore di Run-time "Input oltre la fine del file".

Per evitare l'insorgere di questo errore ci facciamo aiutare dalla Funzione EOF che restituisce il valore Boolean True se è stata raggiunta la fine di un file aperto in modalità Input sequenziale.

 

Lettura di un file di testo

Ma vediamo subito alcuni piccoli esempi di lettura di un file:

lettura di un determinato numero di caratteri alla volta dal file:

FileNum = FreeFile
Open NomeFile For Input As #FileNum
Do
MyChar = Input(10, #FileNum) ' vengono letti 10 caratteri per volta
Cells(Riga, 1) = MyChar
Riga = Riga + 1
Loop Until EOF(FileNum) = True
Close #FileNum

 

lettura di tutto il file (una variante alle istruzioni appena lette):

FileNum = FreeFile
Open NomeFile For Input As #FileNum
Range("A1") = Input$(LOF(FileNum), #FileNum) ' vengono letti tutti i caratteri in una sola volta
Close #FileNum

 

lettura di un campo alla volta dal file:

FileNum = FreeFile
Open NomeFile For Input As #FileNum
Do
Input #FileNum, Parola
Cells(Riga, 1) = Parola
Riga = Riga + 1
Loop Until EOF(FileNum) = True
Close #FileNum

 

lettura di una riga alla volta dal file:

FileNum = FreeFile
Open NomeFile For Input As #FileNum
Do
Line Input #FileNum, Linea
Cells(Riga, 1) = Linea
Riga = Riga + 1
Loop Until EOF(FileNum) = True
Close #FileNum

 

Scrittura su un file di testo

E' molto importante saper scegliere il giusto modo di scrivere i dati in un file di testo.

Abbiamo detto sopra che abbiamo due metodi di scrivere i nostri dati, sia che usiamo la modalità Output che la modalità Append:

 

Vediamo ora le nostre istruzioni per ottenere la scrittura su file di testo:

FileNum = FreeFile()
Open NomeFile For Output As #FileNum ' o For Append As #FileNum a seconda dei casi
For R = 1 To R1 ' R1 rappresenta il numero di righe su cui si estendono i dati scritti nel foglio
For C = 1 To C1 - 1 ' C1 rappresenta il numero di colonne su cui si estendono i dati scritti nel foglio
Print #FileNum, Cells(R, C); ' o usando: Write #FileNum, Cells(R, C);
Next
Print #FileNum, Cells(R, C)
Next
Close #FileNum

Il punto e virgola nella prima Print #FileNum, consente che ogni successiva scrittura venga eseguita sulla stessa riga nel file di testo.

L'assenza di punteggiatura della seconda Print #FileNum, consente che la successiva scrittura venga eseguita su una riga successiva, nel file di testo.

Per scrivere i nostri dati in modo che possano poi essere utilizzati in faase di lettura possiamo usare:

l'istruzione Write seguito dal punto e virgola
Write #FileNum, Matrice(A, B);
per ottenere dei dati registrati in questo modo:
"Cognome","Nome","Via","CAP","Citta","Prov"
"Migliavacca","Luigi","VIA P. FIMIANI-LOC.TRIVIO","35031","Varena","FR"
"Rizzi","Carlo","VIA SABIN 34/2","84040","Noli","TO"

l'istruzione Print seguito dasl punto e virgola avendo però l'accortezza di usare un carattere separatore tra un dato ed un altro
Print #FileNum, Cells(R, C) & "|";
per averedei dati registrati in questo altro modo:
Cognome|Nome|Via|CAP|Citta|Prov
Migliavacca|Luigi|VIA P. FIMIANI-LOC.TRIVIO|35031|Varena|FR
Rizzi|Carlo|VIA SABIN 34/2|84040|Noli|TO

 

Fin qui degli esempi di codice puramente teorici.

Nella pagina seguente vediamo come costruire un semplice applicativo che fa uso di dati memorizzati in un file di testo.