web-dev-qa-db-fra.com

Différence entre 'on error goto 0' et 'on error goto -1' - VBA

Quelqu'un peut-il trouver la différence entre "On error goto -1" et "on error goto 0" dans VBA? J'ai essayé google et msdn, mais je n'ai pas eu de chance.

39
sterlingalston

On Error GoTo 0 Désactive toute interception d'erreur actuellement présente dans la procédure.

On Error GoTo -1 Efface le traitement des erreurs et ne le règle pas, ce qui vous permet de créer un autre piège d'erreur.

Exemple: On Error GoTo -1

Une fois que la première erreur est générée, GoTo ErrorFound Sera effacé, ce qui effacera le traitement des erreurs de la routine et en définira un nouveau, qui GoTo AnotherErrorFound Sera détecté lorsqu'une erreur sera détectée.

Sub OnErrorGotoMinusOneTest()

    On Error GoTo ErrorFound

    Err.Raise Number:=9999, Description:="Forced Error"

    Exit Sub

ErrorFound:

    On Error GoTo -1 'Clear the current error handling
    On Error GoTo AnotherErrorFound 'Set a new one
    Err.Raise Number:=10000, Description:="Another Forced Error"

AnotherErrorFound:

    'Code here

End Sub

Exemple: On Error GoTo

Une fois la première erreur générée, vous recevrez le message d'erreur car le traitement des erreurs a été désactivé.

Sub OnErrorGotoZeroTest()

    On Error GoTo 0

    Err.Raise Number:=9999, Description:="Forced Error"

End Sub
56
Francis Dean

Cette réponse évite la confusion entre l'objet d'erreur et le gestionnaire d'erreurs.

L'objet d'erreur peut être effacé à l'aide de Err.Clear. Cela n'affecte pas le gestionnaire d'erreurs.

Le gestionnaire d'erreurs est activé en utilisant On Error Goto <label>. Il devient actif lorsqu'une erreur survient.

Tant que le gestionnaire d'erreurs est actif , vous ne pouvez pas affecter de nouveau gestionnaire d'erreurs. On Error Goto <label> n'aura aucun effet. VBA ignore simplement la tentative d'attribution d'un nouveau gestionnaire d'erreurs.

En utilisant Err.Clear n'annule pas le gestionnaire d'erreurs.

Passer à un endroit différent dans le code en utilisant Goto <label> n'annule pas le gestionnaire d'erreurs. En utilisant Goto <label> dans un bloc de traitement des erreurs peut être source de confusion et doit être évité. Vous pourriez penser que le gestionnaire d'erreurs n'est plus actif alors qu'en réalité, il l'est toujours.

L'effet d'un gestionnaire d'erreurs actif est que vous ne pouvez pas affecter un nouveau gestionnaire d'erreurs. On Error Goto <label> n'aura aucun effet. VBA ignore simplement la tentative d'attribution d'un nouveau gestionnaire d'erreurs. Toute erreur supplémentaire ne sera pas gérée tant que le gestionnaire d’erreur sera actif.

Le seul moyen de quitter un gestionnaire d'erreurs actif est le suivant:

  1. Resume
  2. Resume Next
  3. Resume <label>
  4. On error goto -1
  5. sortir de la procédure

L'utilisation de l'une de ces méthodes pour quitter le gestionnaire d'erreurs effacera également l'objet d'erreur.

Excellente source: Pearson Error Handling In VBA Puce Pearson ne mentionne pas On error goto -1 dans son article. Pour le citer:

J'ai volontairement omis d'inclure On Error GoTo -1, car il ne sert à rien et peut verrouiller toute l'application Excel s'il n'est pas utilisé exactement de la bonne manière. Oui, On Error GoTo -1 est syntaxiquement valide, mais c'est comme donner une arme à feu à un adolescent ivre. Rien de bon n'en sortira.

Vous pouvez également gérer les erreurs en ligne sans utiliser de gestionnaire d'erreur à l'aide de l'objet d'erreur: Gestion des erreurs en ligne MSDN

14
D_Bester