Autres Subtilité VBA FIND (occurence suivant plage de recherche)

zebanx

XLDnaute Accro
Bonjour,

Auriez-vous SVP une explication concernant la première adresse retrouvée sur une plage définie pour trouver la deuxième occurence qui n'indique pas le même résultat ? :
- si on commence en E6
- si on commence en E7

La boucle me parait correcte et cela m'avait échappé auparavant.

Je vous en remercie par avance.
zebanx
 

Fichiers joints

Dernière édition:

Roblochon

XLDnaute Accro
Bonjour,

Où la magie de F1 nous donne une indication en ce qui concerne le problème, l'argument After:


NomObligatoire/FacultatifType de donnéesDescription
WhatObligatoireVarianteDonnées à rechercher. Il peut s'agir d'une chaîne ou de tout autre type de données Microsoft Excel.
AfterFacultatifVarianteCellule après laquelle vous souhaitez commencer la recherche. Cela correspond à la position de la cellule active lorsqu'une recherche est effectuée à partir de l'interface utilisateur. Notez que l'argument Après doit correspondre à une seule cellule de la plage. Rappelez-vous que la recherche commence après cette cellule ; la cellule spécifiée n'est pas recherchée jusqu'à ce que la méthode revienne à cette cellule. Si vous ne spécifiez pas cet argument, la recherche commence après la cellule située dans le coin supérieur gauche de la plage.
LookInFacultatifVarianteType d'informations.
LookAtFacultatifVarianteIl peut s'agir de l'une des constantes XlLookAt suivantes : xlWhole ou xlPart.
SearchOrderFacultatifVarianteIl peut s'agir de l'une des constantes XlSearchOrder suivantes : xlByRows ou xlByColumns.
SearchDirectionFacultatifXlSearchDirectionDirection de la recherche.
MatchCaseFacultatifVarianteTrue pour que la recherche respecte la casse. La valeur par défaut est False.
MatchByteFacultatifVarianteS'utilise uniquement si vous avez sélectionné ou installé la prise en charge des langues codées sur deux octets. True pour que les caractères codés sur deux octets ne correspondent qu'aux caractères codés sur deux octets. False pour que les caractères codés sur deux octets correspondent à leurs équivalents codés sur un octet.
SearchFormatFacultatifVarianteFormat de la recherche.

Bon consultation
 

pierrejean

XLDnaute Barbatruc
Re
A mon avis le problème vient que l'on suppose un ordre de recherche (par colonne puis par ligne ) .Or c'est loin d’être évident
Vois la sub voir qui donne dans l'ordre I7 E7 G13

Edit: Salut et bravo Roblochon
 

zebanx

XLDnaute Accro
Bonjour Roblochon, Pierrejean

Merci pour vous être intéressé au sujet et pour votre retour.:cool:

Bon, l'argument suivant permet d'obtenir le résultat souhaité (plus de xlvalues, xlwhole)
Set x = plage.Cells.Find(Valeur, After:=Range("E7"))

Mais je dois faire des tests complémentaires quand même (casse...).

xl-ment
zebanx
 

zebanx

XLDnaute Accro
Re-

Un update avec un rajout de code qui donne une méthode de contournement (l'idée étant de l'utiliser dans un UDF j'ai besoin de cette première cellule d'adresse... variable infine pour un UDF).
Code 2 : C'est ma compréhension de l'utilisation de AFTER qui montre deux limites (casse, occurence 1) mais je ne la maitrise pas.

On ne perd pas trop de temps dessus, vous m'avez déjà beaucoup aidé. Et très vite de surcroit ;)
Ca me paraissait toutefois important de partager cela avec vous.

@+
 

Fichiers joints

Roblochon

XLDnaute Accro
Re,

Merci pour ce partage.

Le truc que j'emploie dans ces cas là c'est de référencer la dernière cellule de la plage pour le paramètre After, puisque la méthode find tourne en boucle.

VB:
Sub adresse_plage_find()
    j = 0
    '-- critères de recherche (plage, valeur et occurence recherchée)
    Set plage = Range("E7:M25")
    'plagey = plage.Address
    Valeur = "NOM"
    a = Cells(1, 6)

    '-- méthode find
    Set x = plage.Find(Valeur, plage.Cells(plage.Rows.Count, plage.Columns.Count), xlValues, xlWhole)
    If Not x Is Nothing Then
        FirstAddress = x.Address
        Do
            xa = x.Address
            j = j + 1
            If j = a Then Exit Do
            Set x = plage.FindNext(x)
        Loop While Not x Is Nothing And x.Address <> FirstAddress
    End If

    '-- restitution
suite:
    Cells(2, 1) = xa  '-- indique la troisième occurence !!
End Sub
Méthode implémentée dans la macro du bouton M1

A bientôt
 

Fichiers joints

Haut Bas