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
Sub test Dim sNom as Sting End Sub |
Message: Erreur de compilation: Type défini par l'utilisateur non défini Cause: Sting n'est pas un type valide |
Sub Test MsgBox Bonjour End Sub |
Message: Erreur de compilation: Variable non définie Cause: Il manque les " |
Sub Test Dim i as long For i = 1 to 20 End Sub |
Message: Erreur de compilation: For sans Next |
Sub Test If Not isNumeric(InputBox("Entrer une valeur")) then MsgBox "Ce n'est pas une valeur" End Sub |
Message: Erreur de compilation: Bloc If sans End If |
Sub Test Dim sRéponse as String Do Réponse = InputBox("Entrer une valeur") Loop until not isNumeric(sRéponse) End Sub |
Message: Erreur de compilation: Variable non définie Cause: sRéponse, pas Réponse, dans le Do |
Ces erreurs sont détectées par VBE dès qu'on tente de passer à la ligne
suivante, ou à chaque fois qu'on tente d'exécuter la procédure.
Elles sont causées par un manque d'attention ou de connaissance du langage.
erreurs d'exécution prévisibles: une suite d'instructions ne
respectant pas la logique VBA.
Sub Test Dim cRéponse as Currency Do cRéponse =InputBox("Entrer une valeur") Loop until not isNumeric(cRéponse) End Sub |
Si l'utilisateur fournit une réponse non numérique: erreur d'exécution 13: Incompatibilité de type |
Function fnMoyenneMoinsMin(rPlage) '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 '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) Next fnMoyenneMoinsMin = (cSomme - cMin) / (rPlage.Count - 1) End Function |
Si le paramètre n'est pas une plage: Message: erreur d'exécution 424: Objet requis Si rPlage ne comporte qu'une cellule, on a une division par 0: Message: erreur d'exécution 6: Dépassement de capacité
|
Function fnMin(a, b) 'Retourne le minimum de a ou b If a < b Then fnMin = a Else fnMin = b End If End Function |
Si a et b sont de nature différente (comparer 3 et Nothing, par exemple): Message: erreur d'exécution 13: Incompatibilité de type |
Ces erreurs ne sont détectées par VBA que lorsqu'on exécute la procédure
dans certaines circonstances, des conditions limites.
Elles sont causées par des maladresses de programmeurs qui oublient qu'une
procédure peut être utilisée dans des contextes
différents de ceux où elle est développée.
erreurs d'exécution imprévisibles: une suite d'instructions qui
ne fonctionnent pas dans des conditions inattendues.
Sub EnregistrerClasseur ActiveWorkbook.Save End Function |
Si le lecteur (dossier) actif est en lecture seule:
Message: |
Ces erreurs ne sont détectées par VBA que lorsque les circonstances
imprévues se produisent.
Elles sont causées par l'utilisation d'un programme en dehors des contextes
prévisibles.
Si les messages d'erreur affichés par VBE (erreurs de compilation) sont assez
faciles à gérer, puisqu'elles 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.
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:
Les autres particularités de l'objet Err ne sont intéressantes que pour des applications très avancées. |
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) 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.
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.
Function fnMin(a, b) 'Auteur: Michel Berthiaume 'Retourne le minimum de a ou b 'Retourne Null 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.
Abonnez-vous à l'infolettre Abonnez-vous à l'infolettre du site pour recevoir les dernières nouvelles et aussi des formations à votre courriel. Vous pouvez voir la liste des dernières infolettres ici. |