Bonjour à tous,
Je cherche à créer une liste d'autocomplétion sur un control ActiveX Textbox ou Combobox.
L'idée, c'est que l'on commence à saisir, une liste apparais sous le control et s'affine automatiquement au fil de la saisie.
Je suis parti dans l'idée d'une Textbox avec un menu CommandBar Popup.
Ca fonctionne à ceci prêt qu'a l'affichage le Popup est modal et bloque l'avancement de la saisie dans la Textbox.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub txtRepere_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) popup txtRepere End SubSinon l'idée est la et ça fonctionne comme je le souhaite, alors déjà, y a t'il un moyen de ne pas rendre le Popup modal ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 Function getAutocompleteValues(search As String) As String() Dim row As Range Dim values(7) As String Dim nbValues As Integer For Each row In Range("_456") If UCase(Left(row(0, 4), Len(search))) = UCase(search) Then values(nbValues) = row(0, 4) & " - " & row(0, 5) nbValues = nbValues + 1 End If If nbValues > 7 Then Exit For Next getAutocompleteValues = values End Function Sub popup(control As Variant) Dim Barre As CommandBar Dim sheet As Worksheet Dim txtRepere As OLEObject Set sheet = ActiveSheet Set txtRepere = sheet.OLEObjects("txtRepere") On Error Resume Next CommandBars("autoComplete").Delete Set Barre = CommandBars.Add("autoComplete", msoBarPopup, False, True) For Each Value In getAutocompleteValues(txtRepere.Object.Value) With Barre.Controls.Add(msoControlButton, , , , True) .Caption = Value '.FaceId = 326 .OnAction = "autoCompleteChoice" End With Next Dim PosX As Single, PosY As Single PosX = control.Left - 15 PosY = control.Top + control.Height + 15 + Barre.Height Application.CommandBars("autoComplete").ShowPopup PosX, PosY End Sub
Sinon idée numéro 2, utiliser une Combobox et vider et remplir la liste au fur et a mesure de la saisie.
Mais alors la c'est la cata !
Déjà parce que quand on saisi la Combobox présélectionne une valeur et ça malgré le passage de AutoWordSelect à False
Et ensuite parce que le vidage et le remplissage produise un affichage bizarre de la liste, même en faisant un Dropdown avant vidage et après remplissage pour le rafraîchir.
Qu'en pensez vous ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'ComboBox1.Clear ComboBox1.DropDown Do While ComboBox1.ListCount > 0 ComboBox1.RemoveItem (0) Loop For Each Value In getAutocompleteValues(ComboBox1.Value) ComboBox1.AddItem Value Next ComboBox1.DropDown End Sub
Merci![]()
Partager