Самый эффективный способ добавить форматирование Excel - VBA - PullRequest
0 голосов
/ 04 декабря 2009

У меня есть макрос, который добавляет сотни строк данных в таблицу Excel. Я вызываю процедуру из цикла, которая вставляет каждую строку данных. Я применяю форматирование строки каждый раз, когда вставляю эти данные. Однако во время тестирования я обнаружил, что могу вставлять все данные примерно на 3/4 секунды быстрее (3,3 с против 4,11 с), когда я не применяю форматирование построчно, но все сразу. Проблема, которую я пытаюсь преодолеть, заключается в том, что не все строки имеют одинаковое форматирование; Тем не менее, существует предсказуемая закономерность. Две строки одного форматирования и одна строка различного форматирования. Есть ли способ без зацикливания применить эти два разных формата в одном, что позволило бы мне сохранить прирост производительности, который я получаю (пользователи хотели бы видеть ответ менее чем за 2 секунды, чтобы это могло быть большим выигрышем).

В настоящее время я использую следующий код (при этом все настройки приложения, такие как обновление экрана, вычисления и события отключены)

Private Sub BuildTerminalSummary(ByRef terminals, ByVal timeFrame)
    Dim terminal As clsTerminal
    Dim curSheet As Worksheet
    Dim breakLoop As Boolean
    Dim terminalCode As String
    Dim rowNumber As Long

    Set terminal = New clsTerminal
    Set curSheet = Sheets("Terminal Summary")

    rowNumber = 7

    'Remove all content, borders, and tint
    ClearPage curSheet, rowNumber

    For Each terminal In terminals         
        AddDetailData curSheet, terminal.InfoArray, rowNumber
        AddDetailData curSheet, terminal.PriorInfoArray, rowNumber + 1
        AddDiffPercentFormulas curSheet, terminal.DiffPercentInfoArray, rowNumber + 2

        rowNumber = rowNumber + 2

    Next terminal

    'Make sure the columns are wide enough to display the numbers
    curSheet.Cells.EntireColumn.AutoFit

End Sub

Private Sub AddDetailData(ByRef curSheet, ByRef data, ByVal rowNumber)
    With curSheet
        With .Cells(rowNumber, 3).Resize(1, 16)
            .value = data
            .Style = "Comma"
            .NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""??_);_(@_)"
        End With
        'This overides the formatting in the revenue columns with currency instead of comma style
        With .Cells(rowNumber, 5).Resize(1, 2)
            .Style = "Currency"
            .NumberFormat = "_($* #,##0_);_($* (#,##0);_($* ""-""??_);_(@_)"
        End With
        With .Cells(rowNumber, 13).Resize(1, 6)
            .Style = "Currency"
        End With
    End With

End Sub

Private Sub AddDiffPercentFormulas(ByRef curSheet, ByRef data, ByVal rowNumber)
    With curSheet.Cells(rowNumber, 3).Resize(1, 16)
        .value = data
        .NumberFormat = "0.00%"
    End With

End Sub

Ответы [ 3 ]

2 голосов
/ 04 декабря 2009

Если вы хотите избежать копирования / вставки, вы можете использовать автозаполнение, чтобы применить форматирование к диапазону.

Range("A1:F3").AutoFill Destination:=Range("A1:F21"), Type:=xlFillFormats

Примечание. Диапазон источника («A1: F3») должен быть частью диапазона назначения («A1: F21»)

Вы также можете использовать обычные методы оптимизации vba, установив расчет вручную и отключив ScreenUpdating. Хотя я не думаю, что они сделают какие-либо существенные улучшения скорости в вашем случае.

Dim calc As XlCalculation
calc = Application.Calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Application.ScreenUpdating = True
Application.Calculation = calc
1 голос
/ 04 декабря 2009

У вас есть два вида форматирования: 2 строки в одном шаблоне и 1 строка в другом шаблоне. Я называю это 2-х и 1-х стороннее форматирование.

Вы можете применить форматирование 2cell ко всей колонке / всей области данных, а затем выполнить цикл только для форматирования 1cell.

0 голосов
/ 04 декабря 2009

вы можете переписать AddDetail (), чтобы принимать оба массива в одном вызове, поэтому вы избегаете 50% вызовов и можете форматировать обе строки в одном кадре. Это сэкономит много времени. Это звонки, а не форматирование, которое стоит времени.

Вместо .Resize (1, 16) попробуйте использовать .range (cell (rownum, 3), cell (rownum, 19)), который работает быстрее.

Другой быстрый способ - отформатировать первую строку и скопировать полный формат строки во 2-ую строку, как в

MyRange(row, col).EntireRow.Copy
MyRange(row+1, col).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
                                 SkipBlanks:=False, Transpose:=False

Кроме того, что я не могу полностью следовать вашему коду, вы вызываете AddDetail () с rownum и rownum + 1, затем вы вызываете AddDiff ... () с rownum + 2, но в итоге вы увеличиваете rownum только на 2 .. Вы не должны увеличивать его на 3 ... или хотите перезаписать одну из строк, созданных вами с помощью AddDetail ().

Удачи MikeD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...