Molto spesso capita di dover utilizzare degli archivi esterni in formato testo, se questi file sono delimitati, i campi sono divisi da un carattere, con questa procedura siamo in grado di caricarli e quindi gestirli a piacimento.
Per provare la procedura vi allego il file SUPERENALOTTO.csv contenente tutte le estrazioni del SuperEnalotto dal 2000 a oggi.
Option Explicit 'Questa istruzione è di fondamentale importanza perchè ci costringe a dichiarare tutte le variabili, anche se può sembrare strano ci semplifica la vita ed evita di nominare Santi e Madonne.
Private Sub NomeTuaSub()
'iniziamo con le dichiarazioni io normalmente uso queste regole:
- divido le variabili in base al tipo.
- Faccio precedere ogni variabile con un prefisso in base al tipo di dati che conterranno. Vedi all. 1
- Assegno alle variabili dei nomi che fanno capire cosa contengono
- Utilizzo il primo carattere maiuscolo e il resto minuscolo (maiuscoletto).
- nell’allegato 2 potete trovare un elenco dei tipi di Variabili gestibili da VBA.
Dim NL_NumeroRighe, NL_A As Long
Dim NI_Z, NI_P, NI_S, NI_K As Integer
Dim NI_NumeroColonne As Integer
Dim NI_Lungo As Integer
Dim NI_Posizione(256) As Integer
Dim NI_LunghezzaCampo As Integer
Dim NI_PosizionePar As Integer
Dim ST_FileInput As String
Dim ST_TextLine As String
Dim ST_ArchivioDati() As String
Dim ST_Message, ST_Titolo, ST_Default, ST_Separatore As String
ST_Message = " Scegli Il Carattere del ST_Separatore dei Campi nel file csv " ' Imposta il Messaggio.
ST_Titolo = " Inserisci Il Carattere del ST_Separatore " ' Imposta il Titolo.
ST_Default = ";" ' Separatore di standard ";"
ST_Separatore = InputBox(ST_Message, ST_Titolo, ST_Default) ' fà comparire la finestra per inserire il separatore
If ST_Separatore = "" Then ST_Separatore = ";" ' imposta il Separatore a " ; " se non viene inserito nessun carattere
‘La prossima istruzione apre la maschera di windows “Apri File”
ST_FileInput = Application.GetOpenFilename(fileFilter:="File CSV(*.csv), *.csv")
'################################################################################
‘A questo punto no sappiamo quante righe e quante colonne vi sono nel file quindi con le prossime istruzioni controlliamo i due dati.
'conta quante righe o "Record" ci sono ------------------------------------------
Open ST_FileInput For Input As #1 ' Apre il file.
For NL_A = 1 To 999000
If EOF(1) Then ' se trova la fine del file imposta quante righe ha contato ed esce dal ciclo for
NL_NumeroRighe = NL_A
Exit For
Else
Line Input #1, ST_TextLine ' Assegna la riga a una variabile.
End If
Next NL_A
Close #1 'Chiudo il file CSV
'################################################################################
'conta quante Colonne "Campi" ci sono ------------------------------------------
Open ST_FileInput For Input As #1 ' Apre il file.
Line Input #1, ST_TextLine ' Assegna la riga a una variabile.
NI_S = 1 ' Riporto a 1 l'indice del numero dei campi
NI_Lungo = Len(ST_TextLine) 'controllo quanto e lunga la riga "stringa"
For NI_P = 1 To NI_Lungo 'scorro un carattere alla volta
If Mid(ST_TextLine, NI_P, 1) = ST_Separatore Then 'Se il carattere in esame e uguale al ST_Separatore impostato
NI_S = NI_S + 1 'incremento il puntatore
End If
Next NI_P
NI_NumeroColonne = NI_S 'ora sappiamo quante colonne ci sono nel nostro file
Close #1 'Chiudo il file CSV
'################################################################################
'esce se non trova il carattere Separatore impostato
If NI_NumeroColonne = 1 Then
MsgBox " non sono stati trovati separatori - " & ST_Separatore & " - "
Exit Sub
End If
'################################################################################
'Dimensiona la matrice che conterrà i dati -----------------------------------
ReDim ST_ArchivioDati(NL_NumeroRighe, NI_NumeroColonne)
'################################################################################
'Carica le righe e controlla dove sono i separatori--------------------------
Open ST_FileInput For Input As #1 ' Apre il file.
For NL_A = 1 To NL_NumeroRighe - 1
Line Input #1, ST_TextLine ' Assegna la riga a una variabile.
NI_S = 1 ' Riporto a 1 l'indice del numero dei campi
NI_Lungo = Len(ST_TextLine) 'controllo quanto e lunga la riga "stringa"
For NI_P = 1 To NI_Lungo 'scorro un carattere alla volta
If Mid(ST_TextLine, NI_P, 1) = ST_Separatore Then 'Se il carattere in esame e uguale al Separatore impostato
NI_Posizione(NI_S) = NI_P 'memorizzo la Posizione
NI_S = NI_S + 1 'incremento il puntatore
End If
Next NI_P
NI_Posizione(NI_S) = NI_Lungo
'Sapendo dove si trovano i separatori si possono estrarre i dati ------------------
NI_Z = 1
For NI_K = 1 To NI_NumeroColonne ' ciclo fino alla fine delle colonne
NI_LunghezzaCampo = NI_Posizione(NI_K) - (NI_Posizione(NI_K - 1) + 1) 'calcolo quanto è Lungo il campo
NI_PosizionePar = NI_Posizione(NI_K) - NI_LunghezzaCampo 'punto in cui parte il campo
' sapendo dove inizia e quanto è Lungo il campo inserisco il campo all'interno della matrice
ST_ArchivioDati(NL_A, NI_Z) = Mid(ST_TextLine, NI_PosizionePar, NI_LunghezzaCampo)
NI_Z = NI_Z + 1 'incremento il puntatore
Next NI_K
Next NL_A
Close #1 'Chiudo il file CSV
'################################################################################
'Segnalo qunte righe e qunte colonne ci sono nel file
MsgBox " ho finito di caricare i dati ho caricato N." & NI_NumeroColonne - 1 _
& " Colonne è N." & NL_NumeroRighe & " Righe."
' Con questa istruzione vengono visualizzate il numero di righe e il numero di colonne che sono presenti nel file importato.
'################################################################################
'A questo punto cosa facciamo ?
'avete due possibilità:
'1) Usate la fantasia e inserite in questo punto il codice che manipola
'la matrice ST_ArchivioDati(NL_NumeroRighe, NI_NumeroColonne)
'2) Aspettate il prossimo progetto tra 15 Giorni che utilizzerà questo codice
'per fare qualcosa di utile??????
'3) Provate queste semplici istruzioni che fanno vedere in sequenza tutte le linee presenti nel file in esame
' se optate per questa terza scelta eliminate i caratteri ' all’inizio delle prossime 7 righe di codice
'For NL_A = 1 To NL_NumeroRighe - 1 ' ciclo fino alla fine delle righe
'ST_TextLine = ""
'For NI_K = 1 To NI_NumeroColonne ' ciclo fino alla fine delle colonne
'ST_TextLine = ST_TextLine & " | " & ST_ArchivioDati(NL_A, NI_K)
'Next NI_K
'MsgBox ST_TextLine
'Next NL_A
End Sub 'Fine NomeTuaSub
Allegato 1
|
Prefisso |
Tipo variabile |
Occ. Memoria byte |
|
BO |
Boolean |
2 |
|
NB |
Byte |
1 |
|
NC |
Currency |
8 |
|
NDE |
Decimal |
12 |
|
NDO |
Double |
8 |
|
NI |
Integer |
2 |
|
NL |
Long |
4 |
|
NSI |
Single |
4 |
|
OB |
Object |
4 |
|
DA |
Date |
8 |
|
ST |
String |
|
|
VA |
Variant |
16-22 |
|
DF |
Type |
|
Allegato 2
· BO - Le variabili di tipo Boolean sono memorizzate come numeri a 16 bit (2 byte) e possono essere solo True o False
· NB - Le variabili di tipo Byte sono archiviate come unità da 8 bit (1 byte) singole e senza segno in un intervallo compreso tra 0 e 255.
· NC - Le variabili di tipo Currency sono memorizzate come numeri a 64 bit (8 byte) in formato intero, divise per 10.000 in modo da ottenere un numero a virgola fissa con 15 cifre alla sinistra della virgola decimale e 4 cifre alla sua destra. Con questa rappresentazione è possibile specificare un intervallo compreso tra -922.337.203.685.477,5808 e 922.337.203.685.477,5807
· NDE - Le variabili di tipo Decimal sono memorizzate come numeri interi senza segno di 96 bit (12 byte) divisi per una potenza di 10 variabile. La potenza di 10 per cui viene diviso il numero corrisponde al numero di cifre a destra della virgola ed è compresa nell'intervallo fra 0 e 28. Se il fattore di divisione è 0 (nessun decimale), il valore maggiore possibile è +/-79.228.162.514.264.337.593.543.950.335. Con 28 decimali, il valore maggiore è +/-7,9228162514264337593543950335 e il valore minore, diverso da zero, è +/-0,0000000000000000000000000001.
· NDO - Le variabili di tipo Double (con virgola mobile a precisione doppia)sono memorizzate come numeri IEEE a 64 bit (8 byte) compresi nell'intervallo fra -1.79769313486231E308 e -4,94065645841247E-324 per i valori negativi, e fra 4,94065645841247E-324 e 1,79769313486232E308 per quelli positivi
· NI - Le variabili di tipo Integer sono memorizzate come numeri a 16 bit (2 byte) compresi nell'intervallo fra -32.768 e 32.767
· NL - Le variabili di tipo Long (a intero lungo) sono memorizzate come numeri con segno a 32 bit (4 byte) compresi nell'intervallo fra -2.147.483.648 e 2.147.483.647.
· NSI - Le variabili di tipo Single (con virgola mobile a precisione singola) sono memorizzate come numeri IEEE di 32 bit (4 byte) compresi nell'intervallo fra -3,402823E38 e -1,401298E-45 per i valori negativi e fra 1,401298E-45 e 3,402823E38 per quelli positivi.
· OB - Le variabili di tipo Object sono memorizzate come indirizzi di 32 bit (4 byte) riferiti a oggetti. A una variabile dichiarata come Object è possibile assegnare qualsiasi riferimento a un oggetto mediante l'istruzione Set.
· DA - Le variabili di tipo Date sono memorizzate come numeri IEEE di 64 bit (8 byte) che rappresentano date comprese nell'intervallo fra l'1 gennaio 100 e il 31 dicembre 9999 e orari compresi fra le 0.00.00 e le 23.59.59.
· ST - Le variabili di tipo String possono essere:
• Stringhe di lunghezza variabile, che possono contenere fino a circa 2 miliardi (2^31) di caratteri.
• Stringhe di lunghezza fissa, che possono contenere da 1 a circa 64 KB (2^16) di caratteri.
Nota Una stringa di lunghezza fissa di tipo Public non può essere utilizzata in un modulo di classe.
I codici per i caratteri String sono compresi fra 0 e 255. I primi 128 caratteri (0-127) del set di caratteri corrispondono alle lettere e ai simboli di una tastiera standard americana. Questi primi 128 caratteri sono gli stessi definiti dal set di caratteri ASCII.
· VA - Il tipo di dati Variant è il tipo di dati in cui vengono trasformate tutte le variabili se non sono dichiarate esplicitamente.
· DF -Tipi di dati definiti dall'utente, qualsiasi tipo di dati definito utilizzando l'istruzione Type. I tipi di dati definiti dall'utente possono contenere uno o più elementi di qualsiasi tipo di dati, tipo di matrice o di un tipo di dati precedentemente definito dall'utente.
?>