Страницы: 1
RSS
Прекращение всех процедур в модуле VBA
 
Добрый день! Подскажите, пожалуйста, одну вещь.

Есть макрос, который разбит на три процедуры. Процедуры запускаются отдельной процедурой:

Sub Start()

Call Proc1
Call Proc2
Call Proc3

End Sub

В середине Второй процедуры провожу проверку наличия на листе ошибки #Н/Д. При обнаружении - процедура прекращается. Код там такой:

Set ND = IzbrSvod.Range(Cells(2, ColEnd + 1), Cells(RowEnd ColEnd + 5)).Find("#N/A", , xlValues, xlPart)
If ND Is Nothing Then
Else
MsgBox "Отсутствуют необходимые значения. Программа будет прекращена", vbExclamation, "Внимание!"
Exit Sub
End If

Всё работает нормально, если запускать отдельно процедуру. Если же запускать макрос целиком, то при наличии ошибки далее пойдет выполнение Третьей процедуры.

Как прекратить все процедуры в модуле при наступлении условия ND?
 
вместо
Код
Else
  MsgBox "Отсутствуют необходимые значения. Программа будет прекращена", vbExclamation, "Внимание!"
  Exit Sub
End If

используйте
Код
Else
  MsgBox "Отсутствуют необходимые значения. Программа будет прекращена", vbExclamation, "Внимание!"
  End
End If
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Добрый день alexpet, попробуйте использовать глобальную переменную булевого типа и при нужной вам проверке задать ей True или False, а в последующих процедурах в самом начале делать проверку этой переменной.
P.S. Может ваш кусок кода оформите соответствующим тегом<...>, чтобы было читабельней.
 
Цитата
написал:
вместо
используйте

Спасибо! Как всё оказалось просто.


DANIKOLA Тоже спасибо.
 
alexpet, здравствуйте
Просто завершить все процедуры можно с помощью оператора End, однако, если вы что-то меняли в работе Excel, то это так и останется. К тому же не будет нормального сообщения для пользователя.
Чтобы сделать хорошо, я использую булевые функции вместо процедур и просто проверяю возвращаемое значение. Если False, то выхожу, т.к. внутри функции что-то пошло не так и она уже  вывела сообщение для пользователя.
Пример
Изменено: Jack Famous - 12.08.2022 15:18:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
DANIKOLA написал:
попробуйте использовать глобальную переменную
Цитата
Jack Famous написал:
я использую булевые функции вместо процедур
ну один из аргументов процедуры может содержать код ответа, что также позволит проанализировать выход по ошибке или без ну и конечно  Err.Raise можно применить о обработать в родительской процедуре.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: один из аргументов процедуры может содержать код ответа
результат функции - просто дополнительная информация. Можно её сделать Long и проверять различные результаты возможной работы. Глупо делать процедуру с переменной, в которую может вернуться значение (дополнительное ограничение на переменную: она должна передаваться только ссылкой) вместо того, чтобы сделать функцию, которая этот результат будет просто возвращать, в случае чего.
Но как дополнительный вариант для понимания - конечно пойдёт  :)
Изменено: Jack Famous - 12.08.2022 16:29:48
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Алексей, ну глупо или нет, тут вопрос весьма спорный. Функцию можно назначить на кнопку? А если нужно иметь универсальную, ведь опциональные параметры не отменили, а это значит можно запросить их если не определены и выполнить процедуру, если вызвана из другой процедуры, но с параметрами. Так  что это вопрос творческий. Так что применения могут найти все варианты.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: применения могут найти все варианты
полностью согласен  :)
Под "глупо" я имел ввиду, что метод известен человеку, но, несмотря на это, придумывается велосипед
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх