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

Résolu
Ateraki -  
 Ateraki -
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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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?
    0
  2. Ateraki
     
    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 ;)
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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...
      0
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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?
    0
  4. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    un findnext ne ferait pas l'affaire ?
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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...
      0
    2. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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...
      0
    3. Ateraki
       
      Le critère peut être le prénom
      0
    4. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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.
      0
    5. Ateraki
       
      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 ..
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ateraki
     
    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.
    0
  7. Ateraki
     
    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 !
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
      0
    2. Ateraki > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Oui, c'est nettement plus joli mais le petit souci c'est qu'avec le Else, il va m'afficher 148 fois le msgBox.
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
      0
    4. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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
      
      0
    5. Ateraki
       
      Je vais essayer vos deux manières de faire de ce pas, je reviens vers vous d'ici 3-4 minutes
      0