添加格式化Excel的最有效方法 - VBA

时间:2009-12-04 18:53:16

标签: excel optimization vba

我有一个宏,可以将数百行数据添加到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 个答案:

答案 0 :(得分:2)

如果您想避免使用复制/粘贴,可以使用自动填充将格式化应用到范围。

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 :(得分:1)

在一种模式中有两种格式化的行,在另一种模式中有两种格式。我称之为2row和1row格式。

您可以将2cell格式应用于整个列/整个数据区域,然后仅循环播放1cell格式。

答案 2 :(得分:0)

你可以重写AddDetail()以在同一个调用中获取两个数组,这样就可以避免50%的调用,并且可以一次性格式化两个行。这将节省大量时间。这是电话,而不是花费时间的格式。

而不是.Resize(1,16)尝试使用执行速度更快的.range(cell(rownum,3),cell(rownum,19))。

另一种快速方法是格式化第一行并将完整行格式复制到第二行,如

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

除了我不能完全遵循你的代码,你用rownum和rownum + 1调用AddDetail(),然后用rownum + 2调用AddDiff ...(),但最后你只用2增加rownum ..你不应该把它增加3 ...或者你想“覆盖”你用AddDetail()创建的一条线。

祝你好运 拾音