READ ASCII FILES MACRO v. 2.1 – 27/02/01 – By Gianpiero Torello
Questa macro legge un file di testo in un foglio Excel.
Il file può essere in uno dei seguenti formati: CSV, Campi separati da tabulatori o Lunghezza fissa.
All’inizio ho scritto questa macro principalmente per leggere i miei indirizzi esportati da Lotus Organizer. Volevo stampare tutti i miei indirizzi in formato tabella con tutti i numeri di telefono nella stessa colonna e gli indirizzi, fax e emails condensati. Per ottenere questo risultato dovevo lavorare parecchio tutte le volte che volevo aggiornare il mio indirizzario, così ho pensato di aggiungere la possibilità di inserire dei campi calcolati mentre leggo il file di testo. Può sembrare strano ma se date un’occhiata all’esempio sarà chiaro.
Si può usare questa macro per qualsiasi file di testo che si abbia bisogno di leggere ripetutamente e sul quale si debbano applicare lunghe e noiose formule e/o formattazioni.
Si possono anche ricodificare alcuni o tutti i contenuti dei campi.
Ma parliamo subito dell’esempio. Nota: la tabella sottoriportata è solo esemplificativa e non è completa. Cliccare qui per scaricare la versione completa della documentazione in formato MS Word.
Load Field | Field Name | Offset | Length | Recoding | Format | Function |
Confidential | 00 | |||||
Yes | Categories | CAT | @ | |||
Yes | Firstname | |||||
Yes | Lastname | |||||
Title | ||||||
Jobtitle1 | ||||||
Yes | Company1 | |||||
Work1street | ||||||
Work1city | ||||||
Work1state | ||||||
Work1zip | ||||||
Work1country | ||||||
Work1tel | ||||||
… | … | … | … | … | … | |
Calc | Tel | IF(“WORK1TEL”<>””,”W1: “&”WORK1TEL”&” “,””)&IF(“WORK2TEL”<>””,”W2: “&”WORK2TEL”&” “,””)&IF(“WORK3TEL”<>””,”W3: “&”WORK3TEL”&” “,””)&IF(“HOME1TEL”<>””,”H1: “&”HOME1TEL”&” “,””)&IF(“HOME2TEL”<>””,”H2: “&”HOME2TEL”&” “,””)&IF(“HOME3TEL”<>””,”H3: “&”HOME3TEL”&” “,””)&IF(“CARTEL”<>””,”C: “&”CARTEL”&” “,””)&IF(“MOBILETEL”<>””,”M: “&”MOBILETEL”&” “,””)&IF(“PAGERTEL”<>””,”P: “&”PAGERTEL”&” “,””)&IF(“SCHOOLTEL”<>””,”S: “&”SCHOOLTEL”&” “,””)&IF(“OTHERTEL”<>””,”O: “&”OTHERTEL”&” “,””)&IF(“ISDNTEL”<>””,”I: “&”ISDNTEL”&” “,””) | ||||
… | … | … | … | … | … | … |
Il primo campo “Confidential” è un numerico e voglio che sia formattato a zeri quindi scrivo “00” nella colonna Format. Questo è il modo nel quale Excel definisce questo tipo di formato. È solo un esempio perché, come si può vedere, la colonna “Load Field” non contiene “Yes”, quindi non verrà caricata nel foglio Excel.
Il secondo campo “Categories” sarà formattato a Testo (@) e il suo contenuto ricodificato secondo la tabella contenuta nel foglio Recoding, che sarà simile alla seguente:
Code | Original Value | Recode To |
CAT | Personal | PERSONAL |
CAT | PUBLIC | PERSONAL |
Questo significa che se il campo “Categories” contiene Personal o PUBLIC, la macro lo tradurrà in PERSONAL. Qualsiasi altro valore rimarrà invariato.
Ed ora veniamo agli ultimi campi:
Il campo “Tel” ha “Calc” nella colonna “Load Field”. Questo vuol dire che non sarà caricato dal file ma la macro inserirà la formula Excel contenuta nella colonna “Formula”.
IF(“Work1tel”<>””,”W1: “&”Work1tel”&” “,””)&IF(“Work2tel”<>””,”W2: “&”Work2tel”&” “,””)&IF(“Work3tel”<>””,”W3: “&”Work3tel”&” “,””)&IF(“Home1tel”<>””,”H1: “&”Home1tel”&” “,””)&IF(“Home2tel”<>””,”H2: “&”Home2tel”&” “,””)&IF(“Home3tel”<>””,”H3: “&”Home3tel”&” “,””)&IF(“Cartel”<>””,”C: “&”Cartel”&” “,””)&IF(“Mobiletel”<>””,”M: “&”Mobiletel”&” “,””)&IF(“Pagertel”<>””,”P: “&”Pagertel”&” “,””)&IF(“Schooltel”<>””,”S: “&”Schooltel”&” “,””)&IF(“Othertel”<>””,”O: “&”Othertel”&” “,””)&IF(“Isdntel”<>””,”I: “&”Isdntel”&” “,””)
La formula sopra riportata concatena semplicemente tutti i numeri di telefono che non sono vuoti in un’unica cella.
Ma perché contiene “Work1tel”? Perché Work1tel non sarà caricato nel foglio Excel in quanto non sarebbe accessibile ad una formula. Invece, la macro rimpiazzerà “Work1tel” con il suo effettivo contenuto. Si notino i doppi apici: se si tratta un campo come testo, questi sono necessari. E si deve ricordare che le lettere maiuscole e minuscole sono trattate diversamente quindi deve corrispondere esattamente al nome dato nella colonna “Field Name” (“WORK1TEL” non funzionerebbe).
Se si vuole indirizzare una cella Excel dinamicamente, si utilizzi il modo di riferimento R1C1 altrimenti si finirebbe per puntare sempre alla stessa cella. Così, per esempio, per rimuovere l’ultimo trattino dalla cella alla sinistra, la formula sarà:
IF(RIGHT(rc[-1],3)=” – “,LEFT(rc[-1],LEN(rc[-1])-3),rc[-1])
Infine, quando si esegue la macro, verra’ chiesto di inserire il numero del foglio dove si trova il modello soprastante. Questo e’ il numero del foglio all’interno del workbook corrente. Quando si esegue la macro, quindi, il foglio contenente il modello deve essere aperto ed attivo. I dati verranno letti in un nuovo foglio.
Fare click qui per scaricare la versione 2.2.1 della macro.
Faree click qui per scaricare la versione in MS Word di questo documento.