Utiliser Try-Catch en VBA

Glen Alfaro 30 janvier 2023
  1. Utilisez On Error Resume Next pour gérer les erreurs dans VBA
  2. Utilisez On Error GoTo 0 pour gérer les erreurs dans VBA
  3. Utilisez On Error GoTo [Label] pour gérer les erreurs dans VBA
Utiliser Try-Catch en 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 :

  1. On Error Resume Next - ignorera toute erreur rencontrée et le code continuera à s’exécuter.
  2. 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.
  3. 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.