Чит -лист про помилки VBA
Помилки
ОписКод VBAПомилка увімкнення - код зупинки та помилка відображенняУ разі помилки Перейдіть до 0Помилка при увімкненні - пропустити помилку та продовжити роботуУвімкнути Помилка Відновити ДаліПомилка при увімкненні - перейдіть до рядка коду [Мітка]Помилка Перейти до [Мітка]Очищає (скидає) помилкуПомилка GoTo -1Показати номер помилкиНомер помилки MsgBoxПоказати опис помилкиОпис помилки MsgBoxФункція генерування власної помилкиПомилка ПіднятисяДивіться більше "шпаргалки" VBA та безкоштовне завантаження PDF
Обробка помилок VBA
Обробка помилок VBA відноситься до процесу передбачення, виявлення та усунення помилок під час виконання VBA. Процес обробки помилок VBA відбувається під час написання коду, перш ніж дійсно виникнуть будь -які помилки.
Помилки під час виконання VBA - це помилки, що виникають під час виконання коду. Приклади помилок під час виконання:
- Посилання на неіснуючу книгу, аркуш чи інший об’єкт
- Недійсні дані, напр. посилання на комірку Excel, що містить помилку
- Спроба поділу на нуль
VBA щодо заяви про помилку
Більшість обробок помилок VBA виконується за допомогою Про заяву про помилку. Оператор On Error повідомляє VBA, що робити, якщо він виявив помилку. Є три Про заяви про помилки:
- Помилка Перейти до 0
- Увімкнути Помилка Відновити Далі
- Про помилку GoTo Лінія
Помилка Перейти до 0
Помилка Перейти до 0 - це налаштування за замовчуванням VBA. Ви можете відновити це налаштування за замовчуванням, додавши наступний рядок коду:
1 | Помилка Перейти до 0 |
Коли виникає помилка з Помилка Перейти до 0, VBA припинить виконання коду та відобразить стандартне вікно повідомлення про помилку.
Часто ви додаєте Помилка Перейти до 0 після додавання Увімкнути Помилка Відновити Далі обробка помилок (наступний розділ):
123456789 | Sub ErrorGoTo0 ()Увімкнути Помилка Відновити ДаліActiveSheet.Shapes ("Start_Button"). ВидалитиПомилка Перейти до 0"Запустіть додатковий кодEnd Sub |
Увімкнути Помилка Відновити Далі
Увімкнути Помилка Відновити Далі повідомляє VBA пропустити будь -які рядки коду, що містять помилки, і перейти до наступного рядка.
1 | Увімкнути Помилка Відновити Далі |
Примітка: Увімкнути Помилка Відновити Далі не виправляє помилку або не вирішує її іншим чином. Він просто повідомляє VBA діяти так, ніби рядка коду, що містить помилку, не існує. Неправильне використання Увімкнути Помилка Відновити Далі може призвести до непередбачених наслідків.
Чудовий час для використання Увімкнути Помилка Відновити Далі - це робота з об’єктами, які можуть існувати, а можуть і не існувати. Наприклад, ви хочете написати код, який видалить фігуру, але якщо ви запустите код, коли фігуру вже видалено, VBA видасть помилку. Замість цього можна використовувати Увімкнути Помилка Відновити Далі повідомити VBA видалити форму, якщо вона існує.
123 | Увімкнути Помилка Відновити ДаліActiveSheet.Shapes ("Start_Button"). ВидалитиПомилка Перейти до 0 |
Зверніть увагу, що ми додали Помилка Перейти до 0 після рядка коду, що містить потенційну помилку. Це скидає обробку помилок.
У наступному розділі ми покажемо вам, як перевірити, чи сталася помилка під час використання Ер. Номер, надаючи вам більш розширені параметри обробки помилок …
Err.Number, Err.Clear та Catching Errors
Замість того, щоб просто пропускати рядок, що містить помилку, ми можемо впіймати помилку за допомогою Увімкнути Помилка Відновити Далі та Ер. Номер.
Ер. Номер повертає номер помилки, що відповідає типу виявленої помилки. Якщо помилки немає, Ер. Номер = 0.
Наприклад, ця процедура поверне "11", оскільки помилка, що виникає, така Помилка під час виконання "11".
1234567 | Sub ErrorNumber_ex ()Увімкнути Помилка Відновити ДаліActiveCell.Value = 2/0Номер помилки MsgBoxEnd Sub |
Обробка помилок з Err.Number
Справжня сила Росії Ер. Номер полягає у здатності виявляти помилку (Ер. Номер 0). У наведеному нижче прикладі ми створили функцію, яка перевірятиме наявність аркуша за допомогою Err.Number.
12345678910111213141516171819 | Sub TestWS ()MsgBox DoesWSExist ("тест")End SubФункція Чи WSExist (wsName As String) як булеваЗатемнити як робочий аркушУвімкнути Помилка Відновити ДаліВстановити ws = Аркуші (wsName)'Якщо помилка WS не існуєЯкщо Err.Number 0 ТодіDoesWSExist = FalseІнакшеЧиWSExist = ПравдаЗакінчити ЯкщоПомилка GoTo -1Функція завершення |
Примітка: Ми додали Помилка GoTo -1 до кінця, що скидає Err.Number до 0 (див. два розділи нижче).
З Увімкнути Помилка Відновити Далі та Ер. Номер, можна копіювати «Спробуй» і «Впіймай» функціональність інших мов програмування.
Про помилку GoTo Лінія
Про помилку GoTo Лінія повідомляє VBA "перейти" до позначеного рядка коду при виявленні помилки. Ви оголошуєте оператор Go To таким чином (де errHandler - це мітка рядка, на яку потрібно перейти):
1 | Про помилку Перейти до errHandler |
і створіть мітку рядка таким чином:
1 | errHandler: |
Примітка. Це та сама мітка, яку ви використовуєте зі звичайною інструкцією VBA GoTo.
Нижче ми продемонструємо використання Про помилку GoTo Лінія щоб вийти з процедури.
Увімкнути помилку Вийти з підп
Ви можете використовувати On Error GoTo Line, щоб вийти з підрозділу, коли виникає помилка.
Ви можете зробити це, розмістивши мітку рядка обробника помилок в кінці процедури:
12345678 | Sub ErrGoToEnd ()Про помилку Перейти до endProc"Якийсь кодексendProc:End Sub |
або за допомогою команди Exit Sub:
123456789101112131415 | Sub ErrGoToEnd ()Про помилку Перейти до endProc"Якийсь кодексПерейти до skipExitendProc:Вийти з підпskipExit:- Ще трохи кодуEnd Sub |
Err.Clear, On Error GoTo -1 та Resetting Err.Number
Після усунення помилки, як правило, слід видалити її, щоб запобігти майбутнім проблемам з обробкою помилок.
Після виникнення помилки, обидва Помилка. Ясно та Помилка GoTo -1 можна використовувати для скидання налаштувань Ер. Номер до 0. Але є одна дуже важлива відмінність: Помилка. Ясно не скидає фактичну помилку, а лише скидає Ер. Номер.
Що це означає? ВикористанняПомилка. Ясно, Ви не зможете змінити налаштування обробки помилок. Щоб побачити різницю, протестуйте цей код і замініть його Помилка GoTo -1 з Помилка. Ясно:
123456789101112131415161718192021 | Sub ErrExamples ()Про помилку Перейти до errHandler:Помилка "Визначається додатком"Помилка (13)Вийти з підпerrHandler:'Очистити помилкуПомилка GoTo -1Про помилку Перейти до errHandler2:Помилка "Невідповідність типу"Помилка (1034)Вийти з підпerrHandler2:Debug.Print Err.ОписEnd Sub |
Як правило, я рекомендую завжди використовувати Помилка GoTo -1, якщо у вас немає вагомих причин для використання Помилка. Ясно замість цього.
VBA про помилку MsgBox
Ви також можете відобразити вікно повідомлень про помилку. У цьому прикладі відображатимуться різні вікна повідомлень залежно від місця помилки:
12345678910111213141516171819202122232425262728 | Sub ErrorMessageEx ()Dim errMsg As StringПро помилку Перейти до errHandler'Етап 1errMsg = "Помилка сталася на етапі копіювання та вставки."'Помилка підняття (11)'Етап 2errMsg = "Помилка сталася на етапі перевірки даних."'Помилка підняття (11)'Етап 3errMsg = "Помилка сталася під час етапу побудови P&L та копіювання."Підняти помилку (11)'Етап 4errMsg = "Під час спроби зареєструвати імпорт на сторінці налаштування сталася помилка"'Помилка підняття (11)Перейти до endProcerrHandler:MsgBox errendProc:End Sub |
Тут ви б замінили Err.Raise (11) вашим фактичним кодом.
VBA IsError
Інший спосіб впоратися з помилками - перевірити їх за допомогою функції VBA IsError. Функція IsError перевіряє вираз на помилки, повертаючи TRUE або FALSE, якщо виникає помилка.
123 | Sub IsErrorEx ()MsgBox IsErrror (Діапазон ("a7"). Значення)End Sub |
Якщо помилка VBA
Ви також можете обробляти помилки у VBA за допомогою функції IfError Excel. До функції IfError потрібно отримати доступ за допомогою Клас функцій:
1234567 | Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Діапазон ("a10"). Значення, 0)MsgBox nEnd Sub |
Це виведе значення діапазону A10, якщо значення є помилкою, замість нього буде виведено 0.
Типи помилок VBA
Помилки під час виконання
Як зазначено вище:
Помилки під час виконання VBA - це помилки, що виникають під час виконання коду. Приклади помилок під час виконання:
- Посилання на неіснуючу книгу, аркуш чи інший об’єкт
- Недійсні дані, напр. посилання на комірку Excel, що містить помилку
- Спроба поділу на нуль
Ви можете "обробляти помилки" помилок під час виконання, використовуючи методи, розглянуті вище.
Синтаксичні помилки
Помилки синтаксису VBA є помилки при написанні коду. Приклади синтаксичних помилок:
- Орфографія
- Пропущені або неправильні розділові знаки
Редактор VBA визначає багато синтаксичних помилок з червоним виділенням:
У редакторі VBA також є опція «Автоматична перевірка синтаксису»:
Якщо цей прапорець встановлено, редактор VBA генерує вікно повідомлення з попередженням про синтаксичні помилки після введення рядка коду:
Я особисто вважаю це надзвичайно дратівливим і вимикаю цю функцію.
Помилки компіляції
Перш ніж спробувати запустити процедуру, VBA «компілює» процедуру. Компіляція перетворює програму з вихідного коду (який ви можете побачити) у виконувану форму (ви не бачите).
Помилки компіляції VBA - це помилки, які перешкоджають компіляції коду.
Хорошим прикладом помилки компіляції є відсутність оголошення змінної:
Інші приклади включають:
- За без Далі
- Виберіть без Кінець Виберіть
- Якщо без Закінчити Якщо
- Виклик а процедуру що не існує
Синтаксичні помилки (попередній розділ) є підмножиною помилок компіляції.
Налагодження> Скомпілювати
Помилки компіляції з'являться під час спроби запустити процедуру. Але в ідеалі ви б виявили помилки компіляції перед спробою запустити процедуру.
Ви можете зробити це, склавши проект завчасно. Для цього перейдіть до Налагодження> Скомпілювати проект VBA.
Компілятор "перейде" до першої помилки. Як тільки ви виправите цю помилку, скомпілюйте проект ще раз. Повторюйте, поки всі помилки не будуть виправлені.
Ви можете сказати, що всі помилки виправлені, тому що Скомпілювати проект VBA буде сірим:
Помилка переповнення
The Помилка переповнення VBA виникає, коли ви намагаєтесь додати значення до занадто великої змінної. Наприклад, Цілі змінні може містити лише значення від -32,768 до 32,768. Якщо ви введете більше значення, ви отримаєте помилку переповнення:
Замість цього вам слід використовувати Довга змінна щоб зберегти більшу кількість.
Інші умови помилок VBA
Помилка лову VBA
На відміну від інших мов програмування, у VBA немає Заява про вилов. Тим не менш, ви можете відтворити оператор уловлювання за допомогою Увімкнути Помилка Відновити Далі та Якщо Err.Number 0 Тоді. Про це йдеться вище у розділі Обробка помилок за допомогою Err.Number.
Помилка ігнорування VBA
Щоб ігнорувати помилки у VBA, просто скористайтеся Увімкнути Помилка Відновити Далі заява:
1 | Увімкнути Помилка Відновити Далі |
Однак, як згадувалося вище, ви повинні бути обережними у використанні цього твердження, оскільки воно не виправляє помилку, а просто ігнорує рядок коду, що містить помилку.
Помилка кидання VBA / Err.Raise
Щоб через помилку у VBA, ви використовуєте Помилка Піднятися метод.
Цей рядок коду призведе до помилки під час виконання "13": Невідповідність типу:
1 | Підняти помилку (13) |
Перехоплення помилок VBA
Перехоплення помилок VBA це просто ще один термін для обробки помилок VBA.
Повідомлення про помилку VBA
А. Повідомлення про помилку VBA виглядає так:
Натиснувши «Налагодження», ви побачите рядок коду, який видає помилку:
Обробка помилок VBA в циклі
Найкращий спосіб обробки помилок у циклі - це використання Увімкнути Помилка Відновити Далі разом з Ер. Номер щоб визначити, чи сталася помилка (Не забудьте використовувати Помилка. Ясно для видалення помилки після кожного випадку).
У наведеному нижче прикладі буде розділено два числа (стовпець А на стовпець В) і виведе результат у стовпець С. Якщо є помилка, результат буде 0.
12345678910111213141516 | Підтест ()Яскрава клітинка як діапазонУвімкнути Помилка Відновити ДаліДля кожної клітинки в діапазоні ("a1: a10")'Встановити значення клітинкиcell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value'Якщо Cell.Value є помилкою, то за замовчуванням до 0Якщо Err.Number 0 Тодізміщення (0, 2). Значення = 0Помилка. ЯсноЗакінчити ЯкщоДаліEnd Sub |
Обробка помилок VBA в Access
Усі наведені вище приклади працюють точно так само в Access VBA, як і в Excel VBA.
123456789101112131415161718 | Функція DelRecord (frm як форма)'Ця функція використовується для видалення запису у таблиці з формиПомилка Помилка завершення роботиЗ фрЯкщо .NewRecord Тоді.ВідмінитиФункція виходуЗакінчити ЯкщоЗакінчити зЗ frm.RecordsetClone.Закладка = frm.Закладка.Видалитиfrm.ЗапитЗакінчити зФункція виходузакінчення:КінецьФункція завершення |