Gestion d\'erreur

PascalXLD

XLDnaute Barbatruc
Modérateur
Gestion d'erreur

Bonjour

Voilà il y a un petit truc que je ne comprends pas

Dans un code je copie une feuille dans un classeur.
Si le classeur n'est pas ouvert je gère l'erreur en envoyant le code vers une ligne qui me crée ce classeur et me l'enregistre

Tout marche bien pour le premier passage de la boucle :
Il veut copier la feuille dans le classeur qu'il ne trouve pas il va à la ligne pour créer le classeur me l'enregistre. La boucle continue il ne trouve pas le 2ème classeur mais là il ne va pas à la ligne création de fichier il Bug

Alors petite question: Pourquoi ?

Je pourrais bien sûr faire un test avant mais ce qui m'embète c'est que je ne comprends pas le pourquoi ça marche pas.

J'ai essayé un désactivant l'erreur pour le réactiver mais cela fait la même chose

Merci d'avance pour ceux qui m'aideront

Je mets la partie du code pour voir

If Sheets('Problemes').Cells(MonNumeroPbe, ColDebriefCopies) <> '' Then
VarNomDebrief = Split(Sheets('Problemes').Cells(MonNumeroPbe, ColDebriefCopies), '/')
For ye = 1 To UBound(VarNomDebrief)
On
Error GoTo CreationClasseur
ThisWorkbook.Sheets('Rapport').Copy After:=Workbooks('InfoAst' & VarNomDebrief(ye) & '.xls').Sheets(Workbooks('InfoAst' & VarNomDebrief(ye) & '.xls').Sheets.Count)

GoTo fin

CreationClasseur:
Sheets('Rapport').Copy
ActiveWorkbook.SaveAs Filename:='C:\\\\\\\\tmp\\\\\\\\InfoAst' & VarNomDebrief(ye) & '.xls'

fin:
Next
End If

Message édité par: Pascal76, à: 19/09/2005 13:27
 

Ti_

Nous a quitté
Repose en paix
Re:Gestion d'erreur

Salut Pascal

Outre le fait que ta gestion d'erreur n'est absolument pas ce qu'on peut conseiller de faire, ton programme ne planterait plus si à la place de On Error Goto 0, tu mettais Resume Next, ce qui provoquerait un retour à la ligne Goto Fin.

Ceci dit, tu ferais mieux à chaque fois de tester l'existence de ton fichier, puis, s'il n'existe pas, de le créer dans une autre procédure. Oui je sais, c'est un peu plus complexe que de mettre des Goto, mais incomparablement plus lisible. En conditions normales, la seule chose qu'on devrait s'autoriser avec les On Error Goto, c'est l'affichage d'un message d'erreur et la sortie de la procédure.
(A la rigueur tu pouvais aussi mettre un On Error Resume Next, puis un test d'erreur - If Err Then et création du nouveau fichier dans la boucle If... Then, en n'oubliant pas alors de réinitialiser le gestionnaire d'erreur : Err.Clear)

Tiens, une petite précision à propos de Resume :

Resume Next : poursuit la procédure à la ligne suivant celle qui a provoqué l'erreur

Resume : reprend la procédure à la ligne qui a provoqué l'erreur.

Message édité par: Ti_, à: 19/09/2005 13:32
 

Creepy

XLDnaute Accro
Re:Gestion d'erreur

Bonjour le Forum, Pascal,

A mon avis c'est un problème de gestion des GOTO. j'aurais aimé avoir un exemple pour voir mais bon c 'est po grave.

Essaie de Metttre des exit sub et puis je comprends pas bien pourquoi tu mets ta routine CreationClasseur au milieu !! ?? !!

Met là à la fin et tu sera pas obligé de poser un goto fin !

Enfin voila ma proposition.

@+

Creepy

Sub Test()
If Sheets('Problemes').Cells(MonNumeroPbe, ColDebriefCopies) <> '' Then
&nbsp; &nbsp; VarNomDebrief = Split(Sheets('Problemes').Cells(MonNumeroPbe, ColDebriefCopies), '/')
&nbsp; &nbsp;
For ye = 1 To UBound(VarNomDebrief)
&nbsp; &nbsp; &nbsp; On
Error GoTo CreationClasseur
&nbsp; &nbsp; &nbsp; ThisWorkbook.Sheets('Rapport').Copy After:=Workbooks('InfoAst' & VarNomDebrief(ye) & _
&nbsp; &nbsp; &nbsp; '.xls').Sheets(Workbooks('InfoAst' & VarNomDebrief(ye) & '.xls').Sheets.Count)
&nbsp; &nbsp;
Next
End If
Exit Sub

CreationClasseur:
Sheets('Rapport').Copy
ActiveWorkbook.SaveAs Filename:='C:\\\\tmp\\\\InfoAst' & VarNomDebrief(ye) & '.xls'

End Sub
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Re:Gestion d'erreur

merci aussi Creepy

Mais il faut que la boucle continue après la création du classeur car je peux en avoir d'autres à créer mais c'est vrai que je pouvais sortir la création du classeur de la boucle en finissant par Resume Next. Mais c'est maintenant que j'ai compris la gestion du On Error avec l'actif et le validé que je comprends ce truc ce qui evite le goto fin.

En fait je venais juste en relisant l'aide de voir un truc qui m'avait échappé sur le on error c'est la notion de 'validé' et 'actif'

Voilà ce que dit l'aide (j'ai mis en bleu gras la ligne que je n'avais pas saisi):
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.


Encore merci à vous deux et Ti je vais suivre tes conseils mais mine de rien cela m'énervait de pas comprendre

Message édité par: Pascal76, à: 19/09/2005 13:56
 

Hellboy

XLDnaute Accro
Re:Gestion d'erreur

Bonjour a tous


Juste pour mettre mon grain de sel. Pour la gestion d'erreur, dans ton exemple Pascal76, étant donnée que tu boucle et que l'erreur peut se produire plus d'une fois, il est bien d'annuler l'erreur lorsqu'elle est réglé, pour être sur que ce ne soit pas la même erreur qui est traité lors du re-bouclage.


Sub Test()
If Sheets('Problemes').Cells(MonNumeroPbe, ColDebriefCopies) <> '' Then
&nbsp; &nbsp; &nbsp; &nbsp; VarNomDebrief = Split(Sheets('Problemes').Cells(MonNumeroPbe, ColDebriefCopies), '/')
&nbsp; &nbsp; &nbsp; &nbsp;
For ye = 1 To UBound(VarNomDebrief)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
On Error GoTo CreationClasseur
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ThisWorkbook.Sheets('Rapport').Copy After:=Workbooks('InfoAst' & VarNomDebrief(ye) & _
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; '.xls').Sheets(Workbooks('InfoAst' & VarNomDebrief(ye) & '.xls').Sheets.Count)
&nbsp; &nbsp; &nbsp; &nbsp;
Next
End If
On Error GoTo 0
Exit Sub
CreationClasseur:
Sheets('Rapport').Copy
ActiveWorkbook.SaveAs Filename:='C:tmpInfoAst' & VarNomDebrief(ye) & '.xls'
Err.Clear
Resume Next
End Sub
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Re:Gestion d'erreur

Merci Hellboy

Je ne comprends pas trop ce que tu veux dire

J'ai fait ceci et cela à l'air de marcher sans le on error goto 0 et le Err.clear

Sub EnvoiInfo()
Déclaration des variables et début du code



If Sheets('Problemes').Cells(MonNumeroPbe, ColDebriefCopies) <> '' Then
VarNomDebrief = Split(Sheets('Problemes').Cells(MonNumeroPbe, ColDebriefCopies), '/')
For ye = 1 To UBound(VarNomDebrief)
On
Error GoTo CreationClasseur
ThisWorkbook.Sheets('Rapport').Copy After:=Workbooks('InfoAst' & VarNomDebrief(ye) & '.xls').Sheets(Workbooks('InfoAst' & VarNomDebrief(ye) & '.xls').Sheets.Count)
'Suite du code
Next
End If

'Suite du code

Exit Sub
CreationClasseur:
Sheets('Rapport').Copy
ActiveWorkbook.SaveAs Filename:='C:\\\\\\\\tmp\\\\\\\\InfoAst' & VarNomDebrief(ye) & '.xls'
Resume Next
End Sub

Message édité par: Pascal76, à: 19/09/2005 14:36
 

Hellboy

XLDnaute Accro
Re:Gestion d'erreur

re

Excuse moi Pascal76, j'ai pas été assez clair.

Je ne dis pas que ça ne marche pas, mais si un jour tu as plus d'une erreur a géré, c'est plus une question de savoir ce que veut dire les deux énoncés, leur différence et leur importance.

Lorsqu'il y a une erreur, un numéro d'erreur est généré. La façon de la voir est l'utilisation de Err:
Contient des informations sur les erreurs d'exécution.

Le Err.clear sert a mettre l'erreur a zéro.

Le Error goto 0 sert a annuler le gestionnaire d'erreur.

Désolé, pour mon manque d'information !

A+
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Re:Gestion d'erreur

Ok

C'est comme cela que j'avais compris le on error goto 0 et le err.clear, mais excuse moi je n'avais pas trop compris ton explication au début et j'avais du mal à remettre ta phrase avec leur utilisation. Mais maintenant c'est bon ta dernière explication conforte ce que j'avais compris

Bonne journée
 

Discussions similaires

Réponses
2
Affichages
138
Réponses
5
Affichages
135

Statistiques des forums

Discussions
312 321
Messages
2 087 266
Membres
103 501
dernier inscrit
talebafia