Méthode "Find", problème de résultats.

Résolu
Bonjour à toutes et à tous !

Bien j'ai décidé de poster sur ce forum car j'ai un gros souci. Je vous explique le contexte, je dois réalisé un projet en VBA. J'ai donc entré toute une liste de personne sur mon fichier excel. Je fais donc une recherche avec la méthode Find sur le nom, seul problème, quand deux noms de familles sont identiques, excel ne prend comme résultat que le premier or je voudrais le deuxième. Même problème avec les prénoms, excel ne prend toujours que les premiers résultats.

Avez-vous une idée de comment faire sachant qu'il me faut absolument le deuxième nom avec le prénom correspondant. Par exemple, si je cherche :

Nom : Toto / Prénom : Tutu
Nom : Toto / Prénom : Tata

La userform ne m'indique que Toto / Tutu comment faire pour avoir le deuxième choix ?

Merci pour vos réponse.

Cordialement,

6 réponses

  1. For Z = 2 To 150
      If Cells(Z, 2) = modif.b.Value And Cells(Z, 2).Offset(0, 1) = modif.a.Value Then
         Cells(Z, 2).EntireRow.Select
      End If
    Next
    


    Voilà grâce à ces 3 lignes j'ai résolu mon problème si on reprend par exemple ta liste type, et que je cherche par exemple toto jean et bien il me le trouve et me sélectionne bien la ligne tout comme il faut !! Dire que j'ai trouvé ce bout de code durant un cours tout à fait ennuyant ^^'.

    Maintenant, il me reste à trouver comment afficher le message d'erreur pour informer qu'une personne n'est pas dans la liste. Pour se faire, je pense mettre un Else ou une autre boucle, à voir !
    1. Modérateur
      Juste un Else suffit ;-)
      Comme ceci :
      For Z = 2 To 150
        If Cells(Z, 2) = modif.b.Value And Cells(Z, 2).Offset(0, 1) = modif.a.Value Then
           Cells(Z, 2).EntireRow.Select
        Else
            MsgBox "Merci pour les balises code, c'est tout de même plus joli non?"
        End If
      Next
    2. @pijakuOui, c'est nettement plus joli mais le petit souci c'est qu'avec le Else, il va m'afficher 148 fois le msgBox.
    3. Modérateur
      Alors :
      Dim Message As String
      For Z = 2 To 150
        If Cells(Z, 2) = modif.b.Value And Cells(Z, 2).Offset(0, 1) = modif.a.Value Then
           Cells(Z, 2).EntireRow.Select
        Else
            Message = Message & chr(10) & Cells(Z, 2).Value
        End If
      Next
      MsgBox "Sont absents : " & Message
    4. Modérateur
      Et bien tu mets un flag dans ton test et à la sortie, tu le testes pour n'afficher le message que si le flag n'a pas bougé...

      Flag = False
      For Z = 2 To 150
        If Cells(Z, 2) = modif.b.Value And Cells(Z, 2).Offset(0, 1) = modif.a.Value Then
           Cells(Z, 2).EntireRow.Select
           Flag = True
        End If
      Next
      If Flag = False Then
          MsgBox "Non trouvé"
      End If
      
    5. Je vais essayer vos deux manières de faire de ce pas, je reviens vers vous d'ici 3-4 minutes
  2. En ce qui concerne le code, j'y penserai mais c'est la première fois que je post c'est pour ça ;)

    Alors pour la colonne en plus, il y en a bien une car en face de chaque personne correspond un numéro de carte. La contrainte vient du faite que la recherche ne doit pas se faire selon le numéro de carte.
    1. Modérateur
      Salut,

      un findnext ne ferait pas l'affaire ?
      1. Modérateur
        Salut Blux,

        Certes, certes.
        Cependant, il y a d'autres pistes à traiter avant.
        Notamment l'ajout d'un Identifiant unique.
        Ensuite, avant de passer au findNext, il conviendra de corriger son find...
      2. Modérateur
        D'accord avec l'id, mais lorsque tu cherches via un nom, tu n'as pas forcément l'id. Et dans le cas d'une homonymie complète, ça ne change rien, il faut un autre critère discriminant : date de naissance, lieu de naissance...
      3. Le critère peut être le prénom
      4. Modérateur
        Donc, dans ce cas, il te faut récupérer le prénom et refaire une recherche.
        Voire modifier le userform pour mettre une ou plusieurs listes déroulantes, comme ça, pas de gestion de find à faire et tu peux utiliser un id caché dans ta zone de liste.
      5. Le souci c'est qu'il y a aussi plusieurs fois le même prénom avec pas forcément le même nom donc des cases différentes ..
    2. Modérateur
      Première approche :
      L'idéal lorsque l'on construit une base de données, est de penser à créer une "colonne" identifiant. Cela peut être sous la forme d'une clé primaire (un numéro unique attribué automatiquement pour chaque "ligne" de ta bdd), un numéro d'identifiant unique (ex : n° de sécurité sociale), ou alors, mais c'est moins fiable relativement aux doublons, une colonne "NOM Prénom".

      Est il encore envisageable pour toi l'ajout d'une telle colonne?
      1. Salut,

        En fait dans le projet, je saisis les noms par une userform qui sont ensuite écrit sur une feuille excel.

        Dans ton exemple, oui je voudrais qu'excel me trouve et sélectionne que la ligne toto jean. Et le souci c'est qu'avec mon code, il y a deux possibilités :

        - Recherche avec juste le nom : Excel s'arrête au premier nom et sélectionne la ligne correspondante.
        - Recherche avec le nom et le prénom : Excel va s'arrêter que sur le premier nom et va chercher le prénom. En gros c'est comme si je cherchais toto jean excel va me sélectionner le premier toto et le jean. Voici dans la suite du message mon code recherche :

        Dim F As Worksheet
        Dim R As Range
        Dim S As Range
        
        
                 If modif.direction = True Then
                   d = "Direction"
                    Sheets(d).Visible = True
                    Sheets(d).Activate
                End If
                
                If modif.administration = True Then
                    d = "Administration"
                    Sheets(d).Visible = True
                    Sheets(d).Activate
                End If
                
                If modif.enseignants = True Then
                    d = "Enseignants"
                    Sheets(d).Visible = True
                    Sheets(d).Activate
                End If
                
                If modif.etudiants = True Then
                    d = "Etudiants"
                    Sheets(d).Visible = True
                    Sheets(d).Activate
                End If
                
                If modif.intervenants = True Then
                    d = "Intervenants"
                    Sheets(d).Visible = True
                    Sheets(d).Activate
                End If
        
            Set F = Worksheets(d)
            
            With F.Range("A3", "Z300")
             
                 Set R = .Find(a, LookIn:=xlValues)
                 Set S = .Find(b, LookIn:=xlValues)
        
            End With
        
            If S Is Nothing Then
                MsgBox "La personne recherchée n'est pas dans la liste des " & d, , "Personne non trouvée"
            Else
                modif.a = S.Offset(0, 1).Value
                'modif.a = R
                modif.b = S
                modif.TextBox1 = S.Offset(0, 2).Value
                TextBox1.Value = Format(TextBox1.Value, "0000000000000")
                S.EntireRow.Select
                
            End If 


        Merci par avance de vos réponses et je reste à disposition pour vous répondre ;)
        1. Modérateur
          Lorsque tu mets du code dans ce forum, pense à utiliser les balises <> que tu trouve en haut de la zone de texte. Pour le code VBA, tu peux même sélectionner (dans la liste déroulante) "basic", pour obtenir ce que je viens de modifier pour toi dans ton dernier message.

          En ce qui concerne ta question, je me penche dessus, pour voir...
      2. Modérateur
        Salut,

        Soit une liste de personnes nommées (et prénommées) :
        tutu robert
        toto michel
        titi jeanne
        toto jean françois
        toto mike
        toto jean
        toto alexandra

        Veux tu :
        - la liste des personnes s'appelant "toto" ?
        - uniquement la personne s'appelant "toto jean" ?

        question subsidiaire :
        Comment saisis tu les Nom et prénom recherchés? Userform? cellule d'une feuille? autre?