Condividi:        

importare file csv in più fogli excel 2003

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

importare file csv in più fogli excel 2003

Postdi libraio » 02/03/17 18:47

S.O. Windows 7 Professional + Office 2003
Ciao a tutti.
Ho necessità di importare files .csv ben oltre le 65.000 righe di Excel 2003 (i file pesano mediamente 20/22 Mb) e quindi i dati vanno divisi su più fogli.
Sul supporto Microsoft ho trovato la seguente macro

Sub LargeFileImport()

'Dimension Variables
Dim ResultStr As String
Dim FileName As String
Dim FileNum As Integer
Dim Counter As Double
'Ask User for File's Name
FileName = InputBox("Please enter the Text File's name, e.g. test.txt")
'Check for no entry
If FileName = "" Then End
'Get Next Available File Handle Number
FileNum = FreeFile()
'Open Text File For Input
Open FileName For Input As #FileNum
'Turn Screen Updating Off
Application.ScreenUpdating = False
'Create A New WorkBook With One Worksheet In It
Workbooks.Add template:=xlWorksheet
'Set The Counter to 1
Counter = 1
'Loop Until the End Of File Is Reached
Do While Seek(FileNum) <= LOF(FileNum)
'Display Importing Row Number On Status Bar
Application.StatusBar = "Importing Row " & _
Counter & " of text file " & FileName
'Store One Line Of Text From File To Variable
Line Input #FileNum, ResultStr
'Store Variable Data Into Active Cell
If Left(ResultStr, 1) = "=" Then
ActiveCell.Value = "'" & ResultStr
Else
ActiveCell.Value = ResultStr
End If

'For Excel versions before Excel 97, change 65536 to 16384
If ActiveCell.Row = 65536 Then
'If On The Last Row Then Add A New Sheet
ActiveWorkbook.Sheets.Add
Else
'If Not The Last Row Then Go One Cell Down
ActiveCell.Offset(1, 0).Select
End If
'Increment the Counter By 1
Counter = Counter + 1
'Start Again At Top Of 'Do While' Statement
Loop
'Close The Open Text File
Close
'Remove Message From Status Bar
Application.StatusBar = False

End Sub

ma quando la lancio, inserendo il percorso di origine del file csv, mi segnala l'errore " Errore di run-time '7' memoria esaurita" ed aprendo il debug viene evidenziata la stringa:
ActiveCell.Value = ResultStr

Spero di essermi spiegato "al mio meglio possibile"... potete aiutarmi?

Di più. Il testo del file csv utilizza come separotori il carattere '|'; sarebbe (poi) possibile automatizzare la divisione del testo in colonne?

Grazie!
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Sponsor
 

Re: importare file csv in più fogli excel 2003

Postdi patel » 02/03/17 21:35

Codice: Seleziona tutto
Sub ImportCSVFileCommaMultipleSheets() '
    filepath = "F:\Documenti\File.csv" ' <<<<<< modificare
    linenumber = 0
    elementnumber = 0
    maxlines = 65000
'    sh = ActiveSheet
    Open filepath For Input As #1 ' Open file for input
    Do While Not EOF(1) ' Loop until end of file
       linenumber = linenumber + 1
       If linenumber > maxlines Then
         linenumber = 1
         ActiveWorkbook.Sheets.Add
       End If
       Line Input #1, line
       arrayOfElements = Split(line, "|")
       elementnumber = 0
       For Each element In arrayOfElements
          elementnumber = elementnumber + 1
          Cells(linenumber, elementnumber).Value = element
       Next
    Loop
    Close #1 ' Close file.
End Sub
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: importare file csv in più fogli excel 2003

Postdi libraio » 02/03/17 22:23

Ti ringrazio per la soluzione propostami, ma la macro genera "Errore di run-time '1004' Errore definito dall'applicazione o dall'oggetto"
Il debug evidenzia l'errore nella stringa
Cells(linenumber, elementnumber).Value = element
Spero di rileggerti...
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Re: importare file csv in più fogli excel 2003

Postdi patel » 03/03/17 08:09

prova con
Codice: Seleziona tutto
Cells(linenumber, elementnumber).Value = element.value
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: importare file csv in più fogli excel 2003

Postdi libraio » 03/03/17 09:44

Fatta la variazione alla stringa del codice, mi appare ora "Errore di run-time '424' Necessario oggetto" e l'errore rimanda alla stringa appena modificata.
Grato per il tuto aiuto, spero si possa risolvere...
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Re: importare file csv in più fogli excel 2003

Postdi patel » 03/03/17 09:55

prova con
Codice: Seleziona tutto
              ActiveSheet.Cells(linenumber, elementnumber).Value = element.Value
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: importare file csv in più fogli excel 2003

Postdi libraio » 03/03/17 10:24

La nuova modifica ripropone "Errore di run-time '424' Necessario oggetto" con evidenziata la stringa appena modificata.
Confido nella tua pazienza...
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Re: importare file csv in più fogli excel 2003

Postdi patel » 03/03/17 10:28

non disponendo del 2003 ho finito le cartucce, sul 2010 funziona, se puoi inserisci un link al tuo file opportunamente ridotto a poche righe
patel
Utente Senior
 
Post: 309
Iscritto il: 24/04/12 16:03

Re: importare file csv in più fogli excel 2003

Postdi libraio » 03/03/17 11:28

Ecco pochissime righe...

https://we.tl/ZkTRvjKTnr

Grazie ancora
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Re: importare file csv in più fogli excel 2003

Postdi Anthony47 » 03/03/17 12:47

Avrebbe aiutato sapere se l'errore si verifica subito o dopo "alcune righe" importate o dopo molte righe importate.
Io non ho avuto problemi a eseguire la macro di patel su XL2003 usando il tuo csv.

Comunque prova a inserire in testa alla macro la dichiarazione delle variabili usate:
Codice: Seleziona tutto
Dim FilePath As String, LineNumber As Long, ElementNumber As Long, maxLines As Long
Dim LINE, arrayOFelements, EleMent

E prova anche a usare questa variante:
Codice: Seleziona tutto
       Line Input #1, LINE
       arrayOFelements = Split(LINE & "|", "|")     'MM
       ElementNumber = 0
       Cells(LineNumber, 1).Resize(1, UBound(arrayOFelements) + 1).Value = arrayOFelements  '+++
'       For Each element In arrayOfElements
'          elementnumber = elementnumber + 1
'          Cells(linenumber, elementnumber).Value = element
'       Next
    Loop
La riga marcata MM e' modificata rispeto a quanto suggerito da patel; quella con +++ e' aggiunta; il loop For Each /Next e' stato commentato e quindi lo potrai eventualmente cancellare; le altre istruzioni sono messe solo per chiarire la posizione nella macro.

Prova e se va in errore chiarisci se c'e' stata qualche minima importazione oppure l'errore e' immediato.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: importare file csv in più fogli excel 2003

Postdi libraio » 03/03/17 14:36

Ringrazio Anthony per il contributo.
Ho corretto il codice secondo le sue indicazioni, ma sussiste la segnalazione di errore. Considerate le variazioni del codice intercorse, preferisco trascriverlo, attualizzato, nella sua interezza:

Codice: Seleziona tutto
Sub ImportCSVFileCommaMultipleSheets()
'
'
Dim FilePath As String, LineNumber As Long, ElementNumber As Long, maxLines As Long
Dim LINE, arrayOFelements, EleMent
    FilePath = "C:\Users\Libreria Garibaldi\Desktop\part1.csv" ' <<<<<< modificare
    LineNumber = 0
    ElementNumber = 0
    maxLines = 65000
'    sh = ActiveSheet
    Open FilePath For Input As #1 ' Open file for input
    Do While Not EOF(1) ' Loop until end of file
       LineNumber = LineNumber + 1
       If LineNumber > maxLines Then
         LineNumber = 1
         ActiveWorkbook.Sheets.Add
       End If
       Line Input #1, LINE
       arrayOFelements = Split(LINE & "|", "|")
       ElementNumber = 0
       Cells(LineNumber, 1).Resize(1, UBound(arrayOFelements) + 1).Value = arrayOFelements
       For Each EleMent In arrayOFelements
          ElementNumber = ElementNumber + 1
          Cells(LineNumber, ElementNumber).Value = EleMent.Value
       Next
    Loop
    Close #1 ' Close file.
End Sub


Lanciata la macro, il programma lavora per circa 1 minuto, appare quindi "Errore di run-time '1004' Errore definito dall'applicazione o dall'oggetto" ed il debug evidenzia la stringa
Cells(LineNumber, 1).Resize(1, UBound(arrayOFelements) + 1).Value = arrayOFelements
sul foglio non viene trascritto nulla (lo segnalo per la prova successiva)

Considerato che a voi la macro funziona con il mio file di prova, apportate le opportune variazioni al 'FilePath' del codice, ho lanciato la macro sul medesimo file.
Il programma ha lavorato per meno di un secondo, al termine del quale è apparso "Errore di run-time '424' Necessario oggetto" ed il debug ha evidenziato la stringa
Cells(LineNumber, ElementNumber).Value = EleMent.Value
sul foglio1 è tuttavia comparsa la prima riga compilata.

Confido in voi e vi ringrazio


Considerato che a voi la macro fu
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Re: importare file csv in più fogli excel 2003

Postdi Anthony47 » 03/03/17 15:32

Ho corretto il codice secondo le sue indicazioni, ma sussiste la segnalazione di errore
Su quale riga, e quale errore?

Comunque NON usare
For Each EleMent In arrayOFelements
ElementNumber = ElementNumber + 1
Cells(LineNumber, ElementNumber).Value = EleMent.Value
Next
(EleMent non ha una proprieta' "value")
Usa la variante che ti ho proposto prima.


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: importare file csv in più fogli excel 2003

Postdi libraio » 03/03/17 16:46

Grazie Anthony,
ho applicato le ulteriori correzioni che mi hai indicato.

Adesso la macro funziona perfettamente con il file di prova (il numero di linee è inferiore a 56.000),
ma con il file originale ( 200.000 linee circa), dopo un minuto di lavoro, viene segnalato "Errore di run-time '1004' errore definito dall'applicazione o dall'oggetto"
e nel codice viene evidenziata la stringa
Cells(LineNumber, 1).Resize(1, UBound(arrayOFelements) + 1).Value = arrayOFelements
(come se non riuscisse a riversare i dati in nuovi fogli).

Se può essere utile, ho caricato un file csv di oltre 60.000 righe, qui:
http://www.filedropper.com/part1_7

Spero di non abusare della vostra pazienza...
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Re: importare file csv in più fogli excel 2003

Postdi Anthony47 » 04/03/17 19:17

Il nuovo csv non e' lungo abbastanza (>65mila records), ma dopo averlo "prolungato" e' stato importato regolarmente dalla macro su due fogli.
Prova ad aggiungere "ActiveSheet" in questa riga:
Codice: Seleziona tutto
       ActiveSheet.Cells(LineNumber, 1).Resize(1, UBound(arrayOFelements) + 1).Value = arrayOFelements  '+++

Se ancora va in errore allora sposterei l'attenzione sul contenuto del csv... Fai questa prova:
-quando va in errore vai in Debug
-premi Contr-g per aprire la "finestra Immediata" del vba
-all'interno della "finestra Immediata" digita uno alla volta i seguenti comandi:
Codice: Seleziona tutto
?line
?linenumber
? UBound(arrayOFelements)
Poi copia tutto il contenuto della finestra (comandi e risposte) e pubblica nel tuo prossimo messaggio.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: importare file csv in più fogli excel 2003

Postdi libraio » 06/03/17 19:34

Ciao Anthony,
ho seguito le tue indicazioni.

Ho aggiunto "ActiveSheet", senza alcun esito.

Risposte al procedimento "finestra immediata".

?line =
ha estrapolato 198 linee testo che collego:
http://www.filedropper.com/scolastica-line
ho provato la macro su queste sole linee, e funziona perfettamente e con risultato pressoché immediato!...

?linenumber = 1

? UBound(arrayOFelements) = 2173645

Nel frattempo ho elaborato una possibile alternativa...
Ho diviso con TextSplitter il file csv in più parti >95mila record
Ho lanciato la macro per ogni parte su fogli diversi (1-2-3...) della stessa cartella ed è funzionato alla perfezione.
Sussiste il problema del codice, da variare ad ogni lancio (FilePath).
Si potrebbe inserire una sorta di InputBox per gestire la variabile del file .csv?

Mi affido a te. Grazie
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Re: importare file csv in più fogli excel 2003

Postdi Anthony47 » 08/03/17 13:10

Dal log che hai documentato sembra che il file csv non sia riconosciuto come file di testo da Excel.

Fai questa prova:
Apri il file csv con il Notepad; copia l'intero contenuto e incollalo in un nuovo file di Notepad; salva questo secondo file come ".csv" e prova a importare questo nuovo file.
Se cosi' funziona allora e' proprio il file csv originale formattato male (non viene riconosciuto l'end of line). Se anche cosi' non funziona vedremo per un viaggio a Lourdes.
Il fatto che suddiviso il file con TextSplitter funzioni mi sembra pero' che avvalori la tesi della cattiva formattazione del file originale.

Per la scelta dinamica del file da importare, sostituisci la riga
FilePath = "C:\Users\Libreria Garibaldi\Desktop\part1.csv" ' <<<<<< modificare
con
Codice: Seleziona tutto
With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .Filters.Clear
    .Filters.Add "csv", "*.csv*", 1   '<<< Filtro per estensione
    .Show
    If .SelectedItems.Count = 0 Then
         MsgBox ("Nessuna voce selezionata, procedura annullata")
         Exit Sub
    End If
    FilePath = .SelectedItems(1)     'Directory e Nome del file selezionato
End With


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: importare file csv in più fogli excel 2003

Postdi libraio » 08/03/17 14:23

Considerato che se andassi a Lourdes troverei chiuso...
ho tentato una soluzione empirica al problema, che penso proprio risalga ad una formattazione inesatta del csv.
Ho aperto il file con word 2003, l'ho salvato in txt, riaperto con Notepad e salvato in csv: il file risultante funziona perfettamente!
Poiché devo periodicamente aggiornare dati con file d'origine csv, spero che i prossimi siano formattati correttamente.

L'alternativa della scelta dinamica del file da importare (soluzione con Text Splitter) funziona a meraviglia!

Grazie, sei insostituibile
libraio
libraio
Utente Senior
 
Post: 329
Iscritto il: 04/01/10 20:31

Re: importare file csv in più fogli excel 2003

Postdi Anthony47 » 09/03/17 15:14

Purtroppo credo che dipenda dal programma che genera quei file, quindi temo che i prossimi saranno uguali ai precedenti.

Credo che dovrebbe funzionare anche solo aprendo il file con Notapad e salvandolo.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "importare file csv in più fogli excel 2003":


Chi c’è in linea

Visitano il forum: Nessuno e 40 ospiti