Имеется пяток макросов в книге. В большинстве случаев они выполняются последовательно и постоянно, поэтому был собран "Мастер Саб" вида:
Код
Sub Master()
Call 1
Call 2
Call 3
Call 4
End Sub
Подскажите пожалуйста как можно остановить дальнейшее выполнение данной последовательности вызовов при наличии ошибки в любом из модулей? Проверка на ошибки осуществляется данным кодом и останавлиется "Exit Sub" при нахождении ошибки.
Либо делать из процедур(Sub) функции(Function) с присвоением им True в конце работы если работа завершилась без ошибок и False если с ошибками. Или создавать переменную-флаг, которой назначать значение по такому же принципу. Примерный код решения по варианту 1:
Код
Sub Master()
If Macro1 = false then Exit Sub 'тоже самое с остальными
Call 2
Call 3
Call 4
End Sub
Function Macro1()
Dim c As Range
For Each c In Selection
If IsError(c.Value2) Then c.Select: MsgBox "Err", 16, "": Exit Function
Next c
MsgBox "OK", 64, ""
Macro1 = true
End Function
Примерный код решения по варианту 2:
Код
Public IsErr as boolean
IsErr = False
Sub Master()
Call Macro1
If IsErr = True then Exit Sub 'тоже самое с остальными
Call 2
Call 3
Call 4
End Sub
Sub Macro1()
Dim c As Range
For Each c In Selection
If IsError(c.Value2) Then c.Select: MsgBox "Err", 16, "": IsErr = True: Exit Sub
Next c
MsgBox "OK", 64, ""
Macro1 = true
End Sub
И третий вариант: во всех вызываемых процедурах, при возникновении ошибки выход делать не по Exit Sub, а просто End:
Код
Sub Macro1()
Dim c As Range
For Each c In Selection
If IsError(c.Value2) Then c.Select: MsgBox "Err", 16, "": End
Next c
MsgBox "OK", 64, ""
Macro1 = true
End Sub
Но здесь следует помнить, что при вызове ключевого End сбрасывается весь проект: формы, макросы, глобальные переменные.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Валерий Кишин: как можно остановить дальнейшее выполнение
почти всегда использую вариант 1 от Дмитрия (The_Prist) Щербакова — если ы процедуре что-то может пойти не так, то нужно всегда делать из неё функцию и проверять возвращаемое значение. Единственное, что мог бы добавить к этому варианту: я за то, чтобы функции всё-таки в таком случае правильно присвоить булевый тип Function Macro1()As Boolean (хотя и так сработает - я проверил)
Можно, конечно, ещё объявить глобальную переменную для индикации ошибок проекта и проверять её — в таком случае можно оставить процедуру, но такая проверка на ошибку, это +1 строка кода к каждому вызову (или удлинение строки с использованием ":" вместо новой строки) UPD: про глобальную переменную - это вариант №2 от Дмитрия (The_Prist) Щербакова, оказывается
Дмитрий(The_Prist) Щербаков, приветствую! Про End как-то то ли не знал, то ли забыл — сбрасывал переменные через Reset Он, конечно, не отменяет всё, как End (и, обычно, это удобнее), но, иногда, End может быть удобнее — Спасибо!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄