Обробка помилок Excel VBA - все, що вам потрібно знати!

Незалежно від того, наскільки ви досвідчені у кодуванні VBA, помилки завжди будуть його частиною.

Різниця між початківцем та досвідченим програмістом VBA полягає в тому, що програмісти -експерти вміють ефективно обробляти та використовувати помилки.

У цьому підручнику я покажу вам різні способи ефективного вирішення помилок у Excel VBA.

Перш ніж ми перейдемо до обробки помилок VBA, давайте спочатку розберемося з різними типами помилок, з якими ви, ймовірно, зіткнетеся при програмуванні в Excel VBA.

Типи помилок VBA в Excel

У Excel VBA існує чотири типи помилок:

  1. Синтаксичні помилки
  2. Помилки компіляції
  3. Помилки під час виконання
  4. Логічні помилки

Давайте швидко зрозуміємо, в чому полягають ці помилки, і коли ви з ними зіткнетесь.

Синтаксична помилка

Синтаксична помилка, як випливає з назви, виникає, коли VBA виявляє щось не так із синтаксисом у коді.

Наприклад, якщо ви забудете необхідну частину оператора/синтаксису, ви побачите помилку компіляції.

У наведеному нижче коді, як тільки я натискаю enter після другого рядка, я бачу помилку компіляції. Це тому, що Заява IF потрібно мати "Потім', Якої немає у коді нижче.

Примітка: Коли ви вводите код у Excel VBA, він перевіряє кожне речення, щойно ви натискаєте Enter. Якщо VBA виявляє, що в синтаксисі чогось не вистачає, він миттєво показує повідомлення з деяким текстом, який може допомогти вам зрозуміти відсутні частини.

Щоб переконатися, що ви бачите синтаксичну помилку кожного разу, коли чогось не вистачає, переконайтеся, що перевірка автосинтаксису включена. Для цього натисніть «Інструменти», а потім - «Параметри». У діалоговому вікні параметрів переконайтеся, що опція «Автоматична перевірка синтаксису» увімкнена.

Якщо параметр «Автоматична перевірка синтаксису» вимкнено, VBA все одно виділятиме рядок із синтаксичною помилкою червоним кольором, але не відображатиме діалогове вікно помилки.

Помилка компіляції

Помилки компіляції виникають, коли чогось не вистачає, що необхідно для запуску коду.

Наприклад, у коді нижче, як тільки я спробую запустити код, він покаже таку помилку. Це відбувається, коли я використав оператор IF Then, не закриваючи його обов’язковим «End If».

Синтаксична помилка також є типом помилки компіляції. Синтаксична помилка виникає, як тільки ви натискаєте Enter, і VBA визначає, що чогось не вистачає. Помилка компіляції також може виникати, коли VBA не знаходить нічого, чого не вистачає під час введення коду, але це відбувається під час компіляції або виконання.

VBA перевіряє кожен рядок, коли ви вводите код, і виділяє синтаксичну помилку, як тільки рядок неправильний, і ви натискаєте Enter. Помилки компіляції, з іншого боку, виявляються лише тоді, коли весь код аналізується VBA.

Нижче наведено деякі сценарії, коли ви зіткнетеся з помилкою компіляції:

  1. Використання оператора IF без кінцевого IF
  2. Використовуючи оператор For з Next
  3. Використання оператора Select без використання End Select
  4. Не оголошується змінна (це працює лише тоді, коли ввімкнено параметр Явний)
  5. Виклик суб/функції, яка не існує (або з неправильними параметрами)
Примітка про "Явний варіант": Коли ви додаєте "Option Explicit", вам потрібно буде оголосити всі змінні перед запуском коду. Якщо є будь -яка змінна, яка не була оголошена, VBA покаже помилку. Це хороша практика, оскільки вона показує помилку, якщо у вас є помилка з помилкою. Ви можете прочитати більше про Option Explicit тут.

Помилки часу виконання

Помилки під час виконання - це ті помилки, які виникають під час роботи коду.

Помилки під час виконання будуть виникати лише тоді, коли будуть усунуті всі помилки синтаксису та компіляції.

Наприклад, якщо ви запускаєте код, який має відкрити книгу Excel, але ця книга недоступна (видалена або змінена назва), ваш код видасть помилку під час виконання.

Коли виникає помилка під час виконання, вона зупиняє код і показує діалогове вікно помилки.

Повідомлення в діалоговому вікні "Помилка виконання" є трохи більш корисним. Він намагається пояснити проблему, яка може допомогти вам її виправити.

Якщо натиснути кнопку Налагодження, вона виділить ту частину коду, що призводить до помилки.

Якщо ви виправили помилку, ви можете натиснути кнопку Виконати на панелі інструментів (або натиснути клавішу F5), щоб продовжити виконання коду з того місця, де він залишився.

Або ви також можете натиснути кнопку «Закінчити», щоб вийти з коду.

Важливо: Якщо ви натиснете кнопку "Завершити" у діалоговому вікні, він зупинить код у рядку, у якому він зустрічається. Однак усі рядки коду до цього були б виконані.

Логічні помилки

Логічні помилки не зупинять ваш код, але можуть призвести до неправильних результатів. Це також можуть бути найскладніші типи помилок для усунення несправностей.

Ці помилки не виділяються компілятором і їх потрібно вирішувати вручну.

Одним із прикладів логічної помилки (з якою я часто стикаюся) є біг у нескінченний цикл.

Іншим прикладом може бути, коли він дає неправильний результат. Наприклад, ви можете в кінцевому підсумку використати неправильну змінну в коді або додати дві змінні, де одна неправильна.

Існує кілька способів усунення логічних помилок:

  1. Вставте вікно повідомлень у якесь місце в коді та виділіть значення/дані, які допоможуть зрозуміти, чи все відбувається так, як очікувалося.
  2. Замість того, щоб запускати код за один раз, пройдіть кожен рядок по одному. Для цього натисніть будь -де в коді і натисніть F8. Ви б помітили, що кожного разу, коли ви натискаєте F8, виконується один рядок. Це дозволяє проходити код по одному рядку за раз і виявляти логічні помилки.

Використання налагодження для пошуку помилок компіляції/синтаксису

Як тільки ви закінчите з кодом, рекомендується спочатку скомпілювати його перед запуском.

Для компіляції коду клацніть опцію Налагодження на панелі інструментів і клацніть Компілювати VBAProject.

Коли ви компілюєте проект VBA, він проходить код і визначає помилки (якщо такі є).

Якщо він виявить помилку, він покаже вам діалогове вікно з помилкою. Він знаходить помилки одну за одною. Тому, якщо він знаходить помилку, і ви її виправили, вам потрібно знову запустити компіляцію, щоб знайти інші помилки (якщо вони є).

Якщо у вашому коді немає помилок, параметр Compile VBAProject буде сірим.

Зауважте, що компіляція буде знаходити лише помилки "синтаксису" та "компіляції". Він НЕ знайде помилок під час виконання.

Коли ви пишете код VBA, ви не хочете, щоб помилки з’являлися. Щоб цього уникнути, можна використовувати багато методів обробки помилок.

У наступних кількох розділах цієї статті я висвітлю методи, які можна використовувати для обробки помилок VBA в Excel.

Налаштування параметрів помилок (обробляються проти необроблених помилок)

Перш ніж почати працювати з кодом, вам потрібно перевірити наявність одного параметра в Excel VBA.

Перейдіть на панель інструментів VBA, натисніть «Інструменти», а потім - «Параметри».

У діалоговому вікні Параметри клацніть на вкладці Загальні та переконайтеся, що в групі «Перехоплення помилок» встановлено прапорець «Розрив на необроблені помилки».

Дозвольте мені пояснити три варіанти:

  1. Перерва на всі помилки: Це зупинить ваш код на всіх типах помилок, навіть якщо ви використовували методи для усунення цих помилок.
  2. Модуль Перерва в класі: Це зупинить ваш код на всіх необроблених помилках, і в той же час, якщо ви використовуєте такі об’єкти, як Userforms, він також розіб’ється всередині цих об’єктів і виділить точний рядок, що викликає помилку.
  3. Перерва на необроблених помилках: Це зупинить ваш код лише для тих помилок, які не обробляються. Це налаштування за замовчуванням, оскільки воно гарантує, що будь -які необроблені помилки будуть повідомлені вам. Якщо ви використовуєте такі об’єкти, як Userforms, це не виділить рядок, що викликає помилку в об’єкті, а лише виділить рядок, що відноситься до цього об’єкта.
Примітка: Якщо ви працюєте з такими об’єктами, як Userform, ви можете змінити це налаштування на „Break on Class Modules”. Різниця між №2 та №3 полягає в тому, що коли ви використовуєте модуль Break in Class, він перенесе вас до певного рядка в об’єкті, що викликає помилку. Ви також можете вибрати це замість "Перерва на необроблені помилки".

Отже, коротко кажучи - якщо ви тільки починаєте працювати з Excel VBA, переконайтеся, що встановлено прапорець «Перерва на необроблені помилки».

Обробка помилок VBA за допомогою заяв "Про помилку"

Коли у вашому коді виникає помилка, ви можете зробити кілька дій:

  1. Ігноруйте помилку і нехай код продовжується
  2. Встановіть код обробки помилок і запустіть його, коли станеться помилка

Обидва ці способи обробки помилок гарантують, що кінцевий користувач не побачить помилку.

Існує кілька тверджень "Про помилку", які ви можете використати, щоб це зробити.

Увімкнути Помилка Відновити Далі

Коли ви використовуєте "Увімкнути помилку, продовжити далі" у своєму коді, будь -яка помилка, що трапилася, буде проігнорована, і код продовжить працювати.

Цей метод обробки помилок використовується досить часто, але потрібно бути обережним при його використанні. Оскільки він повністю ігнорує будь -які помилки, які можуть виникнути, можливо, ви не зможете визначити помилки, які потрібно виправити.

Наприклад, якщо запустити код нижче, він поверне помилку.

Sub AssignValues ​​() x = 20 /4 y = 30/0 End Sub

Це відбувається тому, що не можна ділити число на нуль.

Але якщо я використовую в цьому коді оператор "On Error Resume Next" (як показано нижче), він ігнорує помилку, і я не буду знати, що існує проблема, яку потрібно виправити.

Sub AssignValues ​​() Увімкнено Помилка Відновити Наступний x = 20 /4 y = 30/0 Закінчити підп

On Error Resume Next слід використовувати лише тоді, коли ви чітко знаєте, які помилки очікується у вашому коді VBA, і їх можна ігнорувати.

Наприклад, нижче наведено код події VBA, який би миттєво додав значення дати та часу в клітинку A1 знову вставленого аркуша (цей код додається до робочого аркуша, а не до модуля).

Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub

Хоча це чудово працює в більшості випадків, воно видасть помилку, якщо я додаю аркуш діаграми замість аркуша. Оскільки аркуш діаграми не містить клітинок, код видасть помилку.

Отже, якщо я використовую в цьому коді оператор "Про помилку, продовжую далі", він буде працювати належним чином з робочими листами і нічого не робитиме з аркушами діаграм.

Private Sub Workbook_NewSheet (ByVal Sh As Object) Про помилку Відновлення Наступний Sh.Range ("A1") = Формат (Зараз, "dd-mmm-yyyy hh: mm: ss") Кінцевий підрозділ

Примітка: Наступне висловлювання щодо відновлення помилок найкраще використовувати, коли ви знаєте, з якими помилками ви зіткнетесь. І тоді, якщо ви вважаєте безпечним ігнорувати ці помилки, ви можете скористатися ним.

Ви можете вивести цей код на наступний рівень, проаналізувавши, чи була помилка, і відобразивши відповідне повідомлення для нього.

У наведеному нижче коді відображатиметься вікно повідомлення, яке повідомлятиме користувача про те, що аркуш не вставлено.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") If Err.Number 0 То MsgBox "Схоже на вас вставлено аркуш діаграми "& vbCrLf &" Помилка - "& Err. Опис Кінець, якщо Кінець Sub

"Err.Number" використовується для отримання номера помилки, а "Err.Description" - для отримання опису помилки. Це буде розглянуто далі в цьому підручнику.

Помилка Перейти до 0

'On Error GoTo 0' зупинить код у рядку, що викликає помилку, і покаже вікно повідомлення, яке описує помилку.

Простіше кажучи, він включає поведінку перевірки помилок за замовчуванням і показує повідомлення про помилку за замовчуванням.

Тоді навіщо взагалі ним користуватися?

Як правило, вам не потрібно використовувати "On Error Goto 0", але це може бути корисним, якщо ви використовуєте його разом із "On Error Resume Next"

Дозволь пояснити!

Нижче наведений код виділить усі порожні клітинки у виділенні.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Виберіть End Sub

Але це буде показувати помилку, якщо у вибраних осередках немає порожніх клітинок.

Тому, щоб уникнути відображення помилки, ви можете скористатися функцією «Відновлення помилок далі»

Тепер він також покаже будь -яку помилку під час запуску наведеного нижче коду:

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks).

Все йде нормально!

Проблема виникає, коли є частина коду, де може статися помилка, і оскільки ви використовуєте «Далі відновити помилку», код просто ігнорує її і переходить до наступного рядка.

Наприклад, у наведеному нижче коді не буде жодного запиту про помилку:

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks) .Виберіть '… більше коду, який може містити помилку End Sub

У наведеному вище коді є два місця, де може статися помилка. Перше місце - це місце, де ми виділяємо всі порожні клітинки (за допомогою Selection.SpecialCells), а друге - у коді, що залишився.

Хоча перша помилка очікується, будь -якої помилки після цього немає.

Тут на допомогу приходить On Error Goto 0.

Коли ви його використовуєте, ви скидаєте налаштування помилок за замовчуванням, де вони почнуть відображати помилки, коли вони зустрічаються.

Наприклад, у наведеному нижче коді помилки не буде, якщо немає порожніх клітинок, але буде запит про помилку через '10/0 ′

Sub SelectFormulaCells () On Error Відновити наступний вибір.SpecialCells (xlCellTypeBlanks) .Вибрати On Error GoTo 0 '… більше коду, який може містити помилку End Sub

Помилка переходу до [Мітка]

Два вищевказані способи - «Увімкнути помилку далі» та „Увімкнути помилку - перейти до 0“ - не дозволяють нам по -справжньому впоратися з помилкою. Один змушує код ігнорувати помилку, а другий поновлює перевірку помилок.

On Error Go [Label] - це спосіб, за допомогою якого ви можете вказати, що ви хочете зробити, якщо у вашому коді є помилка.

Нижче наведено структуру коду, яка використовує цей обробник помилок:

Sub Test () On Error GoTo Label: X = 10 /0 'цей ​​рядок викликає помилку' …. Ваш код, що залишився, йде сюди Вийти з підмітки: 'код для обробки помилки End Sub

Зверніть увагу, що перед обробкою помилки "Label", є Sub Exit. Це гарантує, що у випадку, якщо помилок немає, підзапис виходить і код «Label» не виконується. Якщо ви не використовуєте Exit Sub, він завжди виконуватиме код "Label".

У наведеному нижче прикладі коду, коли виникає помилка, код стрибає і виконує код у розділі обробника (і показує вікно повідомлення).

Sub Errorhandler () Увімкнено Помилка Перейти ErrMsg X = 12 Y = 20 /0 Z = 30 Вийти з Sub ErrMsg: MsgBox "Здається, що помилка" & vbCrLf & Err.

Зауважте, що коли виникає помилка, код уже запустив і виконав рядки перед рядком, що спричинив помилку. У наведеному вище прикладі код встановлює значення X як 12, але оскільки помилка виникає у наступному рядку, він не встановлює значення для Y та Z.

Як тільки код перейде до коду обробника помилок (ErrMsg у цьому прикладі), він продовжить виконувати всі рядки в коді обробника помилок та під ним, а також вийде з підрозділу.

У разі помилки Перейдіть до -1

Це дещо складне, і в більшості випадків ви навряд чи цим скористаєтесь.

Але я все одно висвітлю це, оскільки зіткнувся з ситуацією, коли це було необхідно (не соромтеся ігнорувати та переходити до наступного розділу, якщо ви шукаєте лише основи).

Перш ніж приступити до його механіки, дозвольте мені спробувати пояснити, де це може бути корисним.

Припустимо, у вас є код, де виникає помилка. Але все добре, оскільки у вас є один обробник помилок. Але що трапляється, коли в коді обробника помилок є ще одна помилка (так … дещо схожа на фільм -початковий фільм).

У такому випадку ви не можете використовувати другий обробник, оскільки перша помилка не була видалена. Отже, поки ви впоралися з першою помилкою, у пам’яті VBA вона все ще існує. У пам’яті VBA є місце лише для однієї помилки - не більше двох і більше.

У цьому сценарії можна використовувати On Error Goto -1.

Він видаляє помилку та звільняє пам'ять VBA для обробки наступної помилки.

Досить розмов!

Поясню зараз на прикладах.

Припустимо, у мене є код нижче. Це призведе до помилки, оскільки існує поділ на нуль.

Sub Errorhandler () X = 12 Y = 20 /0 Z = 30 End Sub

Тому, щоб впоратися з цим, я використовую код обробника помилок (з назвою ErrMsg), як показано нижче:

Sub Errorhandler () Увімкнено Помилка Перейти ErrMsg X = 12 Y = 20 /0 Z = 30 Вийти з Sub ErrMsg: MsgBox "Здається, що помилка" & vbCrLf & Err.

Тепер знову все добре. Як тільки помилка виникає, використовується обробник помилок і відображається вікно повідомлення, як показано нижче.

Тепер я розширюю код, щоб у мене було більше коду в обробнику помилок або після нього.

Sub Errorhandler () Увімкнено Помилка Перейти ErrMsg X = 12 Y = 20 /0 Z = 30 Вийти з Sub ErrMsg: MsgBox "Здається, що помилка" & vbCrLf & Err. Опис A = 10 /2 B = 35 /0 Закінчити суб

Оскільки перша помилка була оброблена, а друга - ні, я знову бачу помилку, як показано нижче.

Все ще добре. Код поводиться так, як ми очікували.

Тому для обробки другої помилки я використовую інший обробник помилок (ErrMsg2).

Sub Errorhandler () Увімкнено Помилка GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Вийти з Sub ErrMsg: MsgBox "Здається, помилка" & vbCrLf & Err.Опис Про помилку GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Вийти з Sub ErrMsg2: MsgBox "Здається, знову помилка" & vbCrLf & Err.

І ось тут воно не працює належним чином.

Якщо ви запустите наведений вище код, він все одно видасть вам помилку під час виконання, навіть після встановлення другого обробника помилок.

Це відбувається, оскільки ми не видалили першу помилку з пам’яті VBA.

Так, ми впоралися! Але він все ще залишається в пам’яті.

І коли VBA зустрічає чергову помилку, вона все ще застряє з першою помилкою, і тому другий обробник помилок не використовується. Код зупиняється на рядку, що спричинив помилку, і показує підказку про помилку.

Щоб очистити пам’ять VBA та видалити попередню помилку, потрібно скористатися функцією «Помилка переходу до -1».

Тож якщо ви додасте цей рядок у код нижче та запустите його, він працюватиме належним чином.

Sub Errorhandler () Увімкнено Помилка GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Вийти з Sub ErrMsg: MsgBox "Здається, помилка" & vbCrLf & Err.Опис Увімкнено Помилка GoTo -1 Увімкнено Помилка GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Вийти з підпорядкованого ErrMsg2: MsgBox "Здається, знову помилка" & vbCrLf & Err.
Примітка: Помилка автоматично видаляється після завершення підпрограми.Отже, "При помилці перейти до -1" може бути корисним, коли ви отримуєте дві або більше помилок у одній підпрограмі.

Об'єкт Err

Коли виникає помилка з кодом, це об’єкт Err, який використовується для отримання детальної інформації про помилку (наприклад, номера помилки або опису).

Err Властивості об’єкта

Об'єкт Err має такі властивості:

Власність Опис
Номер Число, що позначає тип помилки. Якщо помилки немає, це значення дорівнює 0
Опис Короткий опис помилки
Джерело Назва проекту, в якому сталася помилка
ДовідкаКонтекст Ідентифікатор контексту довідки для помилки у файлі довідки
Файл довідки Рядок, що представляє розташування папки та ім’я файлу довідки

Хоча в більшості випадків вам не потрібно використовувати об’єкт Err, це іноді може бути корисним під час обробки помилок у Excel.

Наприклад, припустимо, що у вас є набір даних, як показано нижче, і для кожного числа у виділенні потрібно обчислити квадратний корінь у сусідній клітинці.

Наведений нижче код може це зробити, але оскільки у клітинці A5 є текстовий рядок, він відображає помилку, як тільки це відбувається.

Sub FindSqrRoot () Dim rng As Range Set rng = Вибір для кожної клітинки у комірці rng. Offset (0, 1) .Value = Sqr (cell.Value) Наступна клітина End Sub

Проблема з цим типом повідомлення про помилку полягає в тому, що він нічого не повідомляє про те, що сталося не так і де проблема виникла.

Ви можете використовувати об'єкт Err, щоб зробити ці повідомлення про помилки більш значущими.

Наприклад, якщо я зараз використовую наведений нижче код VBA, він зупинить код, як тільки станеться помилка, і покаже вікно повідомлення з адресою клітинки комірки, де є проблема.

Sub FindSqrRoot () Dim rng As Range Set rng = Вибір для кожної клітинки In rng On Помилка Перейти до комірки ErrHandler.Offset (0, 1) .Value = Sqr (cell.Value) Наступна клітина ErrHandler: MsgBox "Номер помилки:" & Err .Number & vbCrLf & _ "Опис помилки:" & Err.Description & vbCrLf & _ "Помилка за адресою:" & cell.Address End Sub

Наведений вище код дасть вам набагато більше інформації, ніж простий тип невідповідності, особливо адреса комірки, щоб ви знали, де сталася помилка.

Ви можете додатково уточнити цей код, щоб переконатися, що ваш код працює до кінця (замість того, щоб порушувати кожну помилку), а потім надасть вам список адрес комірки, де виникає помилка.

Нижче наведений код зробить це:

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Вибір для кожної клітинки у комірці rng. Offset (0, 1) .Value = Sqr (cell.Value) Якщо Err.Number 0 Тоді ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next комірка MsgBox "Помилка в наступних клітинках" & ErrorCells Вихід з Sub End Sub

Наведений вище код працює до кінця і дає квадратний корінь з усіх клітинок, у яких є числа (у сусідньому стовпці). Потім відображається повідомлення, у якому перераховані всі осередки, де була помилка (як показано нижче):

Методи об'єктів Err

Хоча властивості Err корисні для показу корисної інформації про помилки, існують також два методи Err, які можуть допомогти вам у обробці помилок.

Метод Опис
Ясно Очищає всі параметри властивостей об’єкта Err
Підняти Створює помилку під час виконання

Давайте швидко дізнаємося, що це таке і як/навіщо їх використовувати з VBA в Excel.

Err Clear Method

Припустимо, у вас є набір даних, як показано нижче, і ви хочете отримати квадратний корінь усіх цих чисел у сусідньому стовпці.

Наступний код отримає квадратні корені всіх чисел у сусідньому стовпці та покаже повідомлення про те, що сталася помилка для клітинок A5 та A9 (оскільки в них є текст).

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Вибір для кожної комірки у комірці rng.Offset (0, 1) .Value = Sqr (cell.Value) Якщо Err.Number 0 Тоді ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Помилка в наступних клітинках" & ErrorCells End Sub

Зауважте, що я використовував метод Err.Clear у операторі If Then.

Після того, як помилка сталася і була перехоплена умовою If, метод Err.Clear скидає номер помилки назад до 0. Це гарантує, що умова IF перехоплює помилки лише для клітинок, де вона викликається.

Якби я не використав метод Err.Clear, як тільки помилка станеться, вона завжди була б істинною за умови IF, і номер помилки не був скинутий.

Інший спосіб зробити цю роботу -використовувати On Error Goto -1, який повністю скидає помилку.

Примітка: Err.Clear відрізняється від On Error Goto -1. Err.Clear видаляє лише опис помилки та номер помилки. це не повністю скидає його. Це означає, що якщо в тому ж коді є інший випадок помилки, ви не зможете впоратися з нею перед її скиданням (що можна зробити за допомогою "On Error Goto -1", а не за допомогою "Err.Clear").

Метод підняття помилок

Метод Err.Raise дозволяє викликати помилку під час виконання.

Нижче наведено синтаксис використання методу Err.Raise:

Помилка Підняти [номер], [джерело], [опис], [файл довідки], [довідковий контекст]

Усі ці аргументи є необов’язковими, і ви можете використовувати їх, щоб зробити ваше повідомлення про помилку більш значущим.

Але чому ви коли -небудь хотіли б самі підняти помилку?

Хороше питання!

Ви можете використовувати цей метод, коли є випадок помилки (це означає, що все одно буде помилка), а потім ви використовуєте цей метод, щоб розповісти користувачеві більше про помилку (замість менш корисного повідомлення про помилку, яке показує VBA за замовчуванням).

Наприклад, припустимо, що у вас є набір даних, як показано нижче, і ви хочете, щоб усі клітинки мали лише числові значення.

Sub RaiseError () Dim rng As Range Set rng = Selection On Error Перейти до ErrHandler для кожної клітинки у rng Якщо ні (IsNumeric (Cell.Value)) То Err.Raise vbObjectError + 513, Cell.Address, "Не число", " Test.html "Закінчити, якщо наступна клітина ErrHandler: MsgBox Err.Опис & vbCrLf & Err.HelpFile Кінцева підп.

У наведеному вище коді відображатиметься повідомлення про помилку, що містить зазначений опис та файл контексту.

Особисто я ніколи не використовував Err.Raise, оскільки переважно працюю лише з Excel. Але для тих, хто використовує VBA для роботи з Excel разом з іншими програмами, такими як Outlook, Word або PowerPoint, це може бути корисним.

Ось детальна стаття про метод Err.Raise, якщо ви хочете дізнатися більше.

Найкращі практики обробки помилок VBA

Незалежно від того, наскільки ви вмієте писати код VBA, помилки завжди будуть його частиною. Найкращі програмісти - це ті, хто володіє навичками належного вирішення цих помилок.

Ось деякі найкращі практики, які ви можете використовувати, коли йдеться про обробку помилок у Excel VBA.

  1. Використовуйте "На помилку Перейти [мітка]" на початку коду. Це забезпечить обробку будь -якої помилки, яка може статися звідти.
  2. Використовуйте "Увімкнути помилку далі" ТІЛЬКИ тоді, коли ви впевнені в помилках, які можуть виникнути. Використовуйте його лише з очікуваною помилкою. Якщо ви використовуєте його з несподіваними помилками, він просто ігнорує його і рухається вперед. Якщо ви хочете ігнорувати певний тип помилки і впіймати решту, ви можете використати опцію «Увімкнути помилку далі» з „Err.Raise“.
  3. Використовуючи обробники помилок, переконайтеся, що ви використовуєте Exit Sub перед обробниками. Це гарантує, що код обробника помилок виконується лише за наявності помилки (інакше він завжди буде виконуватися).
  4. Використовуйте декілька обробників помилок для захоплення різних типів помилок. Наявність кількох обробників помилок гарантує належне усунення помилки. Наприклад, ви хотіли б обробляти помилку "невідповідність типу" інакше, ніж помилку під час "Поділ на 0".

Сподіваюся, ця стаття Excel була вам корисною!

Ось ще кілька навчальних посібників Excel VBA, які вам можуть сподобатися:

  • Типи даних Excel VBA - повний посібник
  • Цикли Excel VBA - для наступного, Do While, Do Until, для кожного
  • Події Excel VBA - простий (і повний) посібник
  • Редактор Visual Basic Excel - як відкрити та використовувати його в Excel
wave wave wave wave wave