number error err excel vba error-handling nested goto

excel - number - VBA anidado en caso de error GoTo



on error goto vba excel (2)

Tengo un código VBA que se supone que es una comprobación de error anidada, pero no es así. El código es psuedo como abajo. Sin embargo, cada vez que se produce un error dentro de un error (por ejemplo, se produce un error en el ciclo, aparece ir a SmallError y se produce un error en SmallError). No se utiliza el segundo GoTo. El error luego rompe el código.

Ex:

Error en Loop

GoTo SmallError

Error en SmallError

Descansos de código (aquí el código debe ir a FatalError)

Sub DoThings() On Error GoTo SmallError ''Coding Happens Do While(conditionhere) ''Looping things happen GoTo LoopResume SmallError: source = Err.source descript = Err.Description On Error GoTo Fatal Error ''Small error processing happens Resume LoopResume FatalError: source = Err.source descript = Err. Description On Error GoTo ExitError ''Fatal Error processing happens ExitError: Exit Sub LoopResume: count = count + 1 Loop On Error GoTo FatalError ''Finishing code happens End Sub


... tienes un Fatal Error en tu Goto lugar de FatalError , que no te llevará al lugar correcto ...

Actualiza tu código a:

On Error GoTo FatalError


No puede usar una declaración On Error dentro de un manejador de errores. Ver, por ejemplo, este artículo que explica esto .

Sin embargo, lo que PUEDE hacer es tener una rutina separada que maneje el "error regular". Esta rutina puede tener un controlador de "error fatal". Su código se vería así:

(Editar: editó el código para habilitar la salida cuando hay un error fatal):

Sub DoThings() On Error GoTo SmallError Dim fatalExit As Boolean ''Coding Happens Do While(conditionhere) ''Looping things happen LoopResume: count = count + 1 Loop On Error Goto SmallError2 ''Finishing code happens Exit Sub SmallError: handleError Err.Source, Err.Description, fatalExit If fatalExit Then Exit Sub Else Resume LoopResume End If SmallError2: handleError Err.Source, Err.Description, fatalExit Exit Sub End Sub Private Sub handleError(ByVal source As String,ByVal description As String, ByRef fatalExit As Boolean) On Error Goto FatalError ''Do "small error" handling here Exit Sub FatalError: fatalExit = True ''Do "fatal error" handling here End Sub