VBA: отображение стандартного обработчика ошибок во время выполнения - PullRequest
4 голосов
/ 30 декабря 2010

У меня есть вопрос о правильном способе обработки ошибок в VBA в Excel. Если возникает конкретная ошибка, скажем, ххххххх, то должен отображаться MsgBox. Если возникает другая ошибка, должен появиться стандартный обработчик ошибок времени выполнения. Как это можно сделать? Вот пример кода:

On Error Resume Next

'Line of code that causes an error here.

If Err.Number = xxxxxxx Then

    MsgBox "Specific error message."

ElseIf Err.Number = 0 Then

    Do nothing

Else 'Some error other than xxxxxxx.

    'This is the problem. Here I would like to display standard run-time error
    'handler without causing the error again.

End If

On Error GoTo 0

Ответы [ 4 ]

3 голосов
/ 30 декабря 2010

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

MsgBox "Run-time error '" & Err.Number & "':" & _
    vbNewLine & vbNewLine & _
    Error(Err.Number), vbExclamation + vbOKOnly, _
    "YourProjectNameHere"

Но это просто факсимиле.Это не фактическое сообщение об ошибке, которое выдает VB6;это просто отформатировано, чтобы выглядеть так.Обработка ошибок все еще отключена оператором «On Error Resume Next» на этом этапе.

Но если вы действительно, реально хотите вызвать стандартный код обработки ошибок, вы можете поместить это в блок «Else»:

Dim SaveError As Long
SaveError = Err.Number
On Error Goto 0
Error (SaveError)

Этот код сохраняет номер ошибки, повторно включает обработку ошибок, а затем повторно вызывает ошибку.Таким образом вы вызываете механизм обработки ошибок VB во время выполнения.Но будьте осторожны: если эта ошибка не будет обнаружена активным обработчиком ошибок где-то выше в цепочке вызовов, она завершит вашу программу после того, как пользователь нажмет кнопку «ОК».

Обратите внимание, что вы также потеряете возможность получить фактический номер строки, где произошла ошибка, используя «Erl» в этом обработчике ошибок, потому что вы заново генерируете ошибку времени выполнения с помощью оператора «Error (SaveError)».Но это, вероятно, не будет иметь значения, потому что большая часть кода VB на самом деле не использует никаких номеров строк, поэтому Erl в любом случае просто возвращает 0.

0 голосов
/ 31 декабря 2010

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

Спасибо, Джефф, за эту интригующую идею.

Dim savedNumber As Long<br>
On Error Resume Next<br>
'Line of code that causes an error.<br>
If Err.Number = XXXXXXX Then<br>
    'Specific error message.<br>
ElseIf Err.Number <> 0 Then<br>
    savedNumber = Err.Number<br>
    On Error GoTo 0<br>
    Error savedNumber<br>
End If<br>
Err.Clear<br>
On Error GoTo 0
0 голосов
/ 30 декабря 2010

В опциях VBA выберите «Разбить необработанные ошибки».
Чтобы включить обработку, используйте on error goto SomeLabel или on error resume next.
Чтобы остановить обработку ошибок, используйте on error goto 0.

ВашВопрос противоречив в этом контексте.Если вы включаете обработку ошибок, вы отключаете стандартную обработку ошибок.

Как предлагает DaMartyr, вы все равно можете использовать что-то вроде msgbox err.description.

0 голосов
/ 30 декабря 2010

Заменить при ошибке Возобновить Далее с

On Error Goto SomePlaceInCodeToHandleErrors

SomePlaceInCodeToHandleErrors:
If Err.Number = XXXX Then
MSGBOX "Message"
End If

Проверьте Поток переполнения стека для получения дополнительной информации и примера кода.

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