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. 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?
    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
      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. 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. 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. 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