Я ищу любые советы, которые могут помочь мне оптимизировать отчет.Оптимизация большого отчета о Excel
Отчет состоит из сводной таблицы, которая извлекает данные из другой таблицы. Данные в сводной таблице окрашены и сгруппированы макросами VBA. Моя главная забота - это точно раскрасить и сгруппировать.
Мне нужно покрасить большую часть фона линии, а затем я должен сгруппировать их. Я читаю все строки из таблицы с данными, затем я вырезаю пять столбцов с иерархией, которая определяет правила окраски строк и группировки. Я проверяю строку за строкой, если значения соответствуют столбцам.
Пример иерархии:
CoreElement Category Subcategory Code Product
6 26 161 1289 3014659
6 26 161 1245 3014655
6 26 161 1289 3014585
6 26 161 1282 3019640
7 28 164 164 164
7 7 7 7 7
7 7 7 7 7
5 22 142 1208 1208
5 22 142 142 142
раскраски:
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
И макрос, который создает две первые группировки, макросы для остальных групп практически одинаковы:
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
В таблица с данными я получил 22 тысячи строк. Этот отчет сохраняется как рабочая книга .xlsb.
Вы можете использовать массив для сравнения, более быстрый, чем диапазон (x) = range (y), использовать массивы. Посмотрите в окно locals, как выглядит 'arrVariant = range (a1: a10) .value', он не будет сильно отличаться в синтаксисе для ячеек. Конечно, калькуляция, обновление экрана и т. Д. Помогли бы, не могли бы вы отключить их. Вы можете сделать 2-й чек в 1-м цикле, используя 'offset', также возможно, может понадобиться k2 не уверен, что он делает без данных. –
Раскраска: не можете ли вы использовать ** Условное форматирование **? Не следовали точным деталям вашего вопроса (и, следовательно, я мог что-то пропустить), но мне кажется, что вы можете заранее определить правила раскраски в своем целевом листе и отбросить функцию, которая цветет вещи. – FDavidov
Привет. Поскольку в вашем коде нет проблем с функциональностью, этот пост лучше подходит для сайта-сестры [Code Review] (http://codereview.stackexchange.com/). У вас может получиться лучший ответ. –