With ... End With ускоряет код, и тем больше, чем больше вложенных объектов (в виде разделительных точек) охватывает, и чем более медленный доступ к этим объектам.
Вот чисто тестовый, но наглядный пример для сравнения:
Код |
---|
Sub Test1()
Const N = 100000
Dim i&, t!, x
t = Timer
For i = 1 To N
x = ActiveSheet.Cells.SpecialCells(xlCellTypeVisible).Areas.Count
Next
Debug.Print Timer - t
End Sub
Sub Test2()
Const N = 100000
Dim i&, t!, x
t = Timer
With ActiveSheet.Cells.SpecialCells(xlCellTypeVisible).Areas
For i = 1 To N
x = .Count
Next
End With
Debug.Print Timer - t
End Sub |
Отличие в скорости - в 100 раз.
Указатель, на который ссылается With, записывается в стековый регистр процессора, доступ к которому очень быстрый. Но по этой же причине не рекомендуется из With ... End With выходить принудительно по GoTo, так как указатель на объект остается в стеке, а сам объект не удаляется из памяти, т.е. образуется утечка памяти.