LeCompagnon.info

VBA pour Excel

VBA pour Excel

VBA pour Excel - 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

Accueil
Concepts de programmation
VBE l'éditeur VBA
Déclarations, types, références, expressions et assignations
Tests et branchements
Les boucles
Gestion d'erreur
Collections et tableaux
Dialogues et formulaires
Objets et événements Excel
Conseils de programmation
Liste d'instructions
Autres formations

Word 2003
Word 2007
Excel
Excel 2007/2010/2013
PowerPoint 2003
PowerPoint 2007
Access
Access 2010
Internet
Général
Intelligence financière
Vidéos

Navigation
Précédent
Suivant
Page Principale
FAQ
Nouveautés
Plan du site
Références
Motivations
Manuels de formation
Fichiers de démonstration
Contact
Par courriel

Abonnez-vous à
l'infolettre LCI
Partager






Abonnez-vous à l'infolettre LeCompagnon.info

201 fonctions pour les pressés









 

Sortes d'erreur

-erreurs de syntaxe: une instruction ne respectant pas la syntaxe VBA:
 
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:
erreur d'exécution 1004:
Impossible d'accéder au document en lecture seule

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.

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)
    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 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.




 

Vous avez apprécié cette page?

Dîtes que vous l'aimez en utilisant le bouton Facebook, Twitter ou l'un des autres services sous le bouton "Share".

Cliquez sur le bouton de votre choix

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.


Cliquez ici pour vous abonner à l'infolettre





Ce site est hébergé par 1&1.com