aiuto macro vba unione CSV



  • 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 ?