I have a problem with generation of my report. Data is read from other sheet in report. Most time is wasted on execution of LineColor() and LineGroup(). Those operations are based on hierarchy, which is copied and pasted into cells parallel to every row.
CoreElementCode CategoryCode SubcategoryCode BMCCode ProductId 1 30 167 1307 1000152 1 30 167 1307 1000152 1 30 167 1307 1307 1 30 167 1307 1307 1 30 167 167 167 1 30 167 167 167 1 30 30 30 30 1 30 30 30 30 1 10 101 1014 1000112 1 10 101 1014 1000112 1 10 101 1014 1014 1 10 101 1014 1014 1 10 101 1013 1000142 1 10 101 1013 1000142 1 10 101 1013 1013 1 10 101 1013 1013 1 10 101 1008 1000122 1 10 101 1008 1000122 1 10 101 1008 1008 1 10 101 1008 1008 1 10 101 101 101 1 10 101 101 101 1 10 100 1306 1000132 1 10 100 1306 1000132
I'am looking for advice on how to make this code faster. Current generation (with 22 thousands rows in Data_Load spreadsheet) takes 2 hours.
Option Explicit
Public ReportWeek As String
Sub CreateReport()
Load_Data
ReportWeek = Sheets("Headers").Cells(24, 1).Value
Sheets("Category_Sales").Activate
Application.DisplayAlerts = False
ActiveSheet.PivotTables("SalesCategory").PivotCache.Refresh
Cells(12, 2).Value = "1"
Cells(12, 3).Value = "2"
Cells(12, 4).Value = "3"
Cells(12, 5).Value = "4"
Cells(12, 6).Value = "5"
Cells(12, 18).Value = "1"
Cells(12, 19).Value = "2"
Cells(12, 20).Value = "3"
Cells(12, 21).Value = "4"
Cells(12, 22).Value = "5"
Cells(12, 2).Value = Sheets("Headers").Cells(2, 1).Value
Cells(12, 3).Value = Sheets("Headers").Cells(3, 1).Value
Cells(12, 4).Value = Sheets("Headers").Cells(4, 1).Value
Cells(12, 5).Value = Sheets("Headers").Cells(5, 1).Value
Cells(12, 6).Value = Sheets("Headers").Cells(6, 1).Value
Cells(12, 18).Value = Sheets("Headers").Cells(2, 1).Value
Cells(12, 19).Value = Sheets("Headers").Cells(3, 1).Value
Cells(12, 20).Value = Sheets("Headers").Cells(4, 1).Value
Cells(12, 21).Value = Sheets("Headers").Cells(5, 1).Value
Cells(12, 22).Value = Sheets("Headers").Cells(6, 1).Value
With ActiveSheet.PivotTables("SalesCategory").PivotFields("CoreElementCode")
.Orientation = xlRowField
.Position = 2
End With
With ActiveSheet.PivotTables("SalesCategory").PivotFields("CategoryCode")
.Orientation = xlRowField
.Position = 3
End With
With ActiveSheet.PivotTables("SalesCategory").PivotFields("SubcategoryCode")
.Orientation = xlRowField
.Position = 4
End With
With ActiveSheet.PivotTables("SalesCategory").PivotFields("BMCCode")
.Orientation = xlRowField
.Position = 5
End With
With ActiveSheet.PivotTables("SalesCategory").PivotFields("ProductID")
.Orientation = xlRowField
.Position = 6
End With
Dim rng As Range
Dim MaxLineNumber As Integer
'Column with LineOrder
'Set rng = Worksheets("Data").Range("O1:O25000")
'Find max LineOrder(line number)
Dim nonEmptyRowsNumber As Long
Dim WorkRange As Range
nonEmptyRowsNumber = Worksheets("Data_Load").UsedRange.Columns("O").Rows.Count
Set WorkRange = Worksheets("Data_Load").Range("O2:O" & nonEmptyRowsNumber)
MaxLineNumber = Application.Max(WorkRange)
Range("B13:F" & MaxLineNumber + 1).Select 'wyzej wstawione GMH, pole po polu
Selection.Copy
Range("BL13").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveSheet.PivotTables("SalesCategory").PivotFields("CoreElementCode"). _
Orientation = xlHidden
ActiveSheet.PivotTables("SalesCategory").PivotFields("CategoryCode"). _
Orientation = xlHidden
ActiveSheet.PivotTables("SalesCategory").PivotFields("SubcategoryCode"). _
Orientation = xlHidden
ActiveSheet.PivotTables("SalesCategory").PivotFields("BMCCode"). _
Orientation = xlHidden
ActiveSheet.PivotTables("SalesCategory").PivotFields("ProductID"). _
Orientation = xlHidden
LineColor (MaxLineNumber)
LineGroup (MaxLineNumber)
Columns("BL:BP").Select 'kasowanie pól z GMH
Selection.Delete
Sheets("Category_Sales").PivotTables("SalesCategory").ChangePivotCache ActiveWorkbook. _
PivotCaches.Create(SourceType:=xlDatabase, SourceData:="E:\Reports\Main\[MPF_Sales.xlsb]Data_Load!C1:C19", Version:=xlPivotTableVersion14)
Sheets("Category_Sales").PivotTables("SalesCategory").PivotCache.Refresh
Sheets("Category_Sales").PivotTables("SalesCategory").SaveData = True
ActiveWorkbook.ShowPivotTableFieldList = False
Sheets("Category_Sales").Columns("A").Cells.HorizontalAlignment = xlHAlignLeft
Cells(10, 2).Select
SaveXls
End Sub
Sub LineColor(MaxLineNumber As Integer)
Dim CellId As Range
Dim k As Integer
Dim r As Integer
Dim oColor
' kolorowanie na czarno
Set oColor = Worksheets("Category_Sales").Range("A13:AV" & MaxLineNumber + 13)
For Each CellId In oColor.Cells
k = CellId.Column
r = CellId.Row
Cells(r, k).Font.Color = 1
Cells(r, k).Font.Bold = False
Next CellId
Set oColor = Worksheets("Category_Sales").Range("A13:A" & MaxLineNumber + 13)
For Each CellId In oColor.Cells
k = CellId.Column
r = CellId.Row
If Cells(r, 64).Value = "-1" Then 'Store Sales
Range("A" & r & ":AV" & r).Interior.Color = RGB(204, 255, 204)
Range("A" & r & ":AV" & r).Font.Bold = True
ElseIf Cells(r, 64).Value = Cells(r, 65).Value And Cells(r, 65).Value = Cells(r, 66).Value And Cells(r, 64) <> "" Then 'Core Element
Range("A" & r & ":AV" & r).Interior.Color = RGB(214, 225, 238)
Range("A" & r & ":AV" & r).Font.Bold = True
ElseIf Cells(r, 64).Value <> Cells(r, 65).Value And Cells(r, 65).Value = Cells(r, 66).Value Then 'Category
Range("A" & r & ":AV" & r).Interior.Color = RGB(255, 255, 204)
ElseIf Cells(r, 65).Value <> Cells(r, 66).Value And Cells(r, 66).Value = Cells(r, 67).Value Then 'Subcategory
Range("A" & r & ":AV" & r).Interior.Color = RGB(191, 191, 191)
ElseIf Cells(r, 66).Value <> Cells(r, 67).Value And Cells(r, 67).Value = Cells(r, 68).Value Then 'BMC
Range("A" & r & ":AV" & r).Interior.Color = RGB(217, 217, 217)
Else
Range("A" & r & ":AV" & r).Interior.Color = xlNone 'Product
End If
Next CellId
End Sub
Sub SaveXls()
Dim ReportPath As String
Dim ReportName As String
Workbooks("MPF_NL_CategorySales.xlsm").Sheets("Category_Sales").Activate
ReportPath = "E:\Reports_DART\Temp"
Application.DisplayAlerts = False
Sheets("Data_Load").Delete
Sheets("Headers").Delete
ActiveWorkbook.SaveAs Filename:= _
ReportPath & "\MPF_Weekly_CategorySales_" & ReportWeek & ".xlsb", FileFormat:= _
xlExcel12, CreateBackup:=False
Application.Quit
Application.DisplayAlerts = True
End Sub
Sub LineGroup(MaxLineNumber As Integer)
Dim CellId As Range
Dim k As Integer
Dim r As Integer
Dim oColor
Worksheets("Category_Sales").Activate
Rows("5:" & MaxLineNumber + 5).Select
Selection.ClearOutline
'
k = 13
Set oColor = Worksheets("Category_Sales").Range("A13:A" & MaxLineNumber + 13)
For Each CellId In oColor.Cells
r = CellId.Row
If Cells(r, 64).Value = "-1" Then
k = k + 1
ElseIf Cells(r, 64).Value <> Cells(r + 1, 64).Value And Cells(r, 64).Value <> "" Then
Rows(k & ":" & r - 1).Rows.Group
k = r + 1
End If
Next CellId
k = 13
Set oColor = Worksheets("Category_Sales").Range("A13:A" & MaxLineNumber + 13)
For Each CellId In oColor.Cells
r = CellId.Row
If Cells(r, 65).Value = Cells(r, 64).Value Then
k = k + 1
ElseIf Cells(r, 65).Value <> Cells(r + 1, 65).Value And Cells(r, 65).Value <> "" Then
Rows(k & ":" & r - 1).Rows.Group
k = r + 1
End If
Next CellId
'
k = 13
Set oColor = Worksheets("Category_Sales").Range("A13:A" & MaxLineNumber + 13)
For Each CellId In oColor.Cells
r = CellId.Row
If Cells(r, 66).Value = Cells(r, 65).Value Then
k = k + 1
ElseIf Cells(r, 66).Value <> Cells(r + 1, 66).Value And Cells(r, 66).Value <> "" Then
Rows(k & ":" & r - 1).Rows.Group
k = r + 1
End If
Next CellId
'
k = 13
Set oColor = Worksheets("Category_Sales").Range("A13:A" & MaxLineNumber + 13)
For Each CellId In oColor.Cells
r = CellId.Row
If Cells(r, 67).Value = Cells(r, 66).Value Then
k = k + 1
ElseIf Cells(r, 67).Value <> Cells(r + 1, 67).Value And Cells(r, 67).Value <> "" Then
Rows(k & ":" & r - 1).Rows.Group
k = r + 1
End If
Next CellId
'
Sheets("Category_Sales").Outline.ShowLevels RowLevels:=6
Sheets("Category_Sales").Outline.ShowLevels RowLevels:=5
Sheets("Category_Sales").Outline.ShowLevels RowLevels:=4
Sheets("Category_Sales").Outline.ShowLevels RowLevels:=3
Sheets("Category_Sales").Outline.ShowLevels RowLevels:=2
Sheets("Category_Sales").Outline.ShowLevels RowLevels:=1
'
End Sub
Sub Load_Data()
Sheets("Data_Load").Select
Range("A2").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
Sheets("Headers").Select
Range("A2").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
Range("A24").Select
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
End Sub
Unfortunately, I cannot send you this report since it contains real prod data.