martedì 17 settembre 2024

Excel - macro per unire piu file excel in uno solo

 


Mi e' capitato di dover unire differenti files di excel in uno solo.

I file di origine sono tutti generati da RVTools e sono relativi a differenti vcenter.

Quello che volevo ottenere e' un singolo file che racchiudesse tutte le informazioni raccolte da RVTool.

Tutti i file di origine sono quindi strutturati nello stesso modo. Hanno tutti gli stessi fogli di lavoro, chiamati nello stesso modo, ma ciascuno di questi contiene dati differenti. 

Il risultato desiderato e' avere un file excel strutturato con gli stessi fogli di lavoro dei file di origine e che ciscuno di quiesti contenga tutte le righe provenienti dai differenti files.

Ad esempio nel foglio/tab vInfo voglio trovare un elenco di tutte le vm che ci sono in tutti i vcenter che RVTools ha interrogato.

La soluzione che ho utilizzato e' stata quella di creare un file excel di tipo xlsm, cioe che possa utilizzare macro e inserire il seguente codice:


Alt+F11 / VB editor / inserisci modulo

Salva

Alt+F8 per eseguire.


Viene creato un file excel che contiene gli stessi fogli di lavoro de, ma ciascun foglio tutte le righe dei provenienti, con qualche piccolo difetto superabile. Ho effettuato controlli a campione dei dati importati e sembra che non ci siano errori. Il solo problema e' l'intestazione duplicata.

 


Sub UnisciFileExcelConFogli()

    Dim cartella As String

    Dim file As String

    Dim wbOrigine As Workbook

    Dim wsOrigine As Worksheet

    Dim wsDestinazione As Worksheet

    Dim wbDestinazione As Workbook

    Dim ultimaRiga As Long

    Dim nomeFoglio As String

    Dim primaUnione As Boolean

    

    ' Imposta il percorso della cartella contenente i file Excel

    cartella = "C:\test\"

    

    ' Crea un nuovo workbook per i dati uniti

    Set wbDestinazione = Workbooks.Add

    

    ' Imposta il nome del primo file nella cartella

    file = Dir(cartella & "*.xlsx")

    

    primaUnione = True

    

    Do While file <> ""

        ' Apri il file Excel

        Set wbOrigine = Workbooks.Open(cartella & file)

        

        ' Cicla attraverso ogni foglio di lavoro nel file di origine

        For Each wsOrigine In wbOrigine.Worksheets

            nomeFoglio = wsOrigine.Name

            

            ' Controlla se il foglio esiste già nel file di destinazione

            On Error Resume Next

            Set wsDestinazione = wbDestinazione.Sheets(nomeFoglio)

            On Error GoTo 0

            

            ' Se il foglio non esiste, crealo

            If wsDestinazione Is Nothing Then

                Set wsDestinazione = wbDestinazione.Sheets.Add(After:=wbDestinazione.Sheets(wbDestinazione.Sheets.Count))

                wsDestinazione.Name = nomeFoglio

                ' Copia l'intestazione dal foglio di origine al foglio di destinazione

                wsOrigine.Rows(1).Copy wsDestinazione.Rows(1)

            End If

            

            ' Trova l'ultima riga del foglio di destinazione

            ultimaRiga = wsDestinazione.Cells(wsDestinazione.Rows.Count, "A").End(xlUp).Row + 1

            

            ' Copia i dati dal foglio di origine al foglio di destinazione, saltando l'intestazione se non è la prima unione

            If primaUnione Then

                wsOrigine.UsedRange.Copy wsDestinazione.Cells(ultimaRiga, 1)

            Else

                wsOrigine.Range("A2", wsOrigine.Cells(wsOrigine.Rows.Count, wsOrigine.UsedRange.Columns.Count).End(xlUp)).Copy wsDestinazione.Cells(ultimaRiga, 1)

            End If

            

            ' Reimposta wsDestinazione per il prossimo ciclo

            Set wsDestinazione = Nothing

        Next wsOrigine

        

        ' Chiudi il file di origine

        wbOrigine.Close False

        

        ' Passa al file successivo

        file = Dir

        primaUnione = False

    Loop

    

    MsgBox "Unione completata!"

End Sub


Nessun commento:

Posta un commento