Comment gérer l'absence d'erreur de cas lors de la manipulation des erreurs dans VBA?
J'ai besoin de prendre de l'erreur VBA à l'aide de la GoTo
déclaration comme ceci :
Sub mySub
On Error GoTo errorHandler:
Workbooks.Open("myWorkbook")
'
' Some Code
'
errorHandler:
MsgBox "ERROR"
End Sub
Le problème est que quand il n'y a pas d'erreur, la errorHandler
section est exécutée.
J'ai trouvé cette discussion mais la réponse ne résout pas mon problème.
J'ai essayé d'ajouter un Exit Sub
déclaration, comme l'explique :
Sub mySub
On Error GoTo errorHandler:
Workbooks.Open("myWorkbook")
Exit Sub
'
' Some Code
'
errorHandler:
MsgBox "ERROR"
End Sub
Dans ce cas, on sort de la méthode lorsqu'il n'y a pas d'erreur.
J'ai aussi essayé :
Sub mySub
On Error GoTo errorHandler:
Workbooks.Open("myWorkbook")
'
' Some Code
'
errorHandler:
MsgBox "ERROR"
Exit Sub
End Sub
Mais toujours le même problème: Le errorHandler
est exécutée même si aucune erreur ne se produit.
Vous devez vous connecter pour publier un commentaire.
Vient de mettre à la Sortie des sous dans.
On Error Goto 0
? Donc, OP comprend que c'est une bonne pratique de la réinitialisation d'erreur redirections... Upvoted 🙂On Error GoTo myHandler: Workbooks.Open("myWorkbook") On Error GoTo 0
On Error Goto 0
afin de rendre le code se comporter sans contrôle d'erreur. Et je me souviens que c'était une bonne pratique d'utiliser cette instruction pour éviter imprévisible sauts pour plus tard des erreurs... j'ai cherché sur Google pour voir si j'ai eu tort, mais ici j'ai trouvé un article de me donnerOn Error Goto 0
...On Error GoTo 0
, et je ne l'ai jamais vu dans un gestionnaire d'erreur non plus... je l'ai vu dans unExitProcedure:
type de chose (exemple) pour éviter l'infini erreur de manipulation des "boucles".Voici le modèle que je préfère:
Noter que
Resume
efface l'erreur. J'aime ce modèle pour plusieurs raisons:- Je utiliser
GoTo ExitLabel
pour tout sortie anticipée du Sub ou la Fonction. De cette façon, je suis moins susceptibles de sauter le code de nettoyage par accident. Exemple:Je suis d'avoir exactement le même problème que vous, et les solutions ci-dessus ne fonctionne pas. Ils ne voient même pas que vous avez écrit Exit Sub déjà dans 2 endroits différents dans votre post original. Pas de site en ligne semble comprendre que, parfois, il n'est pas une erreur (si il y en a toujours été va être une erreur, pourquoi avez-vous le code de cette manière?), et quand il n'y a pas une erreur, de toute évidence vous ne voulez pas de Sortie Sub. Ni voulez-vous le myHandler à exécuter quand il n'y a pas une erreur. DUH! C'est la solution que j'ai cam qui semble fonctionner.
GoTo
pour déplacer le code est considéré comme très mauvaise pratique, surtout si vous utilisez plusieursGoTo
consolidés.Exit Sub
en deux mal d'endroits différents. Vous avez juste besoin de le mettre dans le bon endroit (j'.e juste avant votre code de gestion d'erreur).- Je utiliser une instruction if, dans le ErrorHandler, qui va arrêter l'exécution si il n'y a pas d'erreur. Ceci est réalisé en utilisant le Tre.Nombre (Err (objet) nombre (ex: erreur d'Exécution 9: Indice de gamme))
C'est ce que j'ai fait. Fonctionne comme un charme
Utilisez code ci-dessous dans le gestionnaire d'erreurs de l'article: