IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

recherche imbriquée avec la methode "find"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 238
    Par défaut recherche imbriquée avec la methode "find"
    Bonjour a tous,

    Je viens vers vous car j'ai un problème.(tiens donc )
    j'ai deux tableaux.
    Dans le premiervoir ci joint), je cherche des occurrences d'une valeur, (trv = plage.find("sn02024") et trv = plage.findnext(trv))
    Pour chaque occurrence, l'adresse reçue me permet de lire une valeur . (Par Ex : 1° occurrence= "4", seconde occurrence = "15",.......)

    Cela marche parfaitement.
    Le problème vient que lorsque dans la boucle (FindNext) de recherche, je fais une autre recherche avec Find sur le second tableau, la boucle FindNext arrête et donne des valeurs aberrantes. Je dirai que les index de FindNext se mélangent les pinceaux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Set plage = Sheets(NomTable).Columns(12)
     
            Set Trv = plage.Find(NumSerie)
            If Not Trv Is Nothing Then
              frstadr = Trv.Address
                Do
                    FolioIDlgn = Trv.Row
                    FolioID = Sheets(NomTable).Cells(FolioIDlgn, 11)
                    Set plage1 = Sheets(NomTable).Columns(2)
                    adrID = plage1.Find(FolioID).Row
                    Set Trv = plage.FindNext(Trv)
                Loop While Not Trv Is Nothing And Trv.Address <> frstadr
            End If
    Si les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                   Set plage1 = Sheets(NomTable).Columns(2)
                    adrID = plage1.Find(FolioID).Row
    sont en remarques, le FindNext trouve bien toutes les occurrences de la chaine recherchée.
    Dès que les lignes ne sont plus mise en remarques, la première recherche FindNext change la valeur de trv.
    Dans le tableur ci près,
    1	38	sn00021	M0107	38
    2	39	sn02024	M0107	40
    3	72	sn02024	M0107	112
    4	99	sn02024	M0107	114
    5	111	sn00063	M0107	117
    6	147	sn00070	M0107	154
    sans les deux lignes, Findnext trouve bien 3 fois la chaine "sn02024".
    Mais avec les deux lignes actives, Find trouve bien la première occurrence de "sn02024", mais findNext retourne "sn00379" au lieu de "sn02024"

    J'ai aussi essayé de faire la deuxième recherche via une fonction, mais même là, dès que l'on fait une recherche avec find, au retour de la fonction , FindNext ne retrouve pas la bonne valeur .

    Voila, j'éspère avoir été clair.........

    SI quelqu'un a une piste ou une solution........

    Merci

    Bonne journée a tous

    Michel

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Utilise un tableau pour stocker les résultat de ta première recherche et ensuite, effectue une seconde recherche sur les valeurs récupérées dans la première.
    Comme je ne sais pas ce que tu veux faire, je suis parti du principe que tu veux récupérer les valeurs situées dans la colonne de gauche (colonne 11, K) et que tu veux faire une recherche d'après ces valeurs dans la colonne B pour en récupérer le n° de ligne. Le résultat (je n'ai fait aucun test) ser dans la fenêtre d'exécution (Ctrl+G) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    Sub Test()
     
        Dim Tbl() As String
        Dim I As Integer
     
        Set plage = Sheets(NomTable).Columns(12)
     
        Set trv = plage.Find(NumSerie)
     
        If Not trv Is Nothing Then
     
            frstadr = trv.Address
     
            Do
     
                'stocke les valeurs trouvées dans un tableau à deux dimensions
                I = I + 1
                ReDim Preserve Tbl(1 To 2, 1 To I)
     
                'stocke la valeur de la cellule située sur la même ligne en colonne 11(K)
                'dans la première dimension du tableau
                Tbl(1, I) = trv.Offset(, -1).Value
     
                'continu la recherche
                Set trv = plage.FindNext(trv)
     
            Loop While trv.Address <> frstadr
     
        End If
     
        Set plage1 = Sheets(NomTable).Columns(2)
     
        'boucle sur le tableau...
        For I = 1 To UBound(Tbl, 2)
     
            'recherche la valeur en colonne B...
            Set trv = plage1.Find(Tbl(1, I))
     
            'si trouvé,stocke le numéro de ligne dans la seconde dimension du tableau
            'recherche effectuée qu'une seule fois
            If Not trv Is nonthing Then Tbl(2, I) = trv.Row
     
        Next I
     
        'pour le test, affiche les résultats dans la fenêtre d'exécution (Ctrl+G)
        For I = 1 To UBound(Tbl, 2)
     
            Debug.Print "La valeur cherchée est '" & Tbl(1, I) & "' située sur la ligne numéro " & Tbl(2, I)
     
        Next I
     
    End Sub

  3. #3
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 238
    Par défaut
    Bonjour,

    Merci de la réponse.

    En effet, mettre le résultat dans un tableau est une solution.
    Je trouvais plus élégant de faire directement une recherche, car ainsi si je trouve une égalité entre les deux table, je peut arrêter la recherche.
    Avec un tableau , il faut d'abord lire toutes les occurrence de la première table, puis chercher dans la seconde table pour les égalités.
    Si il n'y a pas beaucoup de répétition dans la première table, cela va aller, mais si il faut stocker plusieurs centaines d'occurrence, puis les relire, cela peut ralentir l'execution du code...

    Autrement, l’imbrication de deux "find" doit -elle fonctionner ??(question subsidiare )

    merci

    michel

  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par michel.semal Voir le message
    Autrement, l’imbrication de deux "find" doit -elle fonctionner ??(question subsidiare )

    michel
    Bonjour.

    FindNext ne supporte pas les Find imbriqués.
    Tu dois alors remplacer les FindNext par des FIND.

  5. #5
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 238
    Par défaut
    Bonjour,

    Bon Ok.
    Les "FIND imbriqués ne fonctionnent pas.(je m'en doutait un peu)

    Merci pour les informations.
    Je passerai donc par des tableaux pour les résultats
    Soit par des FIND avec AFTER
    Je vais tester les deux solutions

    Merci

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Imbriquer un bout de code à mon projet (Rechercher Date avec Find-Méthode)
    Par Madwinn dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 04/02/2015, 09h45
  2. Rechercher enregistrement avec ' (quote)
    Par jpo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/08/2007, 17h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo