条件格式与VBA格式化速度/内存

时间:2016-07-22 15:14:31

标签: excel vba performance excel-vba conditional-formatting

我正在开发一个模板电子表格,可以在刷新时调整数据数组的大小。目前,我正在使用条件格式在数组增长时添加边框,反之亦然。

使用VBA对单元格进行刷新时是否更清晰,而不是让单元格的大部分符合条件格式规则?一个与另一个有什么好处?

谢谢!

1 个答案:

答案 0 :(得分:2)

请考虑以下代码:

Option Explicit

Private Sub fill()
    Dim i As Long
    Dim num As Long

    Randomize

    For i = 1 To 500000
        num = Int(50 * Rnd) + 1
        Sheet1.Cells(i, 1).Value = num
        Sheet1.Cells(i, 2).Value = num
    Next
End Sub

Sub format()
    Dim i As Long

    Debug.Print Now
    With Sheet1
        For i = 1 To .UsedRange.Rows.Count
            If .Cells(i, 1).Value > 20 Then .Cells(i, 1).Interior.ColorIndex = 20
        Next
    End With
    Debug.Print Now
End Sub

Sub conditionally_format()
    Debug.Print Now

    With Sheet1.Columns(2)
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=40"
        .FormatConditions(1).Font.Color = -16383844
        .FormatConditions(1).Font.TintAndShade = 0
        .FormatConditions(1).Interior.PatternColorIndex = xlAutomatic
        .FormatConditions(1).Interior.Color = 13551615
        .FormatConditions(1).Interior.TintAndShade = 0
    End With

    Debug.Print Now
End Sub

在我的HP-asaurus上,我得到以下结果

format:
7/22/2016 1:10:34 PM
7/22/2016 1:10:49 PM
conditionally_format:
7/22/2016 1:25:06 PM
7/22/2016 1:25:07 PM

但是,应该注意conditionally_format子的结果表示运行该代码所花费的时间,而不是实际有条件地格式化单元格。除了通过更改电子表格中的值并查看需要多长时间,我不知道如何衡量。即使这样做也是不可能的,因为它发生得如此之快,我无法衡量它。这意味着循环遍历每个单元格的代码比设置条件格式慢。这是真正的预期,因为Excel正在加载每个Cell对象,然后检查单元格对象.Value,然后根据该评估设置Interior.ColorIndex属性。除了VBA不在图片之外,条件格式也是如此。它是Excel执行操作的底层(和优化)编译代码。速度差异巨大吗?并不是的。我的慢速笔记本电脑在15秒内完成了50万次比较,而条件格式规则基本上是瞬间格式化。

好处......这是一个更强硬的电话。我认为更多的最终用户会理解条件格式规则,这也意味着更多的最终用户可以使用它们。这可能是不可取的。它更干净吗?再次艰难的召唤。如果您从UI设置格式规则,开发人员可能不会考虑查找任何条件格式规则,并且由于IDE中没有任何关于条件格式的信息,这又会导致不良后果。过去曾有bugs with conditional formatting,但我不知道这是否还是个问题。我认为您最终选择的方法将取决于您希望为最终用户提供多少控制权以及您想要创建多少代码。