Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/196: Рейтинг темы: голосов - 196, средняя оценка - 4.70
16 / 16 / 0
Регистрация: 10.09.2012
Сообщений: 113
1

Управление ошибками в VBA. Операторы On Error, Resume, объект Err

17.12.2012, 16:13. Показов 35501. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Информация из интернета:

Ошибки в VBA можно разделить:
Кликните здесь для просмотра всего текста

Возбуждение ошибки может быть сделано самой операционной системой (VBA) или исполняемой процедурой(почти все они классифицированы и каждая из них однозначно идентифицируется своим номером).

Собственные или пользовательские ошибки, возбуждение которых предусматривает программист,например, при работе с объектом пользовательского класса .

При возбуждении ошибки (внутренней или пользовательской), в момент возбуждения ошибки заполняются свойства объекта Err,
так что он содержит всю информацию о последней возникшей ошибке.

Синтаксически охраняемый блок окружен специальными операторами On Error.

Обработчик ошибок, как правило, завершается специальным оператором Resume, который задает точку в процедуре, которой передается управление после завершения обработки ошибки.

Схема процедуры с тремя охраняемыми блоками (разные варианты обработки ошибок):

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Sub ProcWithErrors()
        'Первый охраняемый блок
                On Error GoTo ErrHadler1        ' подключение 1-го обработчика ошибок
                        ' Первая часть процедуры, которая может вызвать ошибку.
                        ...
                On Error GoTo 0 отключение 1-го обработчика ошибок
 
        'Второй охраняемый блок
                On Error GoTo ErrHadler2        ' подключение 2-го обработчика ошибок
                        ' Вторая часть процедуры, которая может вызвать ошибку.
                        ...
                On Error GoTo 0 отключение 2-го обработчика ошибок
 
        'Третий охраняемый блок
                On Error GoTo ErrHadler3        ' подключение 3-го обработчика ошибок
                        ' Третья часть процедуры, которая может вызвать ошибку.
                        ...
                On Error GoTo 0 отключение 3-го обработчика ошибок
 
                RepeatPoint:            ' точка, с которой возобновляется выполнение
                        'после обработки ошибки в 3-ей части
                        ...
 
                Exit Sub                'выход из процедуры при отсутствии ошибок
                'ОбработкаОшибок:
                ErrHandler1:    
                        ' 1-ый обработчик ошибок
                        ...
                        Resume  'возврат к оператору, вызвавшему ошибку в 1-ой части
 
                ErrHandler2:    
                        ' 2-ой обработчик ошибок
                        ...
                        Resume Next     'переход к оператору, следующему за оператором 
                        'вызвавшим ошибку во 2-ой части
 
                ErrHandler3:    
                        ' 3-ий обработчик ошибок
                        ...
                        Resume RepeatPoint      'переход к строке, с которой возобновляется
                        'выполнение после обработки ошибки в 3-ей части
End Sub


Варианты комбинаций операторов On Error и Resume:

Кликните здесь для просмотра всего текста

On Error GoTo строка;
On Error Resume Next;
On Error GoTo 0;
On Error Resume (или On Error Resume (0) )


On Error GoTo строка - управление покидает охраняемый блок и передается на указанную строку, запуская, тем самым, обработчик ошибок, начинающийся в этой строке.

On Error Resume Next - такая ситуация разумна, когда вслед за оператором, при выполнении которого потенциально возможна ошибка,помещается оператор, анализирующий объект Err.

On Error GoTo 0 -он завершает охраняемый блок. Оператор можно опускать, если охраняемый блок завершается вместе с самой процедурой.

On Error Resume (или On Error Resume (0) ) - выполнение программы продолжается с повторного выполнения оператора, вызвавшего ошибку.
Используется,например, когда ошибка вызвана вводом неверных данных пользователем, а в обработчике ошибок у него запрашиваются новые правильные данные.



Объект Err

Кликните здесь для просмотра всего текста

Объект Err содержит информацию о последней ошибке выполнения.
Объект Err создается системой вместе с проектом.
Очистка объекта Err может производиться принудительно (использование метода Clear): Err.Clear

Автоматическая очистка свойств объекта Err происходит также при выполнении операторов:

оператора Resume любого вида;
Exit Sub, Exit Function, Exit Property ;
оператора On Error любого вида.
4
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2012, 16:13
Ответы с готовыми решениями:

On Error Resume Next
Подскажите как сделать чтобы при нажатии кнопки, если указанный файл есть то он открывает, если нет...

On Error Resume Next
Доброго дня... В поле на форме вводится Имя листа При нажатии на кнопку вставляется лист с таким...

Cpu fan error press f1 to resume
Первый раз cpu fan error press f1 to resume появилась, еще пол года назад, тогда болт откулера...

Вызов отчета из формы (On error resume next)
Из формы вызывается отчет. При отсутствии данных для печати в процедуре обработки события отчета...

9
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
17.12.2012, 16:59 2
Maxsss, сложным языком написано. Думаю, что специалисты и так знают, как работать с ошибками, а для новичков эта тема ничем не легче для восприятия, чем информация, которая есть, наверное, в любом справочнике по VBA на русском языке.
0
Апострофф
17.12.2012, 18:00
  #3

Не по теме:

Скрипт, да ладно придираться.
Зато будет куда посылать новичков:)

2
16 / 16 / 0
Регистрация: 10.09.2012
Сообщений: 113
17.12.2012, 18:00  [ТС] 4
Скрипт,
просто хотелось подитожить предыдущую дискуссию об ошибках.
Но т.к. изначально ТА тема касалась другого, я и вынес "подитог" в отдельную тему.
А если у кого-то возникнет вопрос, его же всегда можно задать в этой теме - кто-нибудь ответит.

По поводу справочников по VBA на русском (полноценных, как встроенная справка по VBA) :
не подскажешь, где их можно найти - я не встречал.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
17.12.2012, 18:44 5
Maxsss, в этой теме я про справочники упомянул в отношении обработок ошибок - в каждом справочнике по VBA, я думаю, есть раздел про работу с ошибками.

Не знаю, какой справочник хороший. Я через форумы и гугл VBA изучал. В справочники очень редко заглядывал.
1
0 / 0 / 0
Регистрация: 01.06.2015
Сообщений: 1
10.06.2016, 09:16 6
Скрипт, я далеко не профессионал, пользуюсь очень редко для расширения возможностей экселя и доп. взаимодействия. Для меня данная статья оказалось очень полезной!
0
3 / 3 / 0
Регистрация: 26.07.2019
Сообщений: 34
31.07.2019, 22:34 7
Столкнулся с ошибкой Application.VLookup Error 2042 (Н/Д).
Не получается осуществить логику: Если при x = 1, Впр(х)= ошибка, то x=x+1 возвращаюсь к ВПР(х) и т.д. (х = 3,4......)
Подскажите, как это правильно прописать
0
89 / 49 / 18
Регистрация: 03.06.2019
Сообщений: 187
31.07.2019, 23:35 8
Логика в цикле, примерно так:
Visual Basic
1
2
3
4
5
For x=1 To 10
On Error GoTo Er1
    ВПР(х,диапазон,столб,0)
Er1:
Next x
0
3 / 3 / 0
Регистрация: 26.07.2019
Сообщений: 34
01.08.2019, 00:44 9
Цитата Сообщение от Igor_61 Посмотреть сообщение
Логика в цикле, примерно так:
Visual Basic
1
2
3
4
5
For x=1 To 10
On Error GoTo Er1
    ВПР(х,диапазон,столб,0)
Er1:
Next x
Не выходит, как я понял error это когда макрос не может продолжить свою работу из-за ошибки, но с ошибкой н/д макрос продолжает свою работу до тех пор пока с впр(х) не будут производится действия
Вот если y =впр(х) /1 то тогда срабатывает появляется ошибка 13, с которой можно продолжить работу по этой логике , но такой вариант слишком громоздкий
Visual Basic
1
2
3
4
5
6
7
8
For x=1 To 10
On Error GoTo Er1
ВПР(х,диапазон,столб,0) 
Y = впр(х) /1
Er1:
Next  х
впр(х) 
Resume er1 ' нужна ли эта строчка?
0
89 / 49 / 18
Регистрация: 03.06.2019
Сообщений: 187
01.08.2019, 08:18 10
Автоматическая очистка свойств объекта Err происходит также при выполнении операторов:
оператора Resume любого вида;
Exit Sub, Exit Function, Exit Property ;
оператора On Error любого вида.
поэтому решать Вам, нужна или нет, т.к. только Вам известна конечная задача и то, где и с чем будет работать этот кусочек кода.Наверное это (или Err.Clear) лучше поместить перед "Next x", а может и вообще не нужно. А насчет "громоздкий" - не знаю, по-моему, если нормально работает, то пусть и работает. ИМХО
0
01.08.2019, 08:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2019, 08:18
Помогаю со студенческими работами здесь

Когда имеет смысл ставить "on Error Resume Next"
Доброго дня разработчикам! Как известно, у нормального лотусного программиста функция выглядит...

On Error Resume Next только для ограниченного набора строк
Есть макрос, который сталкивается со множеством неожиданностей, и выбрасывает ошибки тут и там. От...

Есть ли в ASP аналог команды VB6 - On Error Resume Next?
Имеется блок кода из нескольких сотен строк. Необходимо, при возникновении в этом коде ошибки,...

При загрузки вылазиет CPU fan error Resume press F1
При загрузки вылазиет Cpu fan error Resume press F1 понятно проблема свинтелятором. Делаеш...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru