1 pièce(s) jointe(s)
Autocomplete Textbox ou Combobox ActiveX
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:
1 2 3
| Private Sub txtRepere_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
popup txtRepere
End Sub |
Code:
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.
Pièce jointe 203132
Code:
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 :)