Recherche de plusieurs valeurs dans un UserForm

Résolu
pixissama Messages postés 20 Statut Membre -  
pixissama Messages postés 20 Statut Membre -
Bonsoir,
J'essaie de faire un formulaire pour rechercher des valeurs. J'ai créé un inputbox liste modifiable où j'entre la valeur à rechercher (un nom de famille). A côté, j'ai créé deux colonnes d'inputbox non modifiables (lock) qui sont respectivement NOM et PRENOM. Et ce sur plusieurs lignes.
J'aimerais que lorsque je recherche le nom de famille "Dupond", celui-ci soit recherché dans ma feuille de calcul et soit renvoyé dans la première inputbox avec à côté le prénom de ce personnage. (jusque là j'y suis arrivé.)

Le problème est qu'il y a plusieurs Dupond donc j'aimerais avoir plusieurs résultats différentiables par les prénoms. Mais là je chôme et je sais pas du tout comment procéder. Je sais que c'est possible sur la feuille de calcul mais j'aimerais bien le faire sur mon formulaire si possible.

J'espère avoir été clair, merci d'avance !

8 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    Pour ta recherche, tu peux (dois) utiliser la méthode FIND

    voir même.. pour avoir tous les résultats possibles, un findall
    Explications disponibles ici :
    https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel#findall

    Je t'invite donc à placer le résultat de la recherche dans une ListBox pour permettre à l'utilisateur de choisir parmis les réponses, et au clic sur l'un des résultats, ça le place dans tes input.

    En faisant une recherche sur le forum Excel ou celui qui concerne le VBA tu trouveras des exemples ( dont un assez récent )

    Je t'invite également à te servir de cette doc pour manipuler les controles du formulaire
    https://silkyroad.developpez.com/VBA/ControlesUserForm/

    0
  2. pixissama Messages postés 20 Statut Membre
     
    Merci de votre aide, je me suis plongé dedans et j'ai essayé de trouver des vidéos mais je n'arrive pas du tout à le faire...

    Par exemple dans un tableau que j'ai appelé Tableau (via le gestionnaire de noms), je veux rechercher la valeur que j'aurais entré dans le ComboBox1 et la renvoyer dans la ListBox1.

    Mais j'aimerais intégrer la possibilité que plusieurs valeurs correspondent à mon ComboBox1 et que par conséquent, plusieurs résultats soient renvoyés dans la ListBox1.

    J'ai essayé le code que j'ai trouvé en le modifiant un peu mais ça n'a rien donné.

    Dim arTemp() As String
    Dim ValCherchee As String
    ValCherchee = cbox.value
    Dim Nom_Feuil As String
    Nom_Feuil = "participants"
    Dim DataColumn As Integer
    DataColumn = 3
    '---------------------------------------------------------------
    bFound = FindAll(ValCherchee, Sheets(Nom_Feuil), Tableau9, arTemp())
    '---------------------------------------------------------------

    If bFound = True Then
    Debug.Print "Nb occurences : " & UBound(arTemp)
    For x = 1 To UBound(arTemp)
    Debug.Print arTemp(x)

    ListBox1.AddItem (Cells(arTemp(x), DataColumn))
    Next
    End If


    Ce serait très gentil de m'aider à faire un code qui fonctionne !
    Merci !
    0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    Si tu pouvais mettre ton classeur en pièce jointe
    Mettre le classeur sans données confidentielles en pièce jointe sur 
    https://mon-partage.fr
    Dans lien de téléchargement
    faire un clic droit- copier l’adresse du lien et le coller dans votre message en cours sur ccm

    on devrait pouvoir de donner une proposition (colonnes des noms et prénoms, nombre de noms, où setrove combox et listbox : formulaire ou classeur, etc...)

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

    Posez votre question
  5. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Tu as oublié de mettre la fonction findAll dans un module
    Function FindAll(ByVal sText As String, ByRef oSht As Worksheet, ByRef sRange As String, ByRef arMatches() As String) As Boolean
    ' --------------------------------------------------------------------------------------------------------------
    ' FindAll - To find all instances of the1 given string and return the row numbers.
    ' If there are not any matches the function will return false
    ' --------------------------------------------------------------------------------------------------------------
    On Error GoTo Err_Trap
    Dim rFnd As Range ' Range Object
    Dim iArr As Integer ' Counter for Array
    Dim rFirstAddress ' Address of the First Find
    ' -----------------
    ' Clear the Array
    ' -----------------
    Erase arMatches
    Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)
    
    If Not rFnd Is Nothing Then
       rFirstAddress = rFnd.Address
       Do Until rFnd Is Nothing
          iArr = iArr + 1
          ReDim Preserve arMatches(iArr)
          arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne
          Set rFnd = oSht.Range(sRange).FindNext(rFnd)
          If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search
       Loop
       FindAll = True
    Else
    ' ----------------------
    ' No Value is Found
    ' ----------------------
       FindAll = False
    End If
    ' -----------------------
    ' Error Handling
    ' -----------------------
    Err_Trap:
    If Err <> 0 Then
       MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
       Err.Clear
       FindAll = False
       Exit Function
    End If
    End Function
    
    


    - Tu as oublié de changer le nom de la feuille 1
    - Tu n'a pas créé la plage nommée Tableau 1
    - Tu ne passes pas la "plage" correctement

    ça devrait donner
    bFound = FindAll(ValCherchee, Sheets(Nom_Feuil), "Tableau1", arTemp())
    


    0
  6. pixissama Messages postés 20 Statut Membre
     
    Ah oui d'accord j'avais carrément oublié de mettre la fonction... mais bon au moins comme ça c'est clair !

    Mais du coup j'ai tout modifié et ça fonctionne mais si j'ai envie d'ajouter le prénom (si je recherche Dupond par exemple) je dois mettre comment pour qu'il aille dans la colonne 2 (j'ai créé 2 colonnes à la ListBox).

    J'ai ça mais (je m'y attendais) ça me l'a mis en dessous...

    ListBox1.AddItem (Cells(arTemp(x), LA COLONNE QUI CORRESPOND AU PRENOM))
    0
  7. pixissama Messages postés 20 Statut Membre
     
    Si justement j'ai lu mais je ne sais pas l'utiliser je comprends pas et au plus j'essaie au plus je m'embrouille et au lieu de copier coller à chaque fois j'aimerais bien comprendre...

    Pour moi, votre ligne de code est incompréhensible...

    ListBox1.List(-1, 1) = (Cells(arTemp(x), ColPrénom))


    C'est ce que j'ai cru comprendre mais ça ne fonctionne pas alors je sais plus quoi faire à part attendre une explication nette et précise.
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      As tu regardé l'exemple que je t'ai donné dans le lien ?

      Il faut :
      1 - Faire un .AddItem pour ajouter une ligne dans la listbox
      2 - Faire un .List pour ajouter des infos dans cette ligne

      ' Première colonne
      Me.ListBox1.AddItem "MonNom"
      
      'Deuxième colonne
      Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = "MonPrénom"
      
      'Troisième colonne
      Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = "Autre chose" 
      


      A noter que tu dois absolument perdre l'habitude d'utiliser des caractères accentués dans le nom de tes variables...
      0
  8. pixissama Messages postés 20 Statut Membre
     
    Merci, j'ai compris cette fois. Et oui d'habitude je n'utilise pas les accents dans mes variables.

    Merci beaucoup pour vos réponses, je pense que mon problème est maintenant réglé ! J'ai plus qu'à coder le click sur un des résultats etc...

    A+ !
    0