LOUNIZARTE
Messages postés11Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 octobre 2010
-
12 oct. 2010 à 16:28
LOUNIZARTE
Messages postés11Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 octobre 2010
-
14 oct. 2010 à 11:19
Bonjour,
je sèche sur un truc simple mais apparemment compliqué pour moi :
Sur vba excel office 2003, je gère un match entre 2 feuilles, la 1er constituée d'1 colonne avec des réfécence en string. L'autre est un tableau d'une longueur = finligne tel que :
Sheets("UR prioritaires").Select
finligneURprio = Range("A65536").End(xlUp).Row 'Numero dernière ligne feuille
x = 2
For ligneURprio = 2 To finligneURprio
cible = Worksheets("UR prioritaires").Cells(ligneURprio, 1).Value
On Error Resume Next
lignematchee = WorksheetFunction.Match(cible, Worksheets("UR0912_IdF(MS)").Range("M2:M" & finligne), 0)
If Err.Number <> 0 Then
Err.Number = 0
GoTo boucle
End If
Worksheets("UR0912_IdF(MS)").Rows(lignematchee + 1).Copy Worksheets("Resultats_UR_Prioritaires").Rows(x)
x = x + 1
boucle:
Next ligneURprio
Tout fonctionne correctement jusqu'à la 40ème lignes ou une erreur 1004 se produit malgré le on error resume next
La conf de la gestion des erreurs/general est correcte et placée sur 'arrêt sur 'les erreurs non gérées'
Merci de m'éclairer si vous avez une idée du phénomène.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 12 oct. 2010 à 20:25
Salut
Trop indigeste (*) sans mise en forme du code : 3ème icone à droite
(*) surtout quand il y a des boucles
Peut-être peux-tu éviter l'erreur plutôt que de la masquer (ce qui n'est jamais bon) : pour cela, il faut approfondir les déclarations de type de tes variables dont on ne sait rien.
La fonction Match doit (pas vérifié) renvoyer un Range.
Dans ce cas, dimensionne une variable As Range, fait ton Match puis test si ta variable Range "Is Nothing", ce qui voudra dire qu'il n'a rien trouvé.
Je vois un Goto : burk burk burk
Pas le courage de remettre en forme, mais il y a forcément un moyen d'éviter ce saut.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_lermite222
Messages postés492Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention 2 juillet 20124 12 oct. 2010 à 21:50
bonjour,
pour éviter ton goto...
If Err.Number <> 0 Then
Err.Number = 0
Else
Worksheets("UR0912_IdF(MS)").Rows(lignematchee + 1).Copy Worksheets("Resultats_UR_Prioritaires").Rows(x)
x = x + 1
End If
LOUNIZARTE
Messages postés11Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 octobre 2010 12 oct. 2010 à 22:14
Bonsoir Lermite222 et Jack, j'ai tout esayé entre autre ce que tu proposes Lermite222, mais l'erreur passe à travers, je n'aimes pas non plus les goto, aussi c'est juste la dernière option que j'ai affiché dans mon code. Pour les variables, autant pour moi, ce sont des entiers long, la variable cible est un string. L'idée est de récupérer la ligne ou ça matche de la feuille "UR0912_IdF(MS)" (car dans la feuille "UR prioritaires", seules sont présentes les clés sur 1 seule colonne) le résultat est placé dans la feuille "Resultats_UR_Prioritaires" qui affiche l'ensemble des infos, mais il se peut que la clé n'ai pas de concordance, c'est le cas pour 2 enregistrements, et c'est au premièr (position 40) que l'erreur 1004 se présente. Ce qui ce passe est vraiment très étrange...
Merci pour votre aide
LOUNIZARTE
Messages postés11Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 octobre 2010 14 oct. 2010 à 11:19
J'ai trouvé une solution, cela pourra peut être servir à d'autre :
En lisant dans de nombreux forums la fonction match poserai certains problèmes notamment dans la cas où elle ne trouve pas de correspondance.
L'erreur 1004 ne peut être gérée de manière classique, du style :
on error resume next ou on error run fonctionRécup() ou encore on error goto etiquette... et un blocage s'installe.
Une des solutions proposée serait :
Set cible = Worksheets("UR prioritaires").Range(Cells(ligneURprio, 1), Cells(ligneURprio, 1))
Set PlageRecherche = Worksheets("UR0912_IdF(MS)").Range("M2:M" & finligne)
If Not IsError(Application.Match(cible, PlageRecherche, 0)) Then
lignematchee = WorksheetFunction.Match(cible, PlageRecherche, 0)
'Worksheets("UR prioritaires").Cells(x, 2).Value = WorksheetFunction.Match(cible, PlageRecherche, 0)
End If
If Err.Number <> 0 Then
Err.Number = 0
GoTo boucle
End If
L'utilisation de IsError(function) est une des solutions proposée pour la gestion de l'erreur 1004.
Bonne journée