2016-01-12 3 views
0

Имея некоторые проблемы, понимаете, что делает обработка ошибок, когда вы вызываете/выполняете суб или функцию из под.Обработка ошибок Excel VBA при вызове/запуске sub из подкатегория

  • Если не обрабатывается ошибка в вызываемом sub, применяется ли обработка ошибок из источника?

  • Если при обработке ошибок в вызываемом супе есть «exit sub» или «Exit Function», будет продолжен запуск источника?

ASD ASD

Sub Testing() 
    On Error GoTo ErrorHandling 
     Application.ScreenUpdating = False 
     Application.Calculation = xlCalculationManual 
     Application.EnableEvents = False 

    Call TestMinorSub 

     ExitHandling: 
      Application.ScreenUpdating = True 
      Application.Calculation = xlCalculationAutomatic 
      Application.EnableEvents = True 
      Exit Sub 

     ErrorHandling: 
      MsgBox Err.Description 
      Resume ExitHandling 
     End Sub 

ответ

2

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

Таким образом, в этом примере, если к югу вызываются из какого-либо сайта вызова ...

1. Никакие ошибок После вызова TestMinorSub к югу продолжается на своем пути, пока он не выйдет через выход к югу.

2. В TestMinorSub имеется ошибка. В TestMinorSub имеется обработчик ошибок. Это будет обрабатывать ошибку в соответствии с ее определением в этой функции. Эта функция может либо проглотить ошибку, либо поднять ее обратно к тесту тестирования, используя Err.Raise.

3. В TestMinorSub и TestMinorSub отсутствует ошибка. Это будет проходить стек вызовов для обработчика и перейти обратно к функции тестирования, которая будет обрабатывать ее. Он перейдет на метку ErrorHandling (это четный обработчик для этой функции), где он отображает ошибку через окно сообщения. Затем он продолжает ярлык ExitHandling, где он будет выполнять оставшийся код перед выходом из функции.

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

2

Чтобы ответить на первый вопрос, обратите внимание на следующий фрагмент кода. Там нет обработки ошибок в AnotherSub и поэтому обработка ошибок SourceSub «s пинки в:

Sub SourceSub() 

On Error GoTo Err: 

Call AnotherSub 

MsgBox "Source completed" 
Exit Sub 

Err: 

MsgBox "An error occurred in source" 

End Sub 

Sub AnotherSub() 

'On Error GoTo Err: 

MsgBox Application.WorksheetFunction.Match("1", "abcd", 0) 
Exit Sub 

Err: 

MsgBox "An error occurred in ANotherSub" 

End Sub 

В результате SourceSub не завершается, как вы можете увидеть, что линия MsgBox "Source completed" не выполняется.

Чтобы ответить на ваш второй вопрос, если вы раскомментировать обработку ошибок от AnotherSub (On Error Goto Err:) AnotherSub будет обрабатывать ошибку, и в результате, SourceSub будет работать до завершения указанного тем достигается окно сообщения, показывая источник завершен.

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

1

Здесь начинается обработка ошибок.

On Error GoTo ErrorHandling 

Если ошибка, то перейти к ErrorHandling
Если нет ошибок следующего кода Виля бежать. Если нет ошибки суб выйдет перед «Exit Sub»

ExitHandling: 
    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
    Application.EnableEvents = True 
    Exit Sub 

Если произошла ошибка код goea в этом месте и будет запускать эти строки и перейдите в раздел «ExitHandling»:
ErrorHandling: MsgBox Err.Description Резюме ExitHandling

End Sub 
Смежные вопросы