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