VBA при сообщениях об ошибках | 3 основных способа исправления ошибок

Ошибка в коде vba

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

Если не выполнена инструкция On Error, то любая ошибка выполнения является фатальной; это означает, что выводится сообщение об ошибке и выполнение программы прекращается.

"Включенным" обработчиком ошибок называют подпрограмму, которая указана в инструкции On Error; "активным" обработчиком ошибок является включенный обработчик ошибок, который обрабатывает текущую ошибку. Если ошибка возникает в самом обработчике ошибок (в промежутке между возникновением ошибки и выполнением инструкции Resume, Exit Sub, Exit Function или Exit Property), то обработчик ошибок, определенный в текущей процедуре, не может обработать ошибку. Управление в этом случае возвращается в вызывающую процедуру; если в вызывающей процедуре включен обработчик ошибок, то обработка ошибки передается ему. Если этот обработчик ошибок является в данный момент активным, т. е. уже обрабатывает ошибку, то управление снова передается назад в вызывающую процедуру и т. д. до тех пор, пока не будет найден включенный, но не активный обработчик ошибок. Если включенный, но неактивный обработчик ошибок найден не будет, ошибка становится фатальной в том месте программы, в котором она впервые возникла. При каждой передаче управления обработчиком ошибок в вызывающую процедуру эта процедура становится текущей. После завершения обработки ошибки обработчиком в любой процедуре возобновляется выполнение текущей процедуры с той ее части, которая указана в инструкции Resume.

Подпрограмма обработки ошибок не может быть процедурой Sub или Function. Эта подпрограмма должна быть частью программы, которая отмечается с помощью метки строки или номера строки.

Для определения причины ошибки в подпрограммах обработки ошибок используют значение свойства Number объекта Err. Необходимо обеспечить в подпрограммах обработки ошибок проверку или сохранение существенных значений свойств объекта Err перед тем, как может возникнуть новая ошибка или перед вызовом процедуры, в которой может возникнуть новая ошибка. Значения свойств объекта Err описывают последнюю ошибку. Текст сообщения об ошибке, соответствующего коду ошибки Err. Number содержится в свойстве Err. Description.

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

При обработке ошибок, возникающих при доступе к другим объектам, рекомендуется использовать конструкцию On Error Resume Next, а не конструкцию On Error GoTo. Проверка объекта Err после каждого взаимодействия с другим объектом позволяет устранить неопределенность в том, при доступе к какому объекту возникла ошибка. Это позволяет всегда точно знать, какой объект поместил значение кода ошибки в свойство Err. Number, а также в каком объекте возникла ошибка (эта информация содержится в свойстве Err. Source).

Конструкция On Error GoTo 0 отключает обработку ошибок в текущей процедуре. Эта конструкция не задает переход на строку 0 для обработки ошибок, даже если в процедуре имеется строка с номером 0. Если инструкция On Error GoTo 0 не выполнялась, то обработчик автоматически отключается при выходе из процедуры.

Для того, чтобы предотвратить выполнение программы обработки ошибок в тех случаях, когда ошибка не возникла, следует помещать соответствующую инструкцию Exit Sub, Exit Function или Exit Property сразу после подпрограммы обработки ошибки, как в следующем примере:

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

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

Системные ошибки при вызовах библиотек динамической компоновки (DLL) не приводят к возникновению исключений и не перехватываются средствами Visual Basic. При вызове функций из библиотек DLL необходимо проверять, успешно ли возвращается каждое значение (согласно спецификациям API), и в случае неудачи проверять значение свойства LastDLLError объекта Err.

Включает программу обработки ошибок и указывает местоположение этой программы в процедуре; также может использоваться для отключения программы обработки ошибок. Enables an error-handling routine and specifies the location of the routine within a procedure; can also be used to disable an error-handling routine.

Синтаксис Syntax

On Error GoTo line (строка ) On Error GoTo line
On Error Resume Next On Error Resume Next
**On Error GoTo 0** **On Error GoTo 0**

Синтаксис оператора On Error может принимать любую из следующих форм: The On Error statement syntax can have any of the following forms:

Аргумент line представляет собой любую метку строки или любой номер строки. The line argument is any line label or line number.

При возникновении ошибки во время выполнения Управление ветвями осуществляется до строки, что приводит к активации обработчика ошибок. If a run-time error occurs, control branches to line, making the error handler active.

Указанная строка должна быть в той же процедуре, что и оператор On Error; в противном случае происходит ошибка во время компиляции. The specified line must be in the same procedure as the On Error statement; otherwise, a compile-time error occurs.

Примечания Remarks

Если оператор On Error не используется, любая случившаяся ошибка выполнения является неустранимой; то есть в этом случае отображается сообщение об ошибке и выполнение прекращается. If you don’t use an On Error statement, any run-time error that occurs is fatal; that is, an error message is displayed and execution stops.

Если вызывающая процедура содержит включенный обработчик ошибок, он активируется для обработки ошибки. If the calling procedure has an enabled error handler, it is activated to handle the error. Если обработчик ошибок вызывающей процедуры также активный, управление передается обратно через предыдущие вызывающие процедуры до тех пор, пока не будет найден включенный, но неактивный обработчик. If the calling procedure’s error handler is also active, control passes back through previous calling procedures until an enabled, but inactive, error handler is found. Если не удается найти неактивный включенный обработчик ошибок, ошибка является неустранимой в той точке, в которой она фактически произошла. If no inactive, enabled error handler is found, the error is fatal at the point at which it actually occurred.

Процедуры обработки ошибок основываются на значении свойства Number объекта Err для определения причины ошибки. Error-handling routines rely on the value in the Number property of the Err object to determine the cause of the error. Программа обработки ошибок должна проверить или сохранить соответствующие значения свойства в объекте Err, прежде чем может произойти любая другая ошибка или прежде чем будет вызвана процедура, которая может вызвать ошибку. The error-handling routine should test or save relevant property values in the Err object before any other error can occur or before a procedure that might cause an error is called. Значения свойства в объекте Err отражают только самую последнюю ошибку. The property values in the Err object reflect only the most recent error. Сообщение об ошибке, связанное с Err. Number, содержится в Err. Description. The error message associated with Err. Number is contained in Err. Description.

On Error Resume Next вызывает продолжение выполнения с оператора, сразу же следующего за оператором, вызвавшим ошибку выполнения, или с оператора, сразу же следующего за последним вызовом процедуры, содержащей оператор On Error Resume Next. On Error Resume Next causes execution to continue with the statement immediately following the statement that caused the run-time error, or with the statement immediately following the most recent call out of the procedure containing the On Error Resume Next statement. Этот оператор разрешает продолжать выполнение несмотря на ошибку выполнения. This statement allows execution to continue despite a run-time error. Можно поместить программу обработки ошибок туда, где может произойти ошибка, вместо того чтобы переносить управление в другое местоположение в процедуре. You can place the error-handling routine where the error would occur, rather than transferring control to another location within the procedure. Оператор On Error Resume Next становится неактивным, когда вызывается другая процедура, поэтому следует выполнять оператор On Error Resume Next в каждой вызываемой программе, если нужно обрабатывать внутренние ошибки в этой программе. An On Error Resume Next statement becomes inactive when another procedure is called, so you should execute an On Error Resume Next statement in each called routine if you want inline error handling within that routine.

При обработке ошибок, возникающих при обращении к другим объектам, конструкция On Error Resume Next предпочтительнее, чем On Error GoTo. The On Error Resume Next construct may be preferable to On Error GoTo when handling errors generated during access to other objects. Проверка объекта Err после каждого взаимодействия с объектом позволяет устранить неоднозначность в плане того, к какому объекту обращался код. Checking Err after each interaction with an object removes ambiguity about which object was accessed by the code. Вы можете точно определить, какой объект поместил код ошибки в свойство Err. Number, а также какой объект изначально сгенерировал ошибку (объект, указанный в свойстве Err. Source). You can be sure which object placed the error code in Err. Number, as well as which object originally generated the error (the object specified in Err. Source).

Оператор On Error GoTo 0 отключает обработку ошибок в текущей процедуре. On Error GoTo 0 disables error handling in the current procedure. Он не указывает строку 0 в качестве начала кода обработки ошибки, даже если процедура содержит строку с номером 0. It doesn’t specify line 0 as the start of the error-handling code, even if the procedure contains a line numbered 0. Без оператора On Error GoTo 0 обработчик ошибок автоматически отключается, когда выполняется выход из процедуры. Without an On Error GoTo 0 statement, an error handler is automatically disabled when a procedure is exited.

Чтобы не допустить выполнения кода обработки ошибки, когда ошибка не произошла, поместите оператор Exit Sub, Exit Function или Exit Property непосредственно перед программой обработки ошибок, как показано в следующем фрагменте: To prevent error-handling code from running when no error has occurred, place an Exit Sub, Exit Function, or Exit Property statement immediately before the error-handling routine, as in the following fragment:

Неперехваченные ошибки в объектах возвращаются в управляющее приложение, когда объект выполняется как исполняемый файл. Untrapped errors in objects are returned to the controlling application when the object is running as an executable file. В среде разработки неперехваченные ошибки только возвращаются в управляющее приложение, если заданы надлежащие параметры. Within the development environment, untrapped errors are only returned to the controlling application if the proper options are set. Следующие сведения см. в документации ведущего приложения: какие параметры следует задать во время отладки, как задать эти параметры, может ли ведущее приложение создавать классы. See your host application’s documentation for a description of which options should be set during debugging, how to set them, and whether the host can create classes.

Если создается объект, имеющий доступ к другим объектам, следует попытаться обработать ошибки, передаваемые из этих объектов необработанными. If you create an object that accesses other objects, you should try to handle errors passed back from them unhandled. Если вам не удается обрабатывать такие ошибки, сопоставьте код ошибки в Err. Number с одной из собственных ошибок и затем передайте их обратно вызывающей стороне объекта. If you cannot handle such errors, map the error code in Err. Number to one of your own errors, and then pass them back to the caller of your object. Следует указать ошибку, добавив код ошибки в константу vbObjectError. You should specify your error by adding your error code to the vbObjectError constant. Например, если код вашей ошибки — 1052, назначьте его следующим образом: For example, if your error code is 1052, assign it as follows:

Пример Example

В этом примере сначала используется оператор On Error GoTo для указания местоположения программы обработки ошибок в процедуре. This example first uses the On Error GoTo statement to specify the location of an error-handling routine within a procedure. В примере попытка удалить открытый файл генерирует ошибку номер 55. In the example, an attempt to delete an open file generates error number 55. Ошибка обрабатывается в программе обработки ошибок, и затем управление возвращается к оператору, вызвавшему ошибку. The error is handled in the error-handling routine, and control is then returned to the statement that caused the error. Оператор On Error GoTo 0 выключает перехват ошибок. The On Error GoTo 0 statement turns off error trapping.

Затем оператор On Error Resume Next используется, чтобы отложить перехват ошибок таким образом, чтобы контекст ошибки, созданный следующим оператором, мог быть известен для определенных. The On Error Resume Next statement is then used to defer error trapping so that the context for the error generated by the next statement can be known for certain. Обратите внимание, что Err. Clear используется для очистки свойств объекта Err после обработки ошибки. Note that Err. Clear is used to clear the Err object’s properties after the error is handled.

См. также See also

Поддержка и обратная связь Support and feedback

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

Обработчик ошибок позволяет завершить выполнение программы при возникновении ошибки и вывести сообщение пользователю с ее описанием.

Синтаксис выражений с On Error

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

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

Отключает любой включенный обработчик ошибок в текущей процедуре.

Простой обработчик ошибок

Шаблон простейшего обработчика ошибок:

Оператор On Error GoTo размещается в начале процедуры, метка и обработчик ошибок – в конце процедуры. Название метки можно сменить на другое, в том числе на кириллице. Exit Sub обеспечивает выход из процедуры, если блок операторов выполнен без ошибок.

Для вывода описания ошибки используется свойство Description объекта Err.

Примеры обработки ошибок

Пример 1
Деление на ноль:

Результат выполнения кода VBA Excel с обработчиком ошибок:

Пример 2
Выход за границы диапазона:

Результат выполнения кода VBA Excel с оператором On Error GoTo :

Пример использования выражений On Error Resume Next и On Error GoTo 0 смотрите в статье: Отбор уникальных значений с помощью Collection.

Источники:

https://ru. mcfairbanks. com/1790-vba-on-error

https://web-shpargalka. ru/on-error-resume-next-vba-kak-rabotaet. php

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: