VBA Про помилку - Помилки при обробці кращих практик

Чит -лист про помилки 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.ЗапитЗакінчити зФункція виходузакінчення:КінецьФункція завершення
wave wave wave wave wave