détection d'une cellule avec la méthode Find en VBA

SkyCorp

XLDnaute Junior
Bonjour à tous,

J'utilise actuellement ce code :
Code:
Set zoneRecherche = Range(debcat(nbCat), fincat(nbCat)).Offset(1, 0)
With zoneRecherche
    Set DonneeCherchee = .Find(tab_sscat(k), LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)
End With
For l = 1 To (fincat(nbCat).Column - debcat(nbCat).Column + 1)
    If Not DonneeCherchee Is Nothing Then
        Debug.Print "DonneeCherchee est en " & DonneeCherchee.Address
        ...

Quand mes données de ma zone de recherche sont différentes, pas de soucis.
Mais lorsque j'ai 2 valeurs identiques, mon code sélectionne la 2ème valeur. Or je dois sélectionner la 1ère valeur.
J'ai essayé avec SearchDirection:=xlPrevious, au cas où je n'aurai pas bien compris comment ça fonctionne, mais ça ne change rien.

Quelle est la bonne syntaxe de la méthode Find pour sélectionner la 1ère valeur ?

Merci d'avance pour votre aide
 

néné06

XLDnaute Accro
Re : détection d'une cellule avec la méthode Find en VBA

Bonjour SkyCorp,

Plutôt que "Find", pourquoi pas "Match" qui est environ 200 fois plus rapide et qui donne la première valeur trouvée dans une colonne ?
exemple:
numéro _de_ligne_recherchée= Application.Match(ma_valeur_recherchée, Range("A:A"), 0)

A+

René

Edit: Bien le bonjour Jacques!
 

SkyCorp

XLDnaute Junior
Re : détection d'une cellule avec la méthode Find en VBA

Merci beaucoup pour ce lien.
Cependant, j'ai beau lire et relire, je n'arrive pas à voir ce qui ne va pas dans mon code
Par défaut, Find est bien sensé me fournir la 1ère valeur trouvée en principe ?

Edit : je regarde ça de suite néné06
 

néné06

XLDnaute Accro
Re : détection d'une cellule avec la méthode Find en VBA

Re,

J'oublie de dire que si la valeur recherchée n'est pas présente, numéro _de_ligne_recherchée= Erreur donc placer:

If isnumeric(numéro _de_ligne_recherchée) then
'Suite du programme
else
MsgBox("Valeur non trouvée")
etc...
endif

A+

René
 

SkyCorp

XLDnaute Junior
Re : détection d'une cellule avec la méthode Find en VBA

Je suis en train de remplacer tous mes find par des match.
Tout fonctionne bien, sauf à 1 endroit.

J'ai un code du style :
Code:
With zoneRecherche
    Set DonneeCherchee = .Find(tab_ssdiv(l), LookIn:=xlValues, LookAt:=xlWhole)
End With
If Not DonneeCherchee Is Nothing Then
    Debug.Print " DonneeCherchee (ss-div) est en " & DonneeCherchee.Address
End If
Ca fonctionne bien, ma condition If est correctement prise en compte

Par contre, si je remplace par
Code:
If IsNumeric(Application.Match(tab_ssdiv(l), zoneRecherche, 0)) Then
    Debug.Print " DonneeCherchee (ss-div) est en " & DonneeCherchee.Address
End If
mon code ne rentre pas dans mon If

Je précise que ma variable zoneRecherche est un range présent sur une seule ligne.

Existe-t-il des conditions qui font que find ne puisse pas toujours être remplacé par Match ?
 

SkyCorp

XLDnaute Junior
Re : détection d'une cellule avec la méthode Find en VBA

Quelque chose comme ça ?
Code:
Dim ssdiv_cherchee As Variant
ssdiv_cherchee = Application.Match(tab_ssdiv(l), zoneRecherche, 0)
If IsNumeric(ssdiv_cherchee) Then
    Debug.Print " DonneeCherchee (ss-div) est en " & DonneeCherchee.Address
End If

J'ai essayé, mais j'obtiens le même résultat, je n'entre pas dans ma condition If
 

néné06

XLDnaute Accro
Re : détection d'une cellule avec la méthode Find en VBA

Bonjour le Forum,

L'erreur peut s'expliquer comme ceci:
Voici le fonctionnement de "Match" .

Lorsque l'on place

ssdiv_cherchee = Application.Match(tab_ssdiv(l), zoneRecherche, 0)
If IsNumeric(ssdiv_cherchee) Then
Debug.Print " DonneeCherchee (ss-div) est en " & DonneeCherchee.Address
End If
La recherche par "Match" va affecter en variable "ssdiv_cherchee" le numéro de la ligne où se trouve la première valeur égale à "tab_ssdiv(l)" dans le Range(zoneRecherche).
Nous avons deux solutions:
-"Match" trouve la ligne de la première valeur égale à "tab_ssdiv(l)" et affecte à "ssdiv_cherchee" ce numéro de ligne.
-"Match" ne trouve pas la ligne de la première valeur égale à "tab_ssdiv(l)" car "tab_ssdiv(l)" n'existe pas dans le Range(zoneRecherche) et alors "ssdiv_cherchee" prend la valeur "Erreur 2042"
Donc
If IsNumeric(ssdiv_cherchee) Then (Si "ssdiv_cherchee" est un nombre représentant la ligne alors exécute le If
Debug.Print " DonneeCherchee (ss-div) est en " & DonneeCherchee.Address
Else 'Sinon "ssdiv_cherchee" prend la valeur "Erreur 2042"
'
'
End If

Je pense que tu as saisie le problème!

A+

René
 

SkyCorp

XLDnaute Junior
Re : détection d'une cellule avec la méthode Find en VBA

Bonjour à tous,

Grâce au Match, j'ai bien avancé dans mon code et ai même remarqué quelques erreurs. Tout marche bien à présent.
J'ai donc plusieurs Match dans mon code.

Par contre, à un seul endroit, j'observe le problème que je signalais, je dois remplacer Match par un Find sinon ça produit un résultat incorrect, et je ne sais pas pourquoi. J'ai vérifié la zone de recherche, l'existence ou non de la variable cherchée, tout est bon, sauf le résultat.

Ce n'est pas plus gênant que ça, vu que le code fonctionne, mais je ne comprends pas ce qui cloche avec Find.
néné06, j'essaie de comprendre ce que tu indiques, mais je n'arrive pas à voir le lien avec mon cas. Tu peux m'en dire davantage ?

Merci d'avance
SkyCorp
 

Discussions similaires

Réponses
2
Affichages
143
Réponses
12
Affichages
565

Statistiques des forums

Discussions
312 164
Messages
2 085 877
Membres
103 007
dernier inscrit
salma_hayek