Utiliser Try-Catch en VBA
-
Utilisez
On Error Resume Next
pour gérer les erreurs dans VBA -
Utilisez
On Error GoTo 0
pour gérer les erreurs dans VBA -
Utilisez
On Error GoTo [Label]
pour gérer les erreurs dans VBA
La méthode Try-Catch
empêche les plantages du programme lorsqu’une erreur interne se produit dans la programmation informatique. Il est utile d’éviter les erreurs système et de permettre le bon déroulement de l’exécution du code.
Cependant, contrairement aux autres langages de programmation, VBA n’a pas le bloc Try-Catch
. Du bon côté, il a des méthodes de contournement conçues explicitement pour les procédures de gestion des erreurs.
Dans cet article, les procédures de gestion des erreurs dans VBA seront abordées et démontrées avec plusieurs exemples qui vous aideront à implémenter des schémas de gestion des erreurs dans votre projet VBA.
Les gestionnaires d’erreurs sont une partie importante de votre code. Ils sont notre personne de référence lorsque le compilateur VBA ne peut pas gérer les choses.
Voici les méthodes de gestion des erreurs VBA :
On Error Resume Next
- ignorera toute erreur rencontrée et le code continuera à s’exécuter.On Error GoTo 0
- arrêtera le code sur la ligne qui provoque l’erreur et affichera une boîte de message décrivant l’erreur.On Error GoTo [Label]
- vous pouvez spécifier ce que vous voulez faire si votre code contient une erreur.
Nous discuterons en détail de toutes ces routines de gestion des erreurs ci-dessous.
Utilisez On Error Resume Next
pour gérer les erreurs dans VBA
Ce gestionnaire d’erreurs permet au compilateur d’ignorer l’erreur et d’exécuter la ligne de code suivante. C’est le gestionnaire d’erreurs fréquemment utilisé dans VBA car il ne nécessite aucun code compliqué à implémenter.
Cependant, lorsque vous utilisez ce gestionnaire d’erreurs, procédez avec précaution car il ignore les erreurs. L’exécution du code peut ne pas s’exécuter comme prévu avec ces erreurs non détectées.
On Error Resume Next
est préférable pour savoir quel type d’erreurs vous êtes susceptible de rencontrer. Et puis, si vous pensez qu’il est prudent d’ignorer ces erreurs, vous pouvez l’utiliser.
Le bloc de code ci-dessous générera une erreur sans routines de gestion des erreurs car la division par zéro n’est pas autorisée mathématiquement.
Sub DivideNumbers()
Dim x,y,z as integer
x = 10/4
y = 15/0
z= 2/5
Debug.Print x & vbNewLine & y & vbNewLine & z
End Sub
Sortie DivideNumbers
:
Error: ! Runtime Error '11':
Division by Zero
Utilisation du gestionnaire d’erreurs On Error Resume Next
:
Sub DivideNumbers()
On Error Resume Next
Dim x, y, z As Integer
x = 10 / 4
y = 15 / 0
z = 2 / 5
Debug.Print x & vbNewLine & y & vbNewLine & z
End Sub
Sortie DivideNumbers
:
2.5
0
La sortie DivideNumbers
indique que la deuxième ligne a été ignorée car une erreur Division by Zero
s’est produite sur cette ligne.
Utilisez On Error GoTo 0
pour gérer les erreurs dans VBA
Le gestionnaire d’erreur On Error GoTo 0
réinitialise le comportement d’erreur par défaut du compilateur.
Alors pourquoi encore l’utiliser ? Le gestionnaire d’erreurs On Error GoTo 0
répond au risque de non-détection des erreurs induit par le gestionnaire d’erreurs On Error Resume Next
. Ainsi, On Error GoTo 0
est généralement utilisé en conjonction avec On Error Resume Next
pour activer la détection d’erreur sur la section de code où aucune erreur ne devrait se produire.
Pour avoir une meilleure explication, voir le bloc de code ci-dessous :
Sub ErrorSub()
On Error Resume Next
'An error could happen in this area but will not be detected.
On Error Goto 0
'Once an Error occurs, an error message will appear.
End Sub
Pour un meilleur exemple, voir le bloc de code ci-dessous.
Sub DivideNumbers()
On Error Resume Next
Dim x, y, z, a, b, c
x = 3 / 2
y = 0 / 0
z = 2 / 6
Debug.Print x & vbNewLine & y & vbNewLine & z
On Error GoTo 0
a = 8 / 7
b = 2 / 0
c = 2 / 7
Debug.Print a & vbNewLine & b & vbNewLine & c
End Sub
Sortie DivideNumbers
:
1.5
0.333333333333333
Puis une erreur s’est produite puisque le On Error Resume Next
a été annulé par le On Error GoTo 0
sur la deuxième partie du code.
Error: ! Runtime Error '11':
Division by Zero
Utilisez On Error GoTo [Label]
pour gérer les erreurs dans VBA
Les deux gestionnaires d’erreurs ci-dessus ne gèrent pas les erreurs ; soit ils ont sauté, soit ils ont négligé l’erreur. Le troisième gestionnaire d’erreurs, On Error GoTo [Label]
, vous permettra de traiter l’erreur et de choisir l’action à entreprendre lorsqu’une erreur se produit.
Il existe plusieurs bonnes pratiques dans l’utilisation de On Error GoTo [Label]
, l’une consiste à mettre fin à l’exécution du code lorsqu’une erreur se produit, et l’autre consiste à corriger l’erreur, puis à réessayer, et bien d’autres. L’exemple ci-dessous illustrera l’utilisation de On Error GoTo [Label]
.
Le bloc de code ci-dessous terminera automatiquement le code lorsqu’une erreur se produit.
Sub DivideNumbertoNumber()
On Error GoTo ErrHandler
Dim i As Integer
For i = 5 To -5 Step -1
Debug.Print i / i
Next i
ErrHandler:
End Sub
Sortie DivideNumbertoNumber
:
1
1
1
1
1
Comme observé, l’exécution du code s’arrêtait lorsque i
= 0 puisque i
divisé par i
signifierait 0 divisé par 0, ce qui entraînerait un débordement.
Dans l’exemple suivant, nous montrerons comment imprimer dans la fenêtre immédiate
en cas d’erreur. Nous pouvons également utiliser la propriété Err.Description
pour imprimer l’erreur réelle.
Sub DivideNumbertoNumber()
On Error GoTo ErrHandler
Dim i As Integer
For i = 5 To -5 Step -1
Debug.Print i / i
Next i
Exit Sub
ErrHandler:
Debug.Print "An Error occured at i is equal to " & i & vbNewLine & "Error Type: " & Err.Description
End Sub
Sortie DivideNumbertoNumber
:
1
1
1
1
1
An Error occured at i is equal to 0
Error Type: Overflow
Notez que Exit Sub
a été placé avant le ErrHandler
pour quitter le sous-programme avant qu’il n’atteigne le ErrHandler
pour les cas où l’erreur ne s’est pas produite. Si le Exit Sub
n’était pas inséré, le compilateur exécuterait le ErrHandler
même s’il n’y avait pas d’erreur.