Excel 在VBA中,使用With、End With是否总是更好?
即使是引用同一对象的两行代码,写额外的行合并并结束是否总是更快 例如:Excel 在VBA中,使用With、End With是否总是更好?,excel,vba,Excel,Vba,即使是引用同一对象的两行代码,写额外的行合并并结束是否总是更快 例如: If Target.Column <> 1 Or Target.Row >= 100 Then Exit Sub ? 我测试行号和列号的顺序有关系吗?首先,当然行数越多速度就越快,很多。在这种情况下,你不会看到和感觉到任何不同,但至少你会养成一个习惯,总是这样开始 我不确定>99和=>100的情况,但我认为in=>100选项代码在两个条件下工作-花费的时间更多 在VBA中,在您的情况下,无论哪种情况是第
If Target.Column <> 1 Or Target.Row >= 100 Then Exit Sub
?
我测试行号和列号的顺序有关系吗?首先,当然行数越多速度就越快,很多。在这种情况下,你不会看到和感觉到任何不同,但至少你会养成一个习惯,总是这样开始 我不确定>99和=>100的情况,但我认为in=>100选项代码在两个条件下工作-花费的时间更多 在VBA中,在您的情况下,无论哪种情况是第一位的。VBA正在检查这两个条件,即使第一个条件为真。这种差异会产生如下代码:
With Target
If .Column <> 1 Then Exit Sub
If .Row >= 100 then exit sub
End With
带目标的
如果是第1列,则退出Sub
如果.Row>=100,则退出sub
以
在这种情况下,顺序会产生影响,始终将更可能的情况放在第一位。我已经测试了使用
和的速度,与在每个实例中使用范围
对象的速度相比,使用以下子项:
Sub WithSpeed()
Dim StartTime As Double
Dim SecondsElapsed As Double
Dim av As Double
Dim Target As Range
Dim i As Long, j As Long
'Remember time when macro starts
StartTime = Timer
Set Target = Sheet1.Cells(1, 1)
For j = 1 To 5
For i = 1 To 1000000
With Target
If .Column <> 1 Or .Row >= 100 Then Exit For
End With
Next i
av = av + Round(Timer - StartTime, 2)
Next j
'Determine how many seconds code took to run
Debug.Print 1, av / 5
End Sub
每个子循环500万次。我对每个sub运行了5次,总共每个sub运行了2500万次循环。在500万次循环之后,sub打印出了100万次循环的平均时间
平均值:
1:2.80秒
2:2.67秒
我坚信这种差异可以忽略不计,可以归因于电脑处理速度的不稳定。
当您开始引用更多行时,这可能很重要,但将与
一起使用不太可能对代码的速度产生很大影响
不过我还是强烈建议使用它,以提高代码可读性并防止键入错误。非常感谢。那么,如果我在两个或更多的场合引用一个对象,那么使用和结束它会更快吗?你的第二点也是有道理的——我不知道如果第一点已经满足,两个陈述都会被检查。是的,正确。我也很惊讶,但不幸的是,这是VBA的工作方式,在那里找到了:-非常好的演讲。不能要求比这更全面的测试。。。!非常感谢你的洞察力。非常感谢,蒂姆。很高兴我能帮忙!:)<代码>当您开始引用更多行时,这可能很重要,但使用With不太可能对代码的速度产生很大影响。
是的,这就是您将开始看到差异的地方:)
>= 100
With Target
If .Column <> 1 Then Exit Sub
If .Row >= 100 then exit sub
End With
Sub WithSpeed()
Dim StartTime As Double
Dim SecondsElapsed As Double
Dim av As Double
Dim Target As Range
Dim i As Long, j As Long
'Remember time when macro starts
StartTime = Timer
Set Target = Sheet1.Cells(1, 1)
For j = 1 To 5
For i = 1 To 1000000
With Target
If .Column <> 1 Or .Row >= 100 Then Exit For
End With
Next i
av = av + Round(Timer - StartTime, 2)
Next j
'Determine how many seconds code took to run
Debug.Print 1, av / 5
End Sub
Sub NoWithSpeed()
Dim StartTime As Double
Dim SecondsElapsed As Double
Dim av As Double
Dim Target As Range
Dim i As Long, j As Long
'Remember time when macro starts
StartTime = Timer
Set Target = Sheet1.Cells(1, 1)
For j = 1 To 5
For i = 1 To 1000000
If Target.Column <> 1 Or Target.Row >= 100 Then Exit For
Next i
av = av + Round(Timer - StartTime, 2)
Next j
'Determine how many seconds code took to run
Debug.Print 2, av / 5
End Sub