На главную Напишите нам! Напишите нам!
23-04-2024
колонтитул в word 2007, 0000002111

Прерывание процедур и функций VBA.

Иногда встречаются обстоятельства, при которых нет смысла продолжать выполнение процедуры или функции. VBA имеет операторы Exit и End, которые дают возможность либо завершать процедуру или функцию, либо останавливать всю программу.

Оператор Exit

Для того, чтобы процедура или функция прекратила выполнение, используется одна из двух доступных форм VBA-оператора Exit, в зависимости от того, необходимо ли завершить функцию или процедуру:

Exit Sub Exit Function

Перепишем немного листинг учебной программы, который использовался на позапрошлом уроке:

Здесь содержится код проверки того, была ли выбрана пользователем в окне ввода кнопка "Отмена". Если это так - программа выдает сообщение о том, что не был введен возраст, и прекращает выполнение кода оператором Exit Sub.

Оператор Exit Sub приводит к тому, что VBA немедленно прекращает выполнение кода процедуры. После выполнения этого оператора VBA прекращает выполнение текущей процедуры и возвращается к выполнению той процедуры или функции, которая вызвала процедуру, содержащую оператор Exit Sub.

Оператор End

Для полного завершения выполнения программы используется ключевое слово End в отдельной строке:

End

При выполнении этого оператора VBA прекращает все выполнение операторов процедуры и функции. Любые имеющиеся переменные перестают существовать и их значения теряются.

Т.к. программа полностью прерывается, необходимо перед оператором End выводить пользователю сообщение о том, что будет происходить и почему. В противном случае пользователи вашей процедуры могут не понять, почему процедура или программа, которую они используют, внезапно прекратила работу. Если программа перестанет выполняться вследствие какого-либо действия пользователя, такого как отмена окна ввода, без объяснения, пользователь процедуры может никогда не узнать, почему процедура заканчивается.

Также не следует забывать закрывать рабочие книги или выполнять другие сервисные работы перед выполнением оператора End, чтобы пользователю программы не приходилось доделывать незаконченные операции.

Специальный оператор On Error

Для обработки ошибок в VBA и VB есть специальный оператор On Error. Его задача при возникновении ошибки передать управление в то место( процедура или кусок кода), в котором это ждут. Посмотрим пример:

Sub Test()
	On Error GoTo Errors1
	Dim x As Integer
	Dim a As Integer
	Dim c As Double
	x = 20
	a = 0
	c = x / a
	MsgBox (" Этого не должно быть")
	GoTo Ends:
Errors1:
	MsgBox ("Ну ты блин Тикурила Даещь")
Ends:
End Sub

В данном примере при возникновении ошибки управление передается по метке Errors1 и дальше выполняется код. Я понимаю, что прерывать функцию из-за ошибки не всегда надо. И не только я так думаю, создатели VBA тоже так считали, и поэтому есть оператор Resume Next. Этот оператор реализует небезызвестный принцип - Ни шагу назад. Выполнение пойдет дальше, несмотря на ошибку.

Sub Test()
	On Error GoTo Errors1
	Dim x As Integer
	Dim a As Integer
	Dim c As Double
	x = 20
	a = 0
	c = x / a
	MsgBox ("Опаньки !!!")
	GoTo Ends:
Errors1:
	MsgBox ("Ну ты блин Тикурила Даещь")
	Resume Next
Ends:
End Sub

А вот, если Вы вообще не хотите ничего говорить по поводу ошибки, то можете поступить очень сурово. Вот так. Я рекомендую применять это для бухгалтерских расчетов. Ни кто и не догадается :-)))

Sub Test()
	On Error GoTo Errors1
	Dim x As Integer
	Dim a As Integer
	Dim c As Double
	x = 20
	a = 0
	c = x / a
	MsgBox ("Опаньки !!!")
	GoTo Ends:
Errors1:
	MsgBox ("Ну ты блин Тикурила Даещь")
	Resume Next
Ends:
End Sub

Над резюме можно немного поэкспериментировать, вот возможные описания:

Resume Next
Resune строка
Resume метка
Resume 0

Пример ниже будет упорно требовать, чтобы ввели число отличное от 0:

Sub Test()
	On Error GoTo Error1
	Dim x As Integer
	Dim a As Integer
	Dim c As Double
	x = 20
	a = Str(InputBox("введите число"))
	c = x / a
	x = 10
	MsgBox ("Опаньки !!!")
	GoTo Ends:
Error1:
	MsgBox ("думай о программировании, а не о женщинах")
	a = Str(InputBox("введите число"))
	Resume 0
Ends:
End Sub
колонтитулы в word 2007, 000000211111

Добавить в Мой Мир  Добавить в ВКонтакте.ру  Добавить в Facebook  Добавить в LiveJournal  Добавить в twitter

колонтитулы в word 2007, 000000211
нумерация страниц в word 2007, 00000021111
Яндекс.Метрика
Копирование возможно при указании прямой индексируемой гиперссылки
п»ї
0000002