I created a macro to merge CEIP report data to one sheet. It eases a following analysis of the data. Centre on Emission Inventories and Projections (CEIP) gathers reports and data about pollution year by year from European countries. Reports and data are available here.
Final result is not formatted but it contains freeze panels.
Macro works with an active workbook. It was tested on Czech and Danish 2018 Submission.
You can copy and paste or download it.
'Procedure sort sheets with 4 digit names like 1990, 2015 and etc. 'Then, it creates a sheet named "Merge" with a header. The header is a copy of header from CEIP report. 'And finally, it copies data from sheets year by year. Sub MainMergeSheets() Dim shColl As New Collection Dim yearNum Dim NUM_COPIED_ROWS As Single Dim min4DigitName As Integer 'Number of rows copied from every sheets NUM_COPIED_ROWS = 128 'Speed up macro by disable screen updating Application.ScreenUpdating = False 'Sort sheets with 4 digit name SortSheetsTabName 'First sheet with 4 digit name is the lowest after SortSheetsTabName procedure min4DigitName = First4DigitSheetName 'Create the Merge sheet and add header CreateMergeSheet For Each sh In ActiveWorkbook.Sheets If (sh.name Like "####") Then shColl.Add sh, sh.name End If Next sh 'Merge specific cells from other sheet to "Merge" sheets For Each sh In shColl yearNum = sh.name - min4DigitName + 1 sh.Range("A14:AL141").Copy Sheets("Merge").Range("B" & 5 + ((yearNum - 1) * NUM_COPIED_ROWS) & ":AL" & 2 + (yearNum * NUM_COPIED_ROWS)).PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False With Sheets("Merge").Range("A" & 5 + ((yearNum - 1) * NUM_COPIED_ROWS) & ":A" & 4 + (yearNum * NUM_COPIED_ROWS)) .NumberFormat = "General" .Value = sh.name End With Next sh 'Application.ScreenUpdating turn on Application.ScreenUpdating = True 'Select first row at the bottom to show last result Sheets("Merge").Range("A" & (shColl.Count * NUM_COPIED_ROWS) + 5).Select End Sub Private Sub SortSheetsTabName() Dim iSheets%, i%, j% iSheets = Sheets.Count For i = 1 To iSheets - 1 For j = i + 1 To iSheets If Sheets(j).name < Sheets(i).name Then If Sheets(i).name Like "####" Then Sheets(j).Move Before:=Sheets(i) End If End If Next j Next i End Sub Private Function First4DigitSheetName() As Integer Dim i% For i = 1 To Sheets.Count If Sheets(i).name Like "####" Then First4DigitSheetName = CInt(Sheets(i).name) Exit Function End If Next i End Function Private Sub CreateMergeSheet() Dim i% For i = 1 To Sheets.Count If Sheets(i).name = "Merge" Then Application.DisplayAlerts = False Sheets(i).Delete Application.DisplayAlerts = True Exit For End If Next i Sheets.Add(Before:=Sheets(1)).name = "Merge" Sheets(CStr(First4DigitSheetName)).Range("A10:AL13").Copy Sheets("Merge").Range("B1").PasteSpecial Paste:=xlPasteValues Sheets("Merge").Range("B5").Activate ActiveWindow.FreezePanes = True End Sub
Facebook Comments