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.
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
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:
Resume
Resume Next
Resume <label>
On error goto -1
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