Обработка ошибок Excel VBA - все, что вам нужно знать!

Независимо от того, насколько вы опытны в программировании на VBA, ошибки всегда будут частью этого.

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

В этом руководстве я покажу вам различные способы эффективной обработки ошибок в Excel VBA.

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

Типы ошибок VBA в Excel

В Excel VBA есть четыре типа ошибок:

  1. Синтаксические ошибки
  2. Ошибки компиляции
  3. Ошибки времени выполнения
  4. Логические ошибки

Давайте быстро поймем, что это за ошибки и когда вы с ними столкнетесь.

Ошибка синтаксиса

Синтаксическая ошибка, как следует из названия, возникает, когда VBA обнаруживает что-то не так с синтаксисом в коде.

Например, если вы забудете часть необходимого оператора / синтаксиса, вы увидите ошибку компиляции.

В приведенном ниже коде, как только я нажимаю Enter после второй строки, я вижу ошибку компиляции. Это потому, что Заявление ЕСЛИ необходимо иметь "Затем‘, Которая отсутствует в приведенном ниже коде.

Примечание: Когда вы вводите код в Excel VBA, он проверяет каждое предложение, как только вы нажимаете клавишу ВВОД. Если VBA обнаруживает, что в синтаксисе чего-то не хватает, он мгновенно отображает сообщение с текстом, который может помочь вам понять недостающую часть.

Чтобы убедиться, что вы видите синтаксическую ошибку всякий раз, когда чего-то не хватает, вам необходимо убедиться, что проверка автосинтаксиса включена. Для этого нажмите «Инструменты», а затем «Параметры». Убедитесь, что в диалоговом окне параметров включена опция «Автоматическая проверка синтаксиса».

Если опция «Автоматическая проверка синтаксиса» отключена, VBA по-прежнему будет выделять строку с синтаксической ошибкой красным цветом, но не будет отображать диалоговое окно с ошибкой.

Ошибка компиляции

Ошибки компиляции возникают, когда что-то отсутствует, что необходимо для запуска кода.

Например, в приведенном ниже коде, как только я попытаюсь запустить код, он покажет следующую ошибку. Это происходит, поскольку я использовал оператор IF Then, не закрывая его обязательным «End If».

Синтаксическая ошибка также является разновидностью ошибки компиляции. Синтаксическая ошибка возникает, как только вы нажимаете клавишу ВВОД, и VBA определяет, что чего-то не хватает. Ошибка компиляции также может возникать, когда VBA не находит ничего недостающего при вводе кода, но это происходит при компиляции или выполнении кода.

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

Ниже приведены несколько сценариев, при которых вы столкнетесь с ошибкой компиляции:

  1. Использование оператора IF без конечного IF
  2. Использование оператора For с оператором Next
  3. Использование оператора Select без использования End Select
  4. Не объявлять переменную (это работает только при включенном Option Explicit)
  5. Вызов несуществующей подпрограммы / функции (или с неправильными параметрами)
Примечание о "Option Explicit": Когда вы добавляете «Option Explicit», вам нужно будет объявить все переменные перед запуском кода. Если есть переменная, которая не была объявлена, VBA выдаст ошибку. Это хорошая практика, поскольку она показывает ошибку, если у вас есть переменная с ошибкой. Вы можете узнать больше о Option Explicit здесь.

Ошибки времени выполнения

Ошибки времени выполнения - это те, которые возникают во время выполнения кода.

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

Например, если вы запускаете код, который должен открывать книгу Excel, но эта книга недоступна (либо удалена, либо изменено имя), ваш код выдаст ошибку во время выполнения.

Когда возникает ошибка времени выполнения, код останавливается и отображается диалоговое окно ошибки.

Сообщение в диалоговом окне «Ошибка выполнения» немного более полезно. Он пытается объяснить проблему, что может помочь вам ее исправить.

Если вы нажмете кнопку «Отладка», будет выделена часть кода, которая приводит к ошибке.

Если вы исправили ошибку, вы можете нажать кнопку «Выполнить» на панели инструментов (или нажать F5), чтобы продолжить выполнение кода с того места, где он был оставлен.

Или вы также можете нажать кнопку «Конец», чтобы выйти из кода.

Важный: Если вы нажмете кнопку «Конец» в диалоговом окне, код будет остановлен на той строке, в которой он встречается. Однако все предыдущие строки кода были бы выполнены.

Логические ошибки

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

Эти ошибки не выделяются компилятором, и их нужно устранять вручную.

Один из примеров логической ошибки (с которой я часто сталкиваюсь) - это бесконечный цикл.

Другой пример может быть, когда он дает неправильный результат. Например, вы можете использовать неправильную переменную в коде или добавить две переменные, если одна из них неверна.

Я использую несколько способов устранения логических ошибок:

  1. Вставьте окно сообщения в какое-либо место в коде и выделите значения / данные, которые могут помочь понять, идет ли eberything, как ожидалось.
  2. Вместо того, чтобы запускать код за один раз, просматривайте каждую строку одну за другой. Для этого щелкните в любом месте кода и нажмите F8. вы могли бы заметить, что каждый раз, когда вы нажимаете F8, выполняется одна строка. Это позволяет просматривать код по одной строке за раз и определять логические ошибки.

Использование отладки для поиска ошибок компиляции / синтаксиса

Когда вы закончите работу с кодом, рекомендуется сначала скомпилировать его перед запуском.

Чтобы скомпилировать код, выберите параметр «Отладка» на панели инструментов и нажмите «Скомпилировать VBAProject».

Когда вы компилируете проект VBA, он просматривает код и выявляет ошибки (если таковые имеются).

Если он обнаружит ошибку, он покажет вам диалоговое окно с ошибкой. Он обнаруживает ошибки одну за другой. Поэтому, если он обнаружит ошибку, и вы ее исправили, вам нужно снова запустить компиляцию, чтобы найти другие ошибки (если они есть).

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

Обратите внимание, что при компиляции будут обнаружены только ошибки «Синтаксис» и «Компиляция». Он НЕ найдет ошибок времени выполнения.

Когда вы пишете код VBA, вы не хотите, чтобы ошибки возникали. Чтобы избежать этого, вы можете использовать множество методов обработки ошибок.

В следующих нескольких разделах этой статьи я расскажу о методах, которые вы можете использовать для обработки ошибок VBA в Excel.

Настройка параметров ошибок (обработанные и необработанные ошибки)

Прежде чем вы начнете работать со своим кодом, вам необходимо проверить один параметр в Excel VBA.

Перейдите на панель инструментов VBA и нажмите Инструменты, а затем нажмите Параметры.

В диалоговом окне «Параметры» перейдите на вкладку «Общие» и убедитесь, что в группе «Перехват ошибок» установлен флажок «Прерывание по необработанным ошибкам».

Позвольте мне объяснить три варианта:

  1. Прервать все ошибки: Это остановит ваш код на всех типах ошибок, даже если вы использовали методы для обработки этих ошибок.
  2. Модуль Break in Class: Это остановит ваш код на всех необработанных ошибках, и в то же время, если вы используете такие объекты, как пользовательские формы, он также сломается внутри этих объектов и выделит точную строку, вызвавшую ошибку.
  3. Перерыв в связи с необработанными ошибками: Это остановит ваш код только для тех ошибок, которые не обрабатываются. Это настройка по умолчанию, так как она обеспечивает уведомление о любых необработанных ошибках. Если вы используете такие объекты, как пользовательские формы, при этом не будет выделена строка, вызывающая ошибку в объекте, а будет выделена только строка, относящаяся к этому объекту.
Примечание: Если вы работаете с такими объектами, как пользовательские формы, вы можете изменить этот параметр на «Прерывание по модулям класса». Разница между №2 и №3 заключается в том, что при использовании Break в модуле класса вы перейдете к определенной строке в объекте, вызывающем ошибку. Вы также можете выбрать этот вариант вместо «Прерывание по необработанным ошибкам».

Вкратце: если вы только начинаете работу с 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 Конец Sub

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

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

Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Format (Теперь, "дд-ммм-гггг чч: мм: сс") End Sub

Хотя в большинстве случаев это отлично работает, при добавлении листа диаграммы вместо листа будет отображаться ошибка. Поскольку на листе диаграммы нет ячеек, код выдает ошибку.

Итак, если я использую в этом коде оператор «При ошибке возобновить следующий», он будет работать, как ожидалось, с листами и ничего не будет делать с листами диаграмм.

Private Sub Workbook_NewSheet (ByVal Sh As Object) При ошибке Возобновить Далее Sh.Range ("A1") = Format (Теперь, "dd-mmm-yyyy hh: mm: ss") End Sub

Примечание. Оператор «Возобновить следующее при ошибке» лучше всего использовать, когда вы знаете, с какими ошибками вы, скорее всего, столкнетесь. А затем, если вы считаете, что эти ошибки можно игнорировать, вы можете использовать это.

Вы можете вывести этот код на следующий уровень, проанализировав, была ли ошибка, и отобразив соответствующее сообщение для нее.

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

Private Sub Workbook_NewSheet (ByVal Sh As Object) При ошибке Возобновить Далее Sh.Range ("A1") = Format (Теперь, "dd-mmm-yyyy hh: mm: ss") Если Err.Number 0, то MsgBox "Похоже на вас вставлен лист диаграммы "& vbCrLf &" Error - "& Err.Description End If End Sub

«Err.Number» используется для получения номера ошибки, а «Err.Description» используется для получения описания ошибки. Они будут рассмотрены позже в этом руководстве.

При ошибке GoTo 0

«On Error GoTo 0» остановит код в строке, которая вызывает ошибку, и отобразит окно сообщения, описывающее ошибку.

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

Тогда зачем вообще его использовать?

Обычно вам не нужно использовать «On Error Goto 0», но это может быть полезно, когда вы используете его вместе с «On Error Resume Next».

Позволь мне объяснить!

Приведенный ниже код выберет все пустые ячейки в выделенном фрагменте.

Подложка SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks) .Select End Sub

Но он покажет ошибку, если в выбранных ячейках нет пустых ячеек.

Поэтому, чтобы не отображать ошибку, вы можете использовать «Возобновить при ошибке».

Теперь он также покажет любую ошибку, когда вы запустите приведенный ниже код:

Sub SelectFormulaCells () При ошибке Возобновить следующий выбор. SpecialCells (xlCellTypeBlanks). Выберите End Sub

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

Проблема возникает, когда есть часть кода, в которой может произойти ошибка, и поскольку вы используете «При ошибке возобновить следующее», код просто проигнорирует ее и перейдет к следующей строке.

Например, в приведенном ниже коде не будет сообщения об ошибке:

Sub SelectFormulaCells () При ошибке Возобновить следующий выбор.SpecialCells (xlCellTypeBlanks) .Select '… дополнительный код, который может содержать ошибку End Sub

В приведенном выше коде есть два места, где может произойти ошибка. В первом месте мы выбираем все пустые ячейки (используя Selection.SpecialCells), а во втором - оставшийся код.

Хотя ожидается первая ошибка, никаких ошибок после нее нет.

Здесь на помощь приходит On Error Goto 0.

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

Например, в приведенном ниже коде не будет ошибки, если нет пустых ячеек, но будет сообщение об ошибке из-за '10 / 0 '

Sub SelectFormulaCells () При ошибке Возобновить следующий выбор. SpecialCells (xlCellTypeBlanks). Select On Error GoTo 0 '… больше кода, который может содержать ошибку End Sub

При ошибке Перейти к [ярлык]

Два вышеуказанных метода - «При ошибке возобновить следующее» и «При ошибке перейти к 0» - не позволяют нам по-настоящему обработать ошибку. Один заставляет код игнорировать ошибку, а второй возобновляет проверку ошибок.

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

Ниже приведена структура кода, в которой используется этот обработчик ошибок:

Sub Test () On Error GoTo Label: X = 10/0 'эта строка вызывает ошибку' … ваш оставшийся код идет сюда Exit Sub Label: 'код для обработки ошибки End Sub

Обратите внимание, что перед меткой обработки ошибок находится подпрограмма выхода. Это гарантирует, что в случае отсутствия ошибок подпрограмма будет закрыта, а код «Label» не будет выполнен. Если вы не используете Exit Sub, он всегда будет выполнять код «Label».

В приведенном ниже примере кода при возникновении ошибки код перескакивает и выполняет код в разделе обработчика (и показывает окно сообщения).

Sub Errorhandler () При ошибке GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox «Похоже, произошла ошибка» & vbCrLf & Err.Description End Sub

Обратите внимание, что при возникновении ошибки код уже был запущен и выполнил строки перед строкой, вызвавшей ошибку. В приведенном выше примере код устанавливает значение X как 12, но поскольку ошибка возникает в следующей строке, он не устанавливает значения для Y и Z.

Как только код перейдет к коду обработчика ошибок (ErrMsg в этом примере), он продолжит выполнение всех строк в коде обработчика ошибок и ниже и завершит выполнение подпрограммы.

При ошибке Goto -1

Это немного сложно, и в большинстве случаев вы вряд ли им воспользуетесь.

Но я все же расскажу об этом, поскольку я столкнулся с ситуацией, когда это было необходимо (не стесняйтесь игнорировать и переходить к следующему разделу, если вы ищете только основы).

Прежде чем я углублюсь в механику этого, позвольте мне попытаться объяснить, где это может быть полезно.

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

В таком случае вы не можете использовать второй обработчик, так как первая ошибка не была устранена. Итак, хотя вы обработали первую ошибку, она все еще существует в памяти VBA. А в памяти VBA есть место только для одной ошибки, а не для двух или более.

В этом сценарии вы можете использовать On Error Goto -1.

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

Хватит разговоров!

Теперь позвольте мне объяснить на примерах.

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

Дополнительный обработчик ошибок () X = 12 Y = 20/0 Z = 30 End Sub

Чтобы справиться с этим, я использую код обработчика ошибок (с именем ErrMsg), как показано ниже:

Sub Errorhandler () При ошибке GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox «Похоже, произошла ошибка» & vbCrLf & Err.Description End Sub

Теперь все снова хорошо. Как только возникает ошибка, используется обработчик ошибок и отображается окно сообщения, как показано ниже.

Теперь я расширяю код, чтобы у меня было больше кода в обработчике ошибок или после него.

Sub Errorhandler () При ошибке GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox «Кажется, произошла ошибка» & vbCrLf & Err.Description A = 10/2 B = 35/0 End Sub

Поскольку первая ошибка была обработана, а вторая нет, я снова вижу ошибку, как показано ниже.

По-прежнему все хорошо. Код ведет себя так, как мы и ожидали.

Поэтому для обработки второй ошибки я использую другой обработчик ошибок (ErrMsg2).

Sub Errorhandler () При ошибке GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Выход Sub ErrMsg: MsgBox «Похоже, произошла ошибка» & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10/2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Кажется, снова произошла ошибка" & vbCrLf & Err.Description End Sub

И вот где это не работает должным образом.

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

Это происходит из-за того, что мы не удалили первую ошибку из памяти VBA.

Да, мы справились! Но все еще остается в памяти.

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

Чтобы очистить память VBA и удалить предыдущую ошибку, вам необходимо использовать «On Error Goto -1».

Поэтому, если вы добавите эту строку в приведенный ниже код и запустите ее, она будет работать должным образом.

Sub Errorhandler () При ошибке GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Выход Sub ErrMsg: MsgBox «Похоже, произошла ошибка» & vbCrLf & Err.Description On Error GoTo -1 При ошибке GoTo ErrMsg2 A = 10 / 2 B = 35/0 Выход из подпрограммы ErrMsg2: MsgBox «Похоже, снова произошла ошибка» & vbCrLf & Err.Description End Sub
Примечание: Ошибка автоматически очищается после завершения подпрограммы.Таким образом, «On Error Goto -1» может быть полезен, когда вы получаете две или более двух ошибок в одной и той же подпрограмме.

Объект ошибки

Когда в коде возникает ошибка, для получения подробных сведений об ошибке (например, номера ошибки или описания) используется объект Err.

Свойства объекта Err

Объект Err имеет следующие свойства:

Свойство Описание
Номер Число, представляющее тип ошибки. Если ошибки нет, это значение равно 0.
Описание Краткое описание ошибки
Источник Название проекта, в котором произошла ошибка
HelpContext Идентификатор контекста справки для ошибки в файле справки
HelpFile Строка, представляющая расположение папки и имя файла справки.

Хотя в большинстве случаев вам не нужно использовать объект Err, иногда он может быть полезен при обработке ошибок в Excel.

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

Приведенный ниже код может это сделать, но поскольку в ячейке A5 есть текстовая строка, он показывает ошибку, как только это происходит.

Sub FindSqrRoot () Dim rng As Range Set rng = Selection For Each cell In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) Следующая ячейка End Sub

Проблема с этим типом сообщений об ошибках заключается в том, что они ничего не говорят о том, что пошло не так и где возникла проблема.

Вы можете использовать объект Err, чтобы сделать эти сообщения об ошибках более значимыми.

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

Sub FindSqrRoot () Dim rng As Range Set rng = Selection For each cell In rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Следующая ячейка ErrHandler: MsgBox "Номер ошибки:" & Err .Number & vbCrLf & _ "Описание ошибки:" & Err.Description & vbCrLf & _ "Ошибка в:" & cell.Address End Sub

Приведенный выше код предоставит вам гораздо больше информации, чем простое «Несоответствие типов», особенно адрес ячейки, чтобы вы знали, где произошла ошибка.

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

Следующий код сделает это:

Sub Найти ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Следующая ячейка MsgBox «Ошибка в следующих ячейках» & ErrorCells Exit Sub End Sub

Приведенный выше код выполняется до конца и дает квадратный корень из всех ячеек, в которых есть числа (в соседнем столбце). Затем отображается сообщение, в котором перечислены все ячейки, в которых произошла ошибка (как показано ниже):

Методы объекта Err

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

Метод Описание
Прозрачный Очищает все настройки свойств объекта Err
Поднимать Генерирует ошибку времени выполнения

Давайте быстро узнаем, что это такое и как / зачем их использовать с VBA в Excel.

Err Clear Method

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

Следующий код получит квадратные корни из всех чисел в соседнем столбце и покажет сообщение о том, что произошла ошибка для ячеек A5 и A9 (поскольку в них есть текст).

Sub Найти 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 Method

Метод Err.Raise позволяет вызвать ошибку времени выполнения.

Ниже приведен синтаксис использования метода Err.Raise:

Err.Raise [номер], [источник], [описание], [файл справки], [контекст помощи]

Все эти аргументы являются необязательными, и вы можете использовать их, чтобы сделать ваше сообщение об ошибке более значимым.

Но зачем вам самому создавать ошибку?

Хороший вопрос!

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

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

Sub RaiseError () Dim rng As Range Set rng = Selection On Error GoTo ErrHandler For each Cell in rng If Not (IsNumeric (Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

В приведенном выше коде будет отображаться сообщение об ошибке с указанным описанием и файлом контекста.

Лично я никогда не использовал Err.Raise, так как в основном работаю только с Excel. Но для тех, кто использует VBA для работы с Excel вместе с другими приложениями, такими как Outlook, Word или PowerPoint, это может быть полезно.

Вот подробная статья о методе Err.Raise, если вы хотите узнать больше.

Рекомендации по обработке ошибок VBA

Независимо от того, насколько квалифицированно вы пишете код VBA, ошибки всегда будут его частью. Лучшие кодировщики - это те, кто умеет правильно обрабатывать эти ошибки.

Вот несколько рекомендаций, которые вы можете использовать при обработке ошибок в Excel VBA.

  1. Используйте «On Error Go [Label]» в начале кода. Это гарантирует, что любая ошибка, которая может произойти оттуда, будет обработана.
  2. Используйте «Возобновить при ошибке» ТОЛЬКО в том случае, если вы уверены в том, какие ошибки могут произойти. Используйте его только с ожидаемой ошибкой. Если вы используете его с неожиданными ошибками, он просто проигнорирует его и двинется вперед. Вы можете использовать «On Error Resume Next» с «Err.Raise», если хотите игнорировать определенный тип ошибки и улавливать остальные.
  3. При использовании обработчиков ошибок убедитесь, что вы используете Exit Sub перед обработчиками. Это гарантирует, что код обработчика ошибок будет выполняться только при возникновении ошибки (иначе он будет выполняться всегда).
  4. Используйте несколько обработчиков ошибок для перехвата различных типов ошибок. Наличие обработчика множественных ошибок гарантирует, что ошибка будет исправлена ​​должным образом. Например, вы хотите обрабатывать ошибку «несоответствие типа» иначе, чем ошибку времени выполнения «Деление на 0».

Надеюсь, вы нашли эту статью в Excel полезной!

Вот еще несколько руководств по Excel VBA, которые могут вам понравиться:

  • Типы данных Excel VBA - полное руководство
  • Циклы Excel VBA - для «Далее», «Сделать пока», «Сделать до», «Для каждого»
  • События Excel VBA - простое (и полное) руководство
  • Редактор Excel Visual Basic - как открыть и использовать в Excel
wave wave wave wave wave