Gestion d'erreur

Sur cette page

Sortes d'erreurs

Les instructions de gestion d'erreur

Exemple: Capturer n'importe quelle erreur

Exemple: Capturer une erreur spécifique

Exemple: Utiliser la gestion d'erreur à d'autres fins

Sommaire

Fichier exemples

Collections et tableaux

Dialogues et formulaires

Objets et événements Excel

Conseils de programmation

Liste d'instructions

Sortes d'erreur

Si les messages d'erreur affichés par VBE (erreurs de compilation) sont assez faciles à gérer, puisqu'ils apparaissent avant même qu'on termine ou utilise la procédure, les messages d'erreur VBA (erreurs d'exécution) sont affichés lors de l'exécution, ce qui n'est acceptable qu'en phase de test.
Les messages d'erreur d'exécution sont habituellement incompréhensibles par les utilisateurs ne connaissant pas VBA.
Et souvent par ceux qui le connaissent.

Les instructions de gestion d'erreur

On Error GoTo étiquette
 

Active un branchement différé. Si (lorsque) une erreur d'exécution se produit, l'exécution se poursuit à partir de la ligne identifiée par l'étiquette. Ce branchement différé demeure en vigueur jusqu'à l'exécution d'une autre instruction On Error ou à la fin de la procédure Sub ou Function.
On Error Resume Next
 
Si (lorsque) une erreur d'exécution se produit, VBA passe à l'instruction suivant celle ayant causé l'erreur.
On Error GoTo 0 Désactive toute gestion d'erreur par une ou l'autre forme de On Error.
Resume Valide seulement lorsqu'une erreur a été détectée par un branchement différé On Error.
L'exécution reprend à partir de l'instruction qui a provoqué l'erreur.
Resume Next Valide seulement lorsqu'une erreur a été détectée par un branchement différé On Error.
L'exécution reprend à partir de l'instruction suivant celle qui a provoqué l'erreur.
Resume étiquette Valide seulement lorsqu'une erreur a été détectée par un branchement différé On Error.
L'exécution reprend à la ligne indiquée par l'étiquette.

 

Err

Objet dont les propriétés sont permettent d'identifier une erreur d'exécution. Les propriétés sont initialisées lorsqu'un branchement différé activé par On Error est exécuté.

Principales propriétés:

  • Number Contient le numéro de l'erreur.

  • Description Contient la description de l'erreur.

Les autres particularités de l'objet Err ne sont intéressantes que pour des applications très avancées.

Exemple: Capturer n'importe quelle erreur

Function fnMoyenneMoinsMin(rPlage)
'Auteur: Michel Berthiaume
'Calculer la moyenne
'moins la valeur la plus basse des valeurs d'une plage
Dim cSomme As Currency
Dim cMin As Currency
Dim rCellule As Range

    On Error GOTO Erreur:

    'Initialiser à la 1ère valeur de la plage
    cMin = rPlage.Cells(1, 1).Value

    For Each rCellule In rPlage
        cSomme = cSomme + rCellule.Value
        cMin = fnMin(rCellule.Value, cMin)'Noter l'utilisation d'une fonction dans une fonction
    Next

    fnMoyenneMoinsMin = (cSomme - cMin) / (rPlage.Count - 1)

    Exit Function

Erreur:
    fnMoyenneMoinsMin = "Erreur: " & Err.Description

End Function

Remarquez la présence de Exit Function avant l'étiquette Erreur: qui évite que la gestion d'erreur soit exécutée
lorsqu'il n'y a pas d'erreur.
La présence d'une étiquette n'interrompt pas la procédure.

Exemple: Capturer une erreur spécifique

Sub EnregistrerClasseur()
'Auteur: Michel Berthiaume
'enregistrer le classeur

    On Error GoTo Erreur:

    ActiveWorkbook.Save

    Exit Sub

Erreur:
    If Err.Number = 1004 Then
        If MsgBox("Le fichier est en lecture seule. SVP corriger et cliquer Ok" & _
            vbCrLf & "ou cliquer annuler", vbOKCancel) = vbOK Then
            Resume
        End If
    End If
End Sub

Remarquez la présence de Exit Sub avant l'étiquette Erreur: qui évite que la gestion d'erreur soit exécutée
lorsqu'il n'y a pas d'erreur.
La présence d'une étiquette n'interrompt pas la procédure.

Exemple: utiliser la gestion d'erreur à d'autres fins

Function fnMin(a, b)
'Auteur: Michel Berthiaume
'Retourne le minimum de a ou b
'Retourne "" si la comparaison est impossible

On Error GoTo Erreur

    If a < b Then
        fnMin = a
    Else
        fnMin = b
    End If
 
    Exit Function

Erreur: 'Gère les comparaisons impossibles, comme les pommes vs les oranges
    fnMin = ""
End Function

Remarquez la présence de Exit Function avant l'étiquette Erreur: qui évite que la gestion d'erreur soit exécutée
lorsqu'il n'y a pas d'erreur.
La présence d'une étiquette n'interrompt pas la procédure.

Sommaire

Tout programme doit prévoir les erreurs (exceptions) prévisibles et imprévisibles.

On utilise les instructions de test pour gérer les erreurs prévisibles (validations).

On utilise les instructions de capture et gestion d'erreurs (On Error GoTo) pour spécifier les instructions à exécuter si une erreur se produit lors de l'exécution du programme.

Il faut éviter d'utiliser On Error Resume Next qui permet au programme d'ignorer l'instruction ayant généré l'erreur.

La structure générale d'un programme VBA est donc la suivante:

Sub ou Function...

'Auteur:...

'Description: ...

Dim ... 'Toutes les déclarations

 

On Error GoTo Erreur:    'Installer la capture d'erreurs

 

'Validations: prévoir les exceptions

         'Exit Sub ou exit Function    'Pour terminer le programme au besoin

...

 

'Traitement normal

...

 

Exit Sub ' Ou exit Function    'Fin normale du programme

 

Erreur:

...        'Traitement des erreurs imprévisibles, souvent un message à l'utilisateur

 

End Sub 'Ou End Function 

 

Fichier exemples

Le fichier Excel Tutoriel Exemples Erreurs.xlsm contient les exemples présentés dans la présente section.

 

Suite: Collections et tableaux