Combobox multicolonne triée
Bonjour à tous,
J'ai créé une combobox triée à l'aide d'un code du site de Jacques Boisgontier (voir ci-dessous).
Je récupère les données triées dans la colonne "I" de la feuille "BD Patients".
Mon problème est de pouvoir afficher dans la combobox une deuxième colonne avec les données de la colonne "D" de la même feuille.
Est-ce possible ? Et si oui, est-il possible de rajouter en prime une option de tri de la combobox pour la trier selon la 1ère ou selon la 2ème colonne ?
Merci de votre aide, voici le code : (nom du combobox = "ChoixID")
Dim ListeID, fPatients As Worksheet
Option Compare Text
Sub userform_initialize()
Set fPatients = Sheets("BD Patients")
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In fPatients.Range("I2:I" & fPatients.[A65000].End(xlUp).Row)
If c.Value <> "" Then MonDico.Item(c.Value) = c.Value
Next c
ListeID = MonDico.items
Call Tri(ListeID, LBound(ListeID), UBound(ListeID))
ChoixID.List = ListeID
End Sub
Sub Tri(ListePatients, gauc, droi) ' Quick sort
ref = ListePatients((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While ListePatients(g) < ref: g = g + 1: Loop
Do While ref < ListePatients(d): d = d - 1: Loop
If g <= d Then
temp = ListePatients(g): ListePatients(g) = ListePatients(d): ListePatients(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call Tri(ListePatients, g, droi)
If gauc < d Then Call Tri(ListePatients, gauc, d)
End SubBonjour,
Mon problème est de pouvoir afficher dans la combobox une deuxième colonne avec les données de la colonne "D" de la même feuille.
Non vous ne pouvez avoir qu'une seule colonne dans une combobox
Vous devez passer en listbox ou listview qui vous permettra d'avoir la colonne I triée et les données de la colonne D correspondant aux lignes de la colonne I
Peut être voir votre fichier
Cordialement
Bonjour Arnnaud,
Une contribution basée sur un ComboBox. La colonne affiche les valeurs des colonnes "J" et "D" en les concaténant avec un "-" entre. Le tri sur "J" ou "D" s'effectue en saisissant 1 ou 2 dans la TextBox1. En fonction du tri, tu pourrais afficher "<J> - <D>" ou "<D> - <J>" si c'est l'objectif (non fait dans l'exemple).
re
@cyflo : bah oui c'est aussi une solution mais à voir si c'est ce qu'il veut
Crdlrt
Bonjour @Dan et @Cylflo, merci pour vos réponses !
@Cylflo oui l'idée me paraît bonne en tout cas je pense que ça peut répondre à ce que je cherchais ; j'ai essayé de rajouter ce petit code (toujours de chez Boisgontier) mais j'ai une erreur sur le call Tri que je ne comprends pas... (erreur de compilation, argument non facultatif... pourtant j'ai déclaré MonDico au tout début avec option Explicit...)
Private Sub ChoixID_Change()
If Me.ChoixID.ListIndex = -1 Or IsError(Application.Match(Me.ChoixID, MonDico, 0)) Then
Call Tri(MonDico, LBound(MonDico), UBound(MonDico))
ChoixID.List = Filter(MonDico, Me.ChoixID.Text, True, vbTextCompare)
ChoixID.DropDown
Else
'Call ...
End If
End SubMerci beaucoup si tu vois ce qui déconne, et si tu peux détailler ton idée qui me paraît bonne :)
Je te réponds de mon téléphone (pas d'accès à Excel). L'erreur de compil est liée à l'absence dans "Tri" du paramètre "champ" qui désigne le n° (1 ou 2) de la colonne de tri. Par contre je ne suis pas sûr de comprendre la logique du code ... Si tu n'obtiens pas le résultat attendu, il faudrait, comme Dan te l'a suggéré, que tu envois un fichier anonymisé et que tu expliques ce que tu attends comme résultat lorsqu'un item est sélectionné dans ChoixID.
La logique du code est de faire une "recherche intuitive type google" avec le dropdown qui s'ajuste au fur et à mesure de la frappe.
Ton fichier est parfait pour l'exemple : concatener colonne D et I dans le combobox. Choisir si on trie sur l'une ou l'autre (peux être à l'aide d'un option button du coup). Et éventuellement un textbox qui affiche l'ID du patient (colonne A) lorsqu'il est sélectionné dans ChoixID.
Effectivement si je rajoute le champ dans Tri je n'ai plus l'erreur, j'imagine que l'idée est de le mettre en variable en fonction de la colonne de tri que choisira l'utilisateur ? Par contre maintenant je passe à une erreur d'incompatibilité de type (erreur 13) sur la ligne d'après ("ChoixID.List = Filter(MonDico, Me.ChoixID.Text, True, vbTextCompare").
Bonjour Arnnaud,
Sauf si je n'ai pas bien compris ce que tu veux faire, nativement, un combobox s'ajuste en fonction des caractères saisis. Pour que ce soit plus visible, il suffit d'appeler la méthode DropDown mais il n'y a pas lieu de programmer une recherche. J'ai complété l'exemple en ajoutant une mise à jour des valeurs affichées dans la liste en fonction du tri, si tri sur colonne I, les valeurs présentées sont "<I> - <D>" et si le tri est sur la colonne D, les valeurs sont "<D> - <I>" et la liste se resynchronise sur la bonne valeur. Pour le tri 2 boutons radios.
Si ce n'est pas vraiment ce que tu attends, donne un ou deux exemples détaillés de que tu souhaites accompagné d'un fichier.
Merci @Cylfo c'est vraiment le rendu que je cherche.
Il me manque juste la "recherche intuitive" et j'ai peur que cela soit impossible avec le dictionnaire qui est en plusieurs dimensions (si je ne me trompe pas) tandis que la recherche intuitive fait appel à "filter" qui ne marche qu'avec un tableau de chaînes unidimensionnel...
Tu retrouveras cette recherche intuitive sur le site de Jacques Boisgontier : http://boisgontierj.free.fr/
Elle est très précieuse pour les BD de plusieurs milliers de nom (comme dans mon cas).
Merci si quelqu'un a une solution pour intégrer cette recherche intuitive...
Cela te conviendrait il ?
Je crois que la recherche intuitive fonctionne c'est top :)
Par contre si je ne me trompe pas lorsqu'on sélectionne l'option button colonne D ça ne l'applique que pour la première ligne du combobox...
Egalement dans mon cas il y aura de nombreuses lignes qui n'auront rien dans la colonne I ; dans ton fichier ils apparaîtraient comme lignes vides dans la combobox... Comment l'éviter ? Je pensais que c'était justement l'objet de :
If .Cells(nLig, 9).Value <> "" Thendans ton initialize, mais étrangement ça semble quand même rajouter la ligne, il y a quelque chose que je ne saisis pas
C'est le risque de travailler sans fichier ...
Merci de constituer un jeu de test anonymisé avec les colonnes A, D et I en conservant une bonne représentativité des données renseignées / non renseignées et en indiquant le nombre de lignes en cible. Les données sont dans un tableau structuré ? Il y a une clé unique l'ID ou autre ?
Je m'appuierai sur le fichier pour corriger ces petits bugs.
Bonjour Arnnaud,
Si tu ne peux pas constituer un jeu de test, précises les 9 points suivants :
- La colonne A est toujours renseignée ?
- Dans la liste, tu veux bien voir apparaitre les données des colonnes I et D (si renseignées) et les utiliser pour la recherche intuitive ?
- Si oui, faut il un séparateur entre les 2 données ?
- Pour une ligne de données, visiblement la colonne I peut être vide. Dans ce cas et si D est renseigné, faut-il créer un item dans ChoixID ?
- Si oui, peu importe le tri ou uniquement si le tri est sur la colonne D ? avec quel format : seulement avec "D" ? "<I vide> - D" ? autre ?
- Pour une ligne de données, la colonne D peut-elle être vide ?
- Dans ce cas et si I est renseigné, faut-il créer un item dans ChoixID ?
- Si oui, peu importe le tri ou uniquement si le tri est sur la colonne I ? avec quel format : seulement avec "I" ? "I - <D vide>" ?
- Les données sont elles stockées dans un tableau structuré ?
Bonjour Cylflo,
Alors je joins un fichier pour mieux illustrer ce que cela rendra.
Je réponds à tes points ci dessous, avant cela, j'ai réalisé qu'en joignant les deux colonnes comme tu l'as fait, l'option de tri sur l'une ou l'autre via Option Button n'est pas nécessaire... en effet avec la recherche intuitive cela fera le tri automatiquement que l'on cherche via l'ID ou via le prénom ! (je te laisse faire le test...)
1. Non la colonne A peut ne pas être renseignée
2. Oui exactement
3. Oui un petit séparateur genre "-" comme tu as fait c'est nickel
4. Oui la colonne D peut être vide, dans ce cas je souhaite ne pas intégrer la ligne dans la liste du combobox.
5.
6. Non la colonne D sera forcément remplie, c'est la réelle clé de chaque patient
7.
8.
9. Oui les données sont bien dans un tableau structuré
Au final tel qu'est le code dans mon fichier, "il n'y aurait qu'à" le simplifier pour ne plus s'embêter avec l'option de trier sur telle ou telle colonne, et par contre ne par intégrer dans la liste du combobox les lignes dont la colonne D est vide.
Un grand merci de te donner de la peine pour mon petit problème
Qui peut le plus, peut le moins
J'ai remplacé le séparateur tiret qui peut être présent dans les noms et prénoms, en encadrant le 2ème élément entre parenthèses. Le fichier test comporte 29999 lignes, les temps de réponse sont tout à fait correct sur mon pc sans ou avec tri.
Merci Cylflo j'ai bien testé, à peine du adapter pour mon fichier mais c'est parfait !