Что делать, когда обработчик ошибок VBA вызывает ошибку? - PullRequest
0 голосов
/ 21 марта 2020

В настоящее время я работаю над более крупной программой, которая может в какой-то момент выдать ошибку. Поэтому я добавил обработчик ошибок для этого случая. Основная цель - закрыть открытую книгу Excel wbk, чтобы в фоновом режиме не запускалось слишком много приложений Excel. Поскольку я не знаю, какая часть программы может вызвать ошибку, я не знаю, состояние wbk и открыто оно или нет. Я попытался добавить проверку для Nothing, но wbk is Nothing кажется ложным в этот момент. С помощью следующего кода я получу The remote server machine does not exist or is unavailable (Error 462) при вызове обработчика ошибок:

Обработчик ошибок

On Error Resume Next
resp = MsgBox(prompt:="Es ist ein Fehler aufgetreten! " & vbCrLf & vbCrLf & "Soll versucht werden weiter fortzufahren?" & _
    vbCrLf & vbCrLf & "Fehlercode: " & str(Err.Number) & " entstanden durch " & Err.Source & Chr(13) & Err.Description, _
    Buttons:=vbCritical + vbYesNo + vbDefaultButton1, _
    title:="Unbekannter Fehler", _
    HelpFile:=Err.HelpFile, _
    Context:=Err.HelpContext)

If Not wbk Is Nothing Then
    wbk.Close False
End If

If resp = vbNo Then Exit Sub
Resume Next

Afaik, я даже не должен получить ошибку из-за On Error Resume Next. Редактировать: Следует, поскольку "Средство обработки ошибок все еще активно, когда возникает вторая ошибка, и, следовательно, вторая ошибка не перехватывается инструкцией On Error." - источник

TL; DR: wbk должен быть закрыт при обработке ошибок, если он открыт, но выдает ошибку.

Редактировать: Вызываю ошибку, чтобы вызвать обработчик ошибок. Указанная ошибка возникает только во втором выполнении, поэтому значение wbk устанавливается нормально, затем рабочая книга закрывается и программа вызывается снова, и ошибка вызывается до повторной инициализации wbk.

1 Ответ

0 голосов
/ 21 марта 2020

Во время второго выполнения, wbk имеет любое значение, которое имеет после вызова wbk.Close, это не Nothing. Я теперь явно установил Set wbk = Nothing после закрытия, и ошибка больше не возникает из-за проверки Ничего выше.

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

...