Boucle avec gestion d'erreur

Résolu/Fermé
Jimmy59116 Messages postés 45 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 30 janvier 2013 - 4 déc. 2012 à 16:14
Jimmy59116 Messages postés 45 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 30 janvier 2013 - 5 déc. 2012 à 09:05
Bonjour,

Je me fais des noeuds au cerveau depuis des heures... Je n'ai jamais utilisé de gestion d'erreur et je suis là face à une situation où elle devient inévitable !

J'ai 2 fichiers avec des listes de noms et des colonnes d'informations.

Le but est d'ajouter dans le premier fichier des informations disponibles dans le second. L'erreur vient du fait qu'il y a des noms dans le second fichier qui ne sont pas présents dans le premier car ils ne sont plus d'actualité.

Un peu de code pour mieux comprendre :

Option Explicit
Dim NOM
Dim i
Dim BOUT1
Dim BOUT2

Sub texte()
On Error GoTo erreur

For i = 1 To 500

' Un astérix en colonne A indique que la ligne est à traiter
Windows("KDO4.xls").Activate
Range("A1").Select
Selection.End(xlDown).Select

' Je récupère les informations à mettre dans le second fichier
ActiveCell.Offset(0, 2).Select
NOM = ActiveCell.Value
ActiveCell.Offset(0, 10).Select
BOUT1 = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
BOUT2 = ActiveCell.Value

' Je rentre les informations dans le second fichier
Windows("KDO3.xls").Activate

' colonne qui contient les noms
Range("B2").Select
Range(Selection, Selection.End(xlDown)).Select

Selection.Find(What:=NOM, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate

ActiveCell.Offset(0, 51).Select
ActiveCell.Value = BOUT1
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = BOUT2

' Je supprime l'astérix pour signaler que la ligne est traitée
Windows("KDO2.xls").Activate
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.ClearContents

' Je vide mes variables pour éviter des erreurs
BOUT1 = ""
BOUT2 = ""

Next i

erreur:
' Traitement des erreurs : j'indique que la ligne est en erreur
' puis je supprime l'astérix pour montrer que la ligne est traitée

Windows("KDO4.xls").Activate

Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, 15).Select
ActiveCell.Value = "erreur"

ActiveCell.Offset(0, -15).Select
ActiveCell.ClearContents

' Je stoppe la gestion d'erreur pour revenir à un traitement normal
On Error GoTo 0

' J'ai ajouté l'arrêt pour les tests, en version finale, j'aimerais faire une boucle continue
Exit Sub

End Sub


En gros, le fichier KDO4.xls contient des noms qui n'existent pas dans KDO3.xls

Du coup, quand je fais ma recherche de nom dans KDO3 il ne trouve rien et passe à la gestion d'erreur. Sauf qu'après avoir géré une erreur, il traite les autres noms (qui eux sont justes) comme des erreurs...

Après des heures passionnantes de lecture sur les forums, je passe la main aux experts qui me permettront de découvrir une fois encore les merveilles du VBA !

D'avance, merci !

Jimmy


2 réponses

Bonjour,

Tu ne places pas ta gestion d'erreur au bon endroit

1)encadrer LA ligne sensée générer une erreur par les instructions
On Error GoTo erreur
-----
On Error GoTo 0
En effet, s'il n'y a pas d'erreur tu dois desactiver immediatement le gestionnaire

2)Si une erreur est générée, l'exécution est déroutée vers l'etiquette erreur, puis doit revenir vers la boucle pour continuer, grace à l'instruction Resume qui branche l'execution sur l'etiquette suite.

3)A la fin de la boucle, on met l'instruction Exit Sub, pour obliger le programme à quitter, sinon les lignes du gestionnaire d'erreur serait executées.


Option Explicit
Dim NOM
Dim i
Dim BOUT1
Dim BOUT2
Sub texte()
For i = 1 To 500
' Un astérix en colonne A indique que la ligne est à traiter
Windows("KDO4.xls").Activate
Range("A1").Select
Selection.End(xlDown).Select
' Je récupère les informations à mettre dans le second fichier
ActiveCell.Offset(0, 2).Select
NOM = ActiveCell.Value
ActiveCell.Offset(0, 10).Select
BOUT1 = ActiveCell.Value
ActiveCell.Offset(0, 1).Select
BOUT2 = ActiveCell.Value
' Je rentre les informations dans le second fichier
Windows("KDO3.xls").Activate
' colonne qui contient les noms
Range("B2").Select
Range(Selection, Selection.End(xlDown)).Select

On Error GoTo erreur

Selection.Find(What:=NOM, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate

On Error GoTo 0

ActiveCell.Offset(0, 51).Select
ActiveCell.Value = BOUT1
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = BOUT2
' Je supprime l'astérix pour signaler que la ligne est traitée
Windows("KDO2.xls").Activate
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.ClearContents

suite:

' Je vide mes variables pour éviter des erreurs
BOUT1 = ""
BOUT2 = ""
Next i

Exit Sub

erreur:
' Traitement des erreurs : j'indique que la ligne est en erreur
' puis je supprime l'astérix pour montrer que la ligne est traitée
Windows("KDO4.xls").Activate
Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(0, 15).Select
ActiveCell.Value = "erreur"
ActiveCell.Offset(0, -15).Select
ActiveCell.ClearContents
' Je stoppe la gestion d'erreur pour revenir à un traitement normal

Resume suite

End Sub
0
Jimmy59116 Messages postés 45 Date d'inscription jeudi 27 novembre 2008 Statut Membre Dernière intervention 30 janvier 2013 1
5 déc. 2012 à 09:05
Excellent, merci pour cette explication qui non seulement répond à la question du jour mais qui me permet en plus de découvrir de nouvelles fonctions.
Bonne journée !
Jimmy
0