Gestion erreur VBA

eriiic

XLDnaute Barbatruc
Bonjour à tous,

Dans le fichier joint je génère 2 erreurs.
La 1ère est bien gérée avec le On Error Goto, pas la 2nde.
Pourquoi ? Que me manque-t-il ?

Merci
eric
 

Pièces jointes

  • Test gestion erreur.xls
    22 KB · Affichages: 157

Dranreb

XLDnaute Barbatruc
Re : Gestion erreur VBA

Bonjour.
Elle n'est pas gérée elle est simplement sautée !
Gérer l'erreur ça veut dire prendre les dispositions nécessaires pour en corriger les conséquences puis informer VB qu'elle a été gérée et que l'exécution doit donc se poursuivre en mode normal et non plus en mode de gestion d'erreur.
En effet quand il est dans ce mode, toute erreur plante, même s'il y a On Error devant.
La seule instruction qui permet d'annuler le mode de gestion d'erreur c'est l'instruction Resume.
Note: Il est généralement plus pratique d'utiliser On Error Resume Next, ainsi il n'est jamais en mode de gestion d'erreur, mais l'objet Err contient quand même de quoi détecter qu'il s'en est produit une.
Cordialement
 

eriiic

XLDnaute Barbatruc
Re : Gestion erreur VBA

Re,

elle est bien gérée avec on error goto, et on le voit sur la 1ère erreur où je me branche bien sur l'étiquette.
Et je ne veux pas utiliser on error resume next puisque ce n'est pas le fonctionnement voulu (je ne veux pas continuer à la suite mais bien sauter des instructions pour continuer le traitement).

aide excel sur on error goto :
On Error GoTo line
Valide la routine de gestion d'erreur commençant à la ligne indiquée dans l'argument line. L'argument line peut être une étiquette de ligne ou un numéro de ligne. En cas d'erreur d'exécution, le contrôle est transmis au point indiqué dans l'argument line, ce qui valide le gestionnaire d'erreurs.
Seulement ça ne marche pas sur la 2nde erreur...

eric
 

Dranreb

XLDnaute Barbatruc
Re : Gestion erreur VBA

Vous êtes têtu.
Si vous ne voulez pas utiliser On Error Resume Next vous êtes obligé de faire :
VB:
    On Error GoTo Erreur1
'   . . .
Suivant1:
'   . . .
    On Error GoTo Erreur2
'   . . .
Suivant2:
    . . .
Exit Sub
Erreur1: Resume Suivant1
Erreur2: Resume Suivant2
End Sub
À +
 

gilbert_RGI

XLDnaute Barbatruc
Re : Gestion erreur VBA

bonjour

peut être comme ceci

Code:
Sub Test()
    Dim i As Integer
    Dim c As Range
    Worksheets("Feuil1").Activate
    On Error GoTo ErrorHandler
    For Each c In Cells.SpecialCells(xlCellTypeFormulas, 23)    ' contrôle des formules
        If i = 0 Then MsgBox ("test1 ok")
        '
    Next c
    i = 0
    On Error GoTo ErrorHandler
    For Each c In Cells.SpecialCells(xlCellTypeConstants, 23)    ' contrôle des constantes
        If i = 0 Then MsgBox ("test2 ok")
        '
    Next c
    Exit Sub
ErrorHandler:
    MsgBox "Erreur: " & Err.Number & vbCrLf & Err.Description
    If i = 0 Then i = 1
    'Reprend l'exécution au niveau de la ligne à l'origine de l'erreur.
    Resume Next
End Sub
 

youky(BJ)

XLDnaute Barbatruc
Re : Gestion erreur VBA

Bonjour à vous,
Je suis bien de l'avis de Dranreb,
Voici une façon de faire avec resume next
Bruno
Code:
Sub test()
    Dim c As Range
    Worksheets("Feuil1").Activate
    On Error Resume Next
    For Each c In Cells.SpecialCells(xlCellTypeFormulas, 23)    ' contrôle des formules
        If Err > 0 Then Err.Clear: GoTo suivant
        MsgBox ("test1 ok")
    Next c
suivant:
    For Each c In Cells.SpecialCells(xlCellTypeConstants, 23)    ' contrôle des constantes
        If Err > 0 Then Err.Clear: GoTo fin
        MsgBox ("test2 ok")
    Next c
fin:
End Sub
 

gilbert_RGI

XLDnaute Barbatruc
Re : Gestion erreur VBA

Re,

elle est bien gérée avec on error goto, et on le voit sur la 1ère erreur où je me branche bien sur l'étiquette.
Et je ne veux pas utiliser on error resume next puisque ce n'est pas le fonctionnement voulu (je ne veux pas continuer à la suite mais bien sauter des instructions pour continuer le traitement).

aide excel sur on error goto :
On Error GoTo line
Valide la routine de gestion d'erreur commençant à la ligne indiquée dans l'argument line. L'argument line peut être une étiquette de ligne ou un numéro de ligne. En cas d'erreur d'exécution, le contrôle est transmis au point indiqué dans l'argument line, ce qui valide le gestionnaire d'erreurs.
Seulement ça ne marche pas sur la 2nde erreur...

eric

voilà de plus amples explications

cliquez ici
 

eriiic

XLDnaute Barbatruc
Re : Gestion erreur VBA

Re,

bien sûr que je suis têtu, sinon je ne prograsserais pas en vba ! :)
Ce n'est pas que je veux pas utiliser On Error Resume Next, c'est que ça ne correspond pas à mon besoin.
Je ne suis pas le premier à vouloir sauter des instructions sur une erreur au lieu de vouloir continuer à la suite.

Ca fait un peu plat de spaghetti mais ta solution utilisant Resume fonctionne.
C'est dommage qu'un 2nd On Error Goto etiquette ne réarme pas la gestion d'erreur...
Merci :)

eric
 
Dernière édition:

néné06

XLDnaute Accro
Re : Gestion erreur VBA

Bonjour à tous
"
Avec "Résume étiquette", cela à l'air de fonctionner.

voici mon code:
Sub test()
Dim c As Range
Worksheets("Feuil1").Activate
On Error GoTo suivant1
For Each c In Cells.SpecialCells(xlCellTypeFormulas, 23) ' contrôle des formules
On Error GoTo 0
MsgBox ("test1 ok")
'
Next c
suivant1:
Resume suite
suite:
On Error GoTo suivant2
For Each c In Cells.SpecialCells(xlCellTypeConstants, 23) ' contrôle des constantes
On Error GoTo 0
MsgBox ("test2 ok")
Next c
suivant2:
End Sub


A+
 

Pièces jointes

  • Copie de Test gestion erreur-1.xls
    31 KB · Affichages: 123

Dranreb

XLDnaute Barbatruc
Re : Gestion erreur VBA

En tout cas, Eriiiic, mettez vous bien en tête qu'en aucun cas l'étiquette désignée par un On Error Goto ne doit faire partie du flot des instructions normale de la procédure. Il est bien expliqué partout que cette instruction est faite pour donner la main à un gestionnaire d'erreur, qui, s'il doit ordonner la poursuite du traitement normal dans la même procédure doit le faire au moyen d'une instruction Resume.
Etrait de l'aide sur On Error :
Un gestionnaire d'erreurs est "validé" lorsqu'il a été désigné par une instruction On Error ; le gestionnaire d'erreurs "actif" est un gestionnaire validé qui traite une erreur. Si une erreur se produit alors qu'un gestionnaire d'erreurs est actif (c'est-à-dire entre la ligne où survient une erreur et une instruction Resume, Exit Sub, Exit Function ou Exit Property), le gestionnaire d'erreurs de la procédure en cours ne peut gérer l'erreur. Le contrôle revient à la procédure appelante. Si la procédure appelante possède un gestionnaire d'erreurs validé, il est activé afin de gérer l'erreur. Si le gestionnaire d'erreurs de la procédure appelante est également actif, le contrôle est restitué aux procédures appelantes antérieures jusqu'à ce qu'un gestionnaire d'erreurs validé mais inactif soit trouvé. Si aucun gestionnaire d'erreurs validé et inactif n'est trouvé, l'erreur est fatale à l'emplacement où elle s'est produite. Chaque fois que le gestionnaire d'erreurs repasse le contrôle à une procédure appelante, cette procédure devient la procédure en cours. Lorsqu'une erreur est gérée par un gestionnaire d'erreurs dans n'importe quelle procédure, l'exécution reprend dans la procédure en cours à l'emplacement désigné par l'instruction Resume.
 

eriiic

XLDnaute Barbatruc
Re : Gestion erreur VBA

Re,

@gilbert_RGI
Merci, j'avais lu ce tuto avant de poster mais je n'y ai pas trouvé ma réponse.
Dans On Error Goto il n'est pas écrit qu'il ne se réarme pas sur le 2nd si on n'utilise pas l'instruction Resume entre deux.

eric
 

eriiic

XLDnaute Barbatruc
Re : Gestion erreur VBA

re re :)

@néné06
Je viens de tester ta solution qui est satisfaisante (plus linéaire, moins spaghetti) et qui confirme nouveau l'obligation d'utiliser Resume.
Merci

@Dranreb
Un gestionnaire d'erreurs est "validé" lorsqu'il a été désigné par une instruction On Error....
Justement l'aide excel dit bien aussi :
On Error GoTo line : Valide la routine de gestion d'erreur
et On Error Goto 0 est sensé la dévalider
ce qui ne semble pas être le cas si Resume n'a pas été utilisé

eric
 

Dranreb

XLDnaute Barbatruc
Re : Gestion erreur VBA

Si, mais c'est écrit d'une façon différente :
Si une erreur se produit alors qu'un gestionnaire d'erreurs est actif (c'est-à-dire entre la ligne où survient une erreur et une instruction Resume, Exit Sub, Exit Function ou Exit Property), le gestionnaire d'erreurs de la procédure en cours ne peut gérer l'erreur.
Cordialement
 

eriiic

XLDnaute Barbatruc
Re : Gestion erreur VBA

@Dranreb,

J'avais édité mon message que tu n'as pas dû voir.
Je passais quand même par On error Goto 0 qui est sensé dévalider la gestion d'erreur.
Si on regarde l'aide :
On Error GoTo 0
Invalide dans la procédure en cours tout gestionnaire d'erreurs validé.
Pour moi le On erreur goto suivant aurait dû s'activer dans ces conditions.
Pour l'instant j'admet le Resume obligatoire mais qcq chose me chagrine quand même :)

eric
 

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin