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 Sub
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 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 ?

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.
Nom : Animation.gif
Affichages : 3132
Taille : 157,4 Ko
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
Qu'en pensez vous ?

Merci