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,



A voir également:

6 réponses

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
blux Messages postés 27109 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
Salut,

un findnext ne ferait pas l'affaire ?
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
blux Messages postés 27109 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
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
Ateraki
 
Le critère peut être le prénom
0
blux Messages postés 27109 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
Ateraki > pijaku Messages postés 12263 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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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
blux Messages postés 27109 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
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
Ateraki
 
Je vais essayer vos deux manières de faire de ce pas, je reviens vers vous d'ici 3-4 minutes
0