Détection d'erreur
Bonjour,
J'ai crée un programme qui fonctionne au vu du cahier des charges. Il y a juste un problème que j'ai identifié dans la gestion d'erreur. Voici deux extraits du code VBA :
Call Flag
If Flag_Error = False Then
Call CopyDataFromIFileToOFile
Call CreationDataOSheet
Call Initialization
Call Decision
Call Acts
Call Total
Call ActsCasings
Call GraphicsDecisions
Call GraphicsActsObjects
Workbooks(Inputfilename).Close
Workbooks(Outputfilename).SaveAs pathOF
Workbooks(Outputfilename).Close
Else
Exit Sub
End IfFlag est la procédure dans laquelle se trouve la vérification de l'absence d'erreurs. Flag_Error est un drapeau changeant d'état (1 ou 0) selon qu'une erreur est détectée ou pas.
Dans la procédure Flag, il y a ceci entre autres :
Workbooks.Open (pathIF)
Set Check_Name = Workbooks(Inputfilename).Worksheets(InputSheetName)
If Check_Name Is Nothing Then
MsgBox "La feuille du classeur d'entrée n'existe pas.", vbCritical, InputSheetName
Flag_Error = True
Workbooks(Inputfilename).Close
Exit Sub
Else
Flag_Error = False
End IfSi j'exécute l'appli. et que je saisie une donnée sans une erreur glissée volontairement, alors il n'y a pas de message. Ce qui est normal. Ca marche bien.
Si j'exécute l'appli. et que je saisie une donnée avec une erreur glissée volontairement, alors le message censé apparaître (voir ci-dessus) n'apparaît pas. A la place, c'est un message de VBA : Erreur d'exécution 9 : l'indice n'appartient pas à la sélection.
Si j'exécute l'appli. une troisième fois et que je saisie une donnée avec une erreur glissée volontairement (la même par exemple), alors le message censé apparaître apparaît. Ca marche bien.
Je ne comprends pas ce comportement. Dans les 1èr et 3ème cas, la procédure est parcourue et l'erreur spécifique est détectée. C'est comme si dans le 2ème cas, elle ne l'était pas car dans le blocage il indique que Flag_Error=False, ce qui est faux puisqu'il y a erreur.
Bonjour,
Ce n'est pas facile de vous donner une réponse adéquate sans voir le fichier où le code complet et la déclaration des variables
je me pose ces questions :
- votre déclaration de variable Dim Flag_Error est placée où ?
- le code s'arrête sur quelle ligne lorsque vous avez l'erreur
Bonsoir,
vous avez également la touche [F8] pour suivre ce que fait VBA pas à pas...
Et pourquoi créer une procédure de gestion d'erreur alors que VBA le fait très bien ?
Sub Test()
Workbooks.Open (pathIF)
On Error GoTo SheetName
Set Check_Name = Workbooks(Inputfilename).Worksheets(InputSheetName)
On Error Resume Next
' le code ci dessous ne tournera que s'il n'y a pas d'erreur sur le nom de la feuille
' on peut ajouter une deuxième gestion d'erreur
On Error GoTo SuitePRG
Call CopyDataFromIFileToOFile
Call CreationDataOSheet
Call Initialization
Call Decision
Call Acts
Call Total
Call ActsCasings
Call GraphicsDecisions
Call GraphicsActsObjects
Workbooks(Inputfilename).Close
Workbooks(Outputfilename).SaveAs pathOF
Workbooks(Outputfilename).Close
On Error Resume Next
' tout c'est bien passé, on quitte la sub
Exit Sub
SheetName:
MsgBox "La feuille du classeur d'entrée n'existe pas.", vbCritical, InputSheetName
Exit Sub
SuiteRPG:
MsgBox "Une erreur s'est produite dans la ""suite"" du programme.", vbCritical
Exit Sub
End SubA voir...
@ bientôt
LouReeD
Bonjour à vous,
Merci tous les 2 !
J'ai ajouté une couche de prévention d'erreur avec la structure :
On Error GoTo Verif
[...]
On Error Resume Next
' tout c'est bien passé, on quitte la sub
Exit Sub
SuiteVerif:
MsgBox "Une erreur s'est produite dans la ""suite"" du programme.", vbCritical
Exit Sub
End SubA priori, ça fonctionne. J'ai fait plusieurs tests d'affilée. Pas d'anomalie relevée. Je retenterai de le faire fonctionner chez moi. Je verrais si je reprends toute la gestion d'erreur ou si je laisse cette couche supplémentaire venant se superposer aux autres. Pour l'instant, je ne suis pas encore arrivé à trouver la cause du problème.
re
J'ai ajouté une couche de prévention d'erreur avec la structure :
ok si cela fonctionne mais ceci m'interpelle :
On Error Resume Next
' tout c'est bien passé, on quitte la sub
Exit SubA priori, le On error resume next ne sert pas à cet endroit puisque la ligne suivante vous sortez du code via l'instruction Exit Sub
Après au début du code cela devrait être ceci il me semble
On Error GoTo SuiteVerifSi ok pensez à fermer le fil.
Cordialement
Bonjour,
Pour l'instant, je ne suis pas encore arrivé à trouver la cause du problème.
lorsqu'une macro essaie d'accéder (faire référence) à une feuille qui n'existe pas, vba interrompt la macro avec une message d'erreur (erreur 9 dans ce cas). Pour gérer les erreurs, il faut utiliser l'instruction on error. Ce que tu retrouves dans les solutions proposées.
Pour activer la gestion personnalisée des erreurs en VBA, plusieurs instructions peuvent être utilisées :
On Error Resume Next
En cas d’erreur, VBA ignore l’erreur et poursuit l’exécution à l’instruction suivante.On Error GoTo NomEtiquette
En cas d’erreur, VBA interrompt l’exécution normale et se dirige vers l’étiquette indiquée.
À cet endroit, on place les instructions de traitement de l’erreur.
Le traitement se termine généralement par une instructionResume:Resume: reprend l’exécution à l’instruction qui a provoqué l’erreur.Resume Next: reprend à l’instruction située juste après celle qui a provoqué l’erreur.Resume NomEtiquette: reprend l’exécution à l’étiquette indiquée.
Pour désactiver la gestion des erreurs :
On Error GoTo 0
Désactive la gestion d’erreur personnalisée et rétablit le comportement normal de VBA.
Bonjour,
Merci pour votre retour et remerciement !
@Dan : si le on error resume next vous interpelle alors vous devez l'être régulièrement en lisant les questions réponses... ça ne sert a rien mais comme screenupdating c'est plus "joli" d'encapsuler le code entre l'arrêt et la remise en route surtout s'il y a des appels de procédure en cascade. Ici au vu du manque de code, on ne sait pas d'où l'on vient et on ne sait pas trop où l'on va. Dans le doute maîtrise total de la gestion d'erreur, non ?
@ bientôt
LouReeD
@LooReed
si le on error resume next vous interpelle alors vous devez l'être régulièrement en lisant les questions réponses...
Qu'est ce qui vous dit que je ne les lis pas...
Mon post n'était pas un reproche mais juste une pensée. Désolé.
Ici au vu du manque de code, on ne sait pas d'où l'on vient et on ne sait pas trop où l'on va.
Exact
Je ne dis pas que vous ne les lisez pas, je dis juste tout comme moi, si je puis me permettre, vous devez voir voir ces "lignes" qui ne servent pas et qui vous hérissent les poils !
With ActiveCell
.Value = "LouReeD"
End WithLe With permet de simplifier le code, mais si ce n'est que pour une instruction alors ce n'est pas nécessaire, comme pour :
Dim Cel As Range
Set Cel = ActiveSheet.Range("A1")
'.....
Cel.Value = "LouReeD"
'....Si Cel ne sert qu'une fois, inutile de la mettre en mémoire... Me semble-t-il, non ?
J'ai arrêté de le signaler, car au fond avec l'indentation du code, cela permet d'encapsuler les lignes concernées par les instructions...
Passez un bon weekend !
@ bientôt
LouReeD
@LouReeD,
j'ai appris quelque chose aujourd'hui,
Donc, mon poste est un peu dans la zone grise. Ce "on erreur" sauve la macro parce qu'ainsi elle ne s'arrête pas en erreur mais on ne connait pas la raison sauf avec (cfr ici dessous) mais on ne sait pas dans quel "call" et cela est ambetent.
Avec votre méthode, on ajoute une autre dimension d'experience à cet outil et je suppose que c'est très pratique pour les experts mais cela "hérissent les poils" des autres. Que pensez-vous ...
...
On error goto Verif
....
Exit Sub
Verif:
MsgBox "Numéro de l'erreur " & Err.Number & vbLf & Err.Description, vbCritical, "on a eu une erreur"
End Sub@LooReed
Le With permet de simplifier le code, mais si ce n'est que pour une instruction alors ce n'est pas nécessaire
.....
Si Cel ne sert qu'une fois, inutile de la mettre en mémoire... Me semble-t-il, non ?
Parfaitement !
Quelques fois ce sont des résidus de modifications des codes que l'on laisse en l'état au lieu de corriger. Et pour celui qui intervient, on se pose la question du pourquoi
Merci et passez également un bon WE !
@Bsalv
Donc, mon poste est un peu dans la zone grise. Ce "on erreur" sauve la macro parce qu'ainsi elle ne s'arrête pas en erreur mais on ne connait pas la raison sauf avec (cfr ici dessous) mais on ne sait pas dans quel "call" et cela est ambetent.
Exactement. De mon coté je suggère toujours plusieurs petites macros plutôt qu'une longue. Surtout avec VBA car on arrive trop vite à une "usine à gaz"
Bon WE !
Crdlt
BsAlv,
Le code de mercredi était de permettre au demandeur de gérer l'erreur d'une feuille absente du classeur, et ne pas laisser VBA s'en charger avec l'indice n'appartient pas à la sélection... comme cela l'utilisateur sait que c'est un problème de feuille.
Je suis resté sur sa "structure" de code pour la forme, et le fait de mettre une deuxième étiquette cela permet de différencier l'erreur en fonction de la partie du code affecté. Mais c'est loin d'être optimisé, mais avec le peu de données fournies cela me semble suffisant après tout.
Pour la mise en place d'une bonne gestion des erreurs il faudrait voir l'application dans son ensemble.
Et pour ce qui est des quelques lignes c'est ce que je dis avec l'encapsulage du code.
Merci de bien vouloir sortir de la zone grise, c'est un bon week-end (ensoleillé) qui s'annonce.
@ bientôt
LouReeD