В VBA иногда мы хотим выйти из программы после того, как некоторое условие станет истинным. Но нужно ли использовать end
или exit sub
?
Это немного выходит за рамки вашего вопроса, но чтобы избежать возможной путаницы для читателей, которые являются новичками в VBA: End
и End Sub
- это не одно и то же. Они не выполняют одну и ту же задачу.
End
останавливает выполнение ВСЕГО кода, и вы почти всегда должны использовать Exit Sub
(или Exit Function
, соответственно).
End останавливает ВСЕ выполнение. Хотя это звучит заманчиво, это также очищает все глобальные и статические переменные. (источник)
См. также MSDN dox для End Statement.
При выполнении оператор
End
сбрасывает все переменные уровня модуля и все статические локальные переменные во всех модулях. Чтобы сохранить значение этих переменных, используйте вместо этого операторStop
. Затем вы можете возобновить выполнение, сохранив значение этих переменных.
Примечание Оператор
End
резко останавливает выполнение кода, не вызывая события Unload, QueryUnload, Terminate или любой другой код Visual Basic. Код, который вы поместили в события Unload, QueryUnload и Terminate модулей форм и классов, не выполняется. Объекты, созданные из модулей классов, уничтожаются, файлы, открытые с помощью оператора Open, закрываются, а память, использованная вашей программой, освобождается. Ссылки на объекты, хранящиеся в других программах, аннулируются.
Также End Sub
и Exit Sub
не одно и то же. End Sub
не может быть вызван так же, как Exit Sub
, потому что компилятор этого не позволяет.
Это снова означает, что вы должны Exit Sub
, что является [совершенно законной операцией] (https://msdn.microsoft.com/en-us/library/t2at9t47.aspx):
Exit Sub. Немедленно завершает процедуру Sub, в которой она появляется. Выполнение продолжается с оператора, следующего за оператором, который вызвало процедуру Sub. Exit Sub можно использовать только внутри процедуры Sub. процедуры.
Кроме того, как только вы поймете, как работают процедуры, очевидно, что End Sub
не очищает никаких глобальных переменных. Но он [очищает локальные (Dim'd) переменные] (https://msdn.microsoft.com/en-us/library/dz1z94ha.aspx):
End Sub Завершает определение этой процедуры.