条件格式与 VBA 格式 speed/memory
Conditional Formatting vs VBA formatting speed/memory
我正在开发一个模板 spreadsheet,它将在刷新时调整数据数组的大小。目前我正在使用条件格式在数组增长时添加边框,反之亦然。
在刷新单元格时使用 VBA 格式化单元格比让大多数 sheet 遵循条件格式设置规则更简洁吗?两者相比有什么好处?
谢谢!
考虑以下代码:
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
子项的结果表示 运行 该代码所花费的时间,而不是实际有条件地格式化单元格所花费的时间。除了更改电子表格上的值并查看需要多长时间外,我不知道如何衡量它。即使那样做,也是不可能的,因为它发生得太快了,我无法衡量它。这意味着循环遍历每个单元格的代码 运行s much 比设置条件格式慢。这确实是可以预料的,因为 Excel 正在加载每个 Cell
对象,然后检查单元格对象 .Value
,然后根据该评估设置 Interior.ColorIndex
属性 .除了 VBA 不在画面之外,条件格式也是如此。它是 Excel 执行操作的底层(和优化)编译代码。速度差异大吗?并不真地。我的慢速笔记本电脑在 15 秒内进行了 50 万次比较,与条件格式规则的基本即时格式进行了比较。
好处...这是一个更艰难的决定。我认为更多的最终用户会理解条件格式规则,这也意味着更多的最终用户可以随意使用它们。这可能是不可取的。它更清洁吗?再次艰难的呼吁。如果您从 UI 设置格式规则,开发人员可能不会考虑寻找任何条件格式规则,并且由于 IDE 中没有显示任何关于条件格式的信息,这又会导致不良后果.过去有bugs with conditional formatting,但我不知道这是否仍然是一个问题。我认为您最终选择的方法将归结为您希望为最终用户提供多少控制权与您希望创建多少代码。
我正在开发一个模板 spreadsheet,它将在刷新时调整数据数组的大小。目前我正在使用条件格式在数组增长时添加边框,反之亦然。
在刷新单元格时使用 VBA 格式化单元格比让大多数 sheet 遵循条件格式设置规则更简洁吗?两者相比有什么好处?
谢谢!
考虑以下代码:
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
子项的结果表示 运行 该代码所花费的时间,而不是实际有条件地格式化单元格所花费的时间。除了更改电子表格上的值并查看需要多长时间外,我不知道如何衡量它。即使那样做,也是不可能的,因为它发生得太快了,我无法衡量它。这意味着循环遍历每个单元格的代码 运行s much 比设置条件格式慢。这确实是可以预料的,因为 Excel 正在加载每个 Cell
对象,然后检查单元格对象 .Value
,然后根据该评估设置 Interior.ColorIndex
属性 .除了 VBA 不在画面之外,条件格式也是如此。它是 Excel 执行操作的底层(和优化)编译代码。速度差异大吗?并不真地。我的慢速笔记本电脑在 15 秒内进行了 50 万次比较,与条件格式规则的基本即时格式进行了比较。
好处...这是一个更艰难的决定。我认为更多的最终用户会理解条件格式规则,这也意味着更多的最终用户可以随意使用它们。这可能是不可取的。它更清洁吗?再次艰难的呼吁。如果您从 UI 设置格式规则,开发人员可能不会考虑寻找任何条件格式规则,并且由于 IDE 中没有显示任何关于条件格式的信息,这又会导致不良后果.过去有bugs with conditional formatting,但我不知道这是否仍然是一个问题。我认为您最终选择的方法将归结为您希望为最终用户提供多少控制权与您希望创建多少代码。