Страницы: 1
RSS
Остановка последовательности макросов при использовании Call, VBA
 
Добрый день,

Имеется пяток макросов в книге. В большинстве случаев они выполняются последовательно и постоянно, поэтому был собран "Мастер Саб" вида:
Код
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) Щербакова, оказывается  :D

Дмитрий(The_Prist) Щербаков, приветствую!
Про End как-то то ли не знал, то ли забыл — сбрасывал переменные через Reset  :D
Он, конечно, не отменяет всё, как End (и, обычно, это удобнее), но, иногда, End может быть удобнее — Спасибо!  :idea:
Изменено: Jack Famous - 19.10.2021 09:33:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Полезно, информативно, спасибо. Буду думать как реализовать.
 
Если ERR может быть получена автоматом или Err.Raise , а это уже можно обработать в родительском процессе.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх