aiuto macro vba unione CSV
Hai un problema con Excel? 
aiuto macro vba unione CSV
di vbaexcel92 data: 18/04/2016 22:07:16
Buonasera,
scrivo per informazioni riguardo una macro in VBA in grado di unire più file di Excel in un un'unico file, saltando la prima riga d'intestazione, tutto a partire dalla sola selezione di una cartella.
L'unico problema che non riesco a risolvere è l'apertura dei file .csv al posto di quelli .xls; me li unisce ma i testi sono su una sola colonna. Qualcuno può aiutarmi affinchè riesca ad adattare la macro per farla funzionare con i file .csv e quindi aprendoli nel modo corretto? Grazie in anticipo.
Simone
Sub UNISCI()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''' ATTENZIONE RICHIEDE L'ATTIVAZIONE DELLA LIBRERIA MICROSOFT SCRIPTING RUNTIME '''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim strPath As String
Dim fd As FileDialog
Dim objfd As Variant
Dim objFSY As FileSystemObject
Dim objFOL As Folder
Dim objFIL As File
Dim wbFrom As Workbook, wbTo As Workbook
Dim wsFrom As Worksheet, wsTo As Worksheet
Dim x As Long, i As Long
Dim rngCopy As Range
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.InitialFileName = "C:"
.Title = "Sfoglia cartelle"
.ButtonName = "Ok"
.AllowMultiSelect = False
.InitialView = msoFileDialogViewDetails
.Show
For Each objfd In .SelectedItems
strPath = objfd
Next objfd
End With
If strPath = "" Then GoTo Uscita
Set objFSY = New FileSystemObject
Set objFOL = objFSY.GetFolder(strPath)
Set wbTo = ThisWorkbook
Set wsTo = wbTo.Sheets(1)
For Each objFIL In objFOL.Files
x = wsTo.Range("A" & wsTo.Rows.Count).End(xlUp).Row + 1
Set wbFrom = Application.Workbooks.Open(objFIL)
Set wsFrom = wbFrom.Sheets(1)
With wsFrom
i = .Range("A" & .Rows.Count).End(xlUp).Row
Set rngCopy = .Range("A2:BF" & i)
rngCopy.Copy wsTo.Cells(x, 1)
Set rngCopy = Nothing
End With
wbFrom.Close 0
Set wbFrom = Nothing
Set wsFrom = Nothing
Next
Uscita:
Set objFSY = Nothing
Set objFOL = Nothing
Set wbTo = ThisWorkbook
Set wsTo = Nothing
End Sub
|
di patel data: 19/04/2016 07:33:24
allega 2 file csv per testare la macro, se i delimitatori non sono quelli standard non puoi utilizzare Workbooks.Open per aprirli
di vbaexcel92 data: 21/04/2016 11:55:58
il delimitatore del campo csv è il ";"
allego due file csv per prova
di patel data: 21/04/2016 14:25:13
prova questa
Sub OpenMultipleCSV() ' incolla nello stesso foglio i file selezionati
foglio = 1 ' nunero foflio su cui importare
fn = Application.GetOpenFilename("Excel-files,*.csv", 1, "Seleziona uno o più Files", , True)
If TypeName(fn) = "Boolean" Then Exit Sub
For f = 1 To UBound(fn)
Call ImportCSVFile(fn(f), foglio)
Next f
End Sub
Sub ImportCSVFile(fname, sh)
linenumber = Sheets(sh).Cells(Rows.Count, "A").End(xlUp).Row + 1
' Sheets(sh).Cells(linenumber, 1).Value = fname
elementnumber = 0
Open fname For Input As #1
Do While Not EOF(1)
Line Input #1, lline
arrayOfElements = Split(lline, ";")
elementnumber = 0
For Each element In arrayOfElements
elementnumber = elementnumber + 1
Sheets(sh).Cells(linenumber, elementnumber).Value = element
Next
linenumber = linenumber + 1
Loop
Close #1
End Sub |
di vbaexcel92 data: 25/04/2016 14:38:28
grazie mille, la macro funziona bene, l'unica cosa è che la prima riga di ogni file CSV che apre dovrebbe saltarla e partire dalla seconda. Come posso fare? Grazie ancora per l'aiuto
di patel data: 25/04/2016 20:58:35
prova così
Sub OpenMultipleCSV() ' incolla nello stesso foglio i file selezionati
foglio = 1 ' nunero foflio su cui importare
fn = Application.GetOpenFilename("Excel-files,*.csv", 1, "Seleziona uno o più Files", , True)
If TypeName(fn) = "Boolean" Then Exit Sub
For f = 1 To UBound(fn)
Call ImportCSVFile(fn(f), foglio)
Next f
End Sub
Sub ImportCSVFile(fname, sh)
linenumber = Sheets(sh).Cells(Rows.Count, "A").End(xlUp).Row + 1
' Sheets(sh).Cells(linenumber, 1).Value = fname
elementnumber = 0
Open fname For Input As #1
Line Input #1, lline ' <<<<<<<<<<<<<<<<<<<<<
Do While Not EOF(1)
Line Input #1, lline
arrayOfElements = Split(lline, ";")
elementnumber = 0
For Each element In arrayOfElements
elementnumber = elementnumber + 1
Sheets(sh).Cells(linenumber, elementnumber).Value = element
Next
linenumber = linenumber + 1
Loop
Close #1
End Sub |
di vbaexcel92 data: 28/04/2016 16:55:38
Grazie mille, la macro funziona egregiamente però per ogni cella il valore lo racchiude tra virgolette.
di patel data: 28/04/2016 17:54:53
non sono più disponibili i file allegati, comunque prova
For Each element In arrayOfElements
element = Replace(element,""","") '<<<<<<<<<<<<<<<<
elementnumber = elementnumber + 1
Sheets(sh).Cells(linenumber, elementnumber).Value = element
next
|
di vbaexcel92 data: 04/05/2016 12:00:33
Chiedo scusa, la macro funziona bene già di suo, i campi vengono però racchiusi tra virgolette se imposto il file in "sola lettura" o se apro un file dal NAS invece che da locale. come posso risolvere? grazie
di patel data: 04/05/2016 12:45:01
non capisco la domanda, hai provato l'ultimo suggerimento ?
di vbaexcel92 data: 05/05/2016 12:54:23
Chiedo scusa ma sono stato poco chiaro. Il problema non accade sempre, la macro a volte funziona bene mentre altre volte mi delimita tutti i campi con delle virgolette (Es. "valore o testo"). Visto che principalmente la uso per aprire e unire dei file dal NAS della rete locale dell'ufficio utilizzando questo file, impostato in sola lettura, mi chiedevo e stavo valutando se il problema potesse dipendere da qualche impostazione di sicurezza e non dalla macro stessa, in quanto alcune volte funziona bene e i campi li mostra corrretti. Sapete quale potrebbe essere il problema?
di patel data: 05/05/2016 17:23:29
sei certo che non dipenda da csv che non sono tutti uguali ?
Vuoi Approfondire?