On Error GoTo ligne ne marche qu'une fois ?

pmfontaine

XLDnaute Occasionnel
Bonjour à tous,
Pour gérer les erreurs dans une macro, On Error GoTo ligne, marche pour une erreur sur recherche non trouvée une première fois, mais si cette erreur se reproduit dans une boucle cela plante.
Voir le code si dessous et le fichier joint.

Sub gestion_erreur()
For a = 1 To 2
On Error GoTo Fin 'ajout
Cells.Find(What:='texte_rechercher', LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate
Exit Sub 'ajout
Fin: 'ajout
MsgBox ('texte_rechercher Pas trouvé') 'ajout
Next a
End Sub

Merci d'avance pour votre aide, car je ne m'en sort pas avec l'aide de Visuel basic. [file name=gestionerreur.zip size=7269]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/gestionerreur.zip[/file]
 

Pièces jointes

  • gestionerreur.zip
    7.1 KB · Affichages: 34

Hervé

XLDnaute Barbatruc
bonsoir pmfontaine

j'ai pas tout compris ce que tu voulais faire avec ton code, mais essaye comme ceci.


Sub gestion_erreur()
Dim a As Byte
Dim c As Range

For a = 1 To 2
       
Set c = Cells.Find(What:='texte_rechercher', LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xl
Next, MatchCase:= _
       
False)

       
If c Is Nothing Then 'ici on test si c'est vide ou pas
                MsgBox ('texte_rechercher Pas trouvé')
'ajout
       
Else
                c.Activate
       
End If
Next a
End Sub


salut
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Bonjour

Bon rien à dire il vaut mieux utiliser la méthode d'Hervé qui est beaucoup plus propre

Sinon pour expliquer le pourquoi lors d'une première erreur la deuxième n'est pas pris en compte tu trouves la raison dans l'aide. En fait tu es toujours dans la gestion de ta première erreur.

recopie de l'aide :

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.
 

pmfontaine

XLDnaute Occasionnel
Bonjour,
Merci à tous les deux pour votre aide, et la solution d'Hervé marche TRES BIEN.
J'avais bien vu l'aide que Pascal76 me site, mais je pensais qu'il y avait moyen de mettre une ligne de réinitialisation de la gestion d'erreur que je n'avais pas trouvé.
 

Hervé

XLDnaute Barbatruc
bonjour pmfontaine, salut pascal

si tu voulais vraiment utiliser un gestionnaire d'erreur pour ton souci, voici la syntaxe :


Sub gestion_erreur()
Dim a As Byte

For a = 1 To 2
       
On Error GoTo Fin 'ajout
        Cells.Find(What:='texte_rechercher').Activate
Next a

Exit Sub 'ajout
Fin:
'ajout

If Err.Number = 91 Then
        MsgBox ('texte_rechercher Pas trouvé')
'ajout
       
Resume Next
Else
        MsgBox Err.Description
End If

End Sub


il te fallait utiliser resume next qui te permet de retourner à l'instruction qui suit celle ayant provoquer l'erreur.

de plus, généralement on ne place pas les gestionnaires d'erreurs dans les boucles for to, etc...mais apres la boucle, c'est ce qui permet d'utiliser des instruction comme resume next ou resume.

En tout cas, on n'utilise pas non plus de gestionnaire d'erreur pour ce type de manip (simple à gérer).

c'est comme utiliser un rouleau compresseur pour ecraser une fourmi.

salut
 

Discussions similaires

Réponses
2
Affichages
758

Statistiques des forums

Discussions
312 489
Messages
2 088 852
Membres
103 974
dernier inscrit
chmikha