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

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

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

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

Ошибки в 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
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 появилась, еще пол года назад, тогда болт откулера раскрутилься, неделю назад опять появилась...

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

Не по теме:

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

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

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

Не знаю, какой справочник хороший. Я через форумы и гугл VBA изучал. В справочники очень редко заглядывал.
1
0 / 0 / 0
Регистрация: 01.06.2015
Сообщений: 1
10.06.2016, 09:16
Скрипт, я далеко не профессионал, пользуюсь очень редко для расширения возможностей экселя и доп. взаимодействия. Для меня данная статья оказалось очень полезной!
0
3 / 3 / 0
Регистрация: 26.07.2019
Сообщений: 34
31.07.2019, 22:34
Столкнулся с ошибкой Application.VLookup Error 2042 (Н/Д).
Не получается осуществить логику: Если при x = 1, Впр(х)= ошибка, то x=x+1 возвращаюсь к ВПР(х) и т.д. (х = 3,4......)
Подскажите, как это правильно прописать
0
89 / 49 / 18
Регистрация: 03.06.2019
Сообщений: 187
31.07.2019, 23:35
Логика в цикле, примерно так:
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
Цитата Сообщение от 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
Автоматическая очистка свойств объекта Err происходит также при выполнении операторов:
оператора Resume любого вида;
Exit Sub, Exit Function, Exit Property ;
оператора On Error любого вида.
поэтому решать Вам, нужна или нет, т.к. только Вам известна конечная задача и то, где и с чем будет работать этот кусочек кода.Наверное это (или Err.Clear) лучше поместить перед "Next x", а может и вообще не нужно. А насчет "громоздкий" - не знаю, по-моему, если нормально работает, то пусть и работает. ИМХО
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.08.2019, 08:18
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru