什么时候使用 With 比重复引用相同的范围更好?



我有一个自动创建表单的代码,所以它最多引用一些单元格两次或三次来设置字段名称,并可能根据字体大小或颜色进行更改。在它设置值并更改字体的情况下,我可以每次引用范围,产生 2 行代码,或者我可以使用With引用它一次,但它总共有 4 行代码。直觉上,我认为 2 行少于 4 行,但我是一个菜鸟,我不确定如果整个脚本使用它,使用With是否会有一些效率。例如:

Range("A1").value = "Hi"
Range("A1").font.size = 12

With Range("A1")
.value = "Hi"
.font.size = 12
End With

哪个会更快?

在这种情况下,您不会获得显着的速度差异⇒为自己进行优化。

今天的主要优化是维护代码的人员的时间和精力。

因此,如果增益将提高 2% 的代码或消耗的内存减少 5%,则您没有优化处理。如果增益对于速度或内存来说微不足道,只需优化代码即可获得最容易的可读性。

这也意味着内部具有不同侧重点的相同代码结构可以以一种方式优化一次,以另一种方式进行第二次优化。(当然,Range("A1")的调用应始终只进行一次,将结果存储到变量中。

在您这里的情况下,请使用With Range("A1")...End With.它提供了更清晰的上下文,并使开发人员免于阅读相同的文本。省略同一文本的重复,也不太容易出错。

我按照建议在循环中测试了示例代码 100,000 次,With速度提高了约 2%。With的时间为 36.07 秒,Range 示例的时间为 36.81 秒。

考虑到所有评论,With似乎各方面都更好,因为既更快又更容易阅读,即使该范围仅被引用两次。

我用这个例程进行了测试:

Sub UseWith()
Dim oCell As Range
Dim sName As String
Dim lColorIndex As Long
Dim bItalic As Boolean
Dim sSize As Single
Dim bStrikethrough As Boolean
TimerStart "1"
For Each oCell In Sheet2.UsedRange
sName = oCell.Font.Name
lColorIndex = oCell.Font.ColorIndex
bItalic = oCell.Font.Italic
sSize = oCell.Font.Size
bStrikethrough = oCell.Font.Strikethrough
Next
TimerReport
TimerStart "2"
For Each oCell In Sheet2.UsedRange
With oCell.Font
sName = .Name
lColorIndex = .ColorIndex
bItalic = .Italic
sSize = .Size
bStrikethrough = .Strikethrough
End With
Next
TimerReport
End Sub

结果:

1 0.2040441766

2 0.1509655957

所以 1 比 2 慢大约 35%。

相关内容

最新更新