Procédure de MAJ des items ComboBox

Teatom

XLDnaute Nouveau
Bonjour à tous,

Je fais une fois de plus appel à vous (merci d'ores et déjà à tous ceux qui se sont penchés sur mes problèmes) afin de programmer une saisie semi-automatique sur une ComboBox alimentée par les données d'une feuille Excel.

Le but est d'obtenir les mêmes fonctionnalités que la barre de recherche google par exemple.
Après avoir regardé un peu partout, j'ai décidé de faire ma procédure avec mes humbles moyens (histoire de pouvoir expliquer un minimum ce que j'écris :D) et je pense ne pas être trop loin de la vérité.

Private Sub ComboBox3_Change()
Dim nbCar As Integer
Dim nbList As Integer
Dim rechlet As String

nbCar = Len(ComboBox3.Value)
nbList = ComboBox3.ListCount '-1
rechlet = Left(ComboBox3.Text, nbCar)

Do While ComboBox3.Value <> ""
ComboBox3.Style = fmStyleDropDownList
' rechlet = Left(ComboBox3.Text, nbCar)
For i = 0 To nbList
If InStr(1, ComboBox3.List(i), rechlet, vbTextCompare) = 0 Then
ComboBox3.ListIndex.RemoveItem ComboBox3.List(i)
End If
' nbList = ComboBox3.ListCount '-1
Next i
Loop

End Sub

A savoir qu'il me met un code d'erreur '424' : Objet requis à la ligne indiquée en rouge. Pour autant, ComboBox3.List(i) est bien défini. Je m'excuse de ne pas avoir joint de fichier, il était encore trop volumineux après compression.

Merci de votre aide
 

Teatom

XLDnaute Nouveau
Re : Procédure de MAJ des items ComboBox

Bonjour Banzai64,

Le code se met encore en erreur malgré le fait qu'il ait bien compris que je souhaitais comparer ComboBox3.List(i) et rechLet. J'ai essayé avec ListRow aussi mais sans résultat..

i étant l'indice de l'item à supprimer, je ne pense pas qu'il y ait adéquation (i : integer, item : string)

Bonne journée
 

kjin

XLDnaute Barbatruc
Re : Procédure de MAJ des items ComboBox

Bonsoir,
Si j-ai compris
Code:
Private Sub ComboBox3_Change()
x = ComboBox3.ListIndex
For i = ComboBox3.ListCount - 1 To 0 Step -1
    If i <> x Then ComboBox3.RemoveItem i
Next i
End Sub
A+
kjin
 

Teatom

XLDnaute Nouveau
Re : Procédure de MAJ des items ComboBox

Rebonjour Banzai64, kjin, le Forum

J'ai pris en compte vos indications pour les appliquer à ma macro mais mon programme ne mène toujours pas à ce que je recherche.

La macro se met en défaut pour une ListIndex non définie (erreur 381). J'ai fait le ménage parmi mon code pour vous joindre un fichier qui traite uniquement de l'initialisation et de l'évènement Change de ma ComboBox. Je ne sais pas si il y a une meilleure façon de faire (comme je le disais, je fais avec mes humbles moyens :)) mais j'ai tâché d'expliquer au mieux mon code et mes objectifs.

Je vous remercie par avance du temps que vous consacrez à mon problème et de l'aide que vous m'apportez.

Bonne soirée
 
Dernière édition:

Banzai64

XLDnaute Accro
Re : Procédure de MAJ des items ComboBox

Bonsoir
Supprimes ta boucle Do .... Loop
Ensuite dans la boucle For i il faut nblist-1

VB:
Private Sub ComboBox1_Change()
Dim nbCar As Integer
Dim nbList As Integer
Dim rechlet As String

nbCar = Len(ComboBox1.Value) 'je calcule le nombre de caractères rentrés dans la ComboBox1
nbList = ComboBox1.ListCount 'nombre d'items dans la ComboBox1

rechlet = Left(ComboBox1.Text, nbCar) 'caractère à rechercher parmi les items de la ComboBox1
monnom = ComboBox1.List(6) 'exemple pour vérifier via les variables locales qu'il me définit bien ComboBox.List(i)

'Do While ComboBox1.Value <> ""
    ComboBox1.Style = fmStyleDropDownList 'je souhaite que la liste déroulante apparaisse à partir du premier caractère entré dans la ComboBox
    For i = nbList - 1 To 0 Step -1
        If InStr(1, ComboBox1.List(i), rechlet, vbTextCompare) = 0 Then
            ComboBox1.RemoveItem i
        End If
    Next i
'Loop

End Sub

A tester
 

Teatom

XLDnaute Nouveau
Re : Procédure de MAJ des items ComboBox

ReBonjour Banzai64, kjin, le forum

Le code est perfectible car il ne me réduit ma liste d'items uniquement pour le premier caractère tapé par l'utilisateur dans la ComboBox, et je ne gère pas les backspace saisis par l'utilisateur :

Private Sub ComboBox3_Change()
Dim nbCar As Integer
Dim nbList As Integer
Dim rechlet As String

nbCar = Len(ComboBox3.Value)
nbList = ComboBox3.ListCount
rechlet = Left(ComboBox3.Value, nbCar)
For i = nbList - 1 To 0 Step -1
monnom = Mid(ComboBox3.List(i), 1, nbCar)
If Not rechlet Like monnom Then ComboBox3.RemoveItem (i)
Next i

@kjin : quand je parle d'obtenir les mêmes fonctionnalités que la barre de recherche Google, je demande à ce qu'une liste déroulante s'affiche à partir du premier caractère rentré dans la ComboBox.
Cette liste déroulante doit m'afficher tous les items pouvant correspondre au premier caractère tapé dans la ComboBox.
ex : Pour une ComboBox répertoriant des prénoms, si je tape "J" je souhaite voir s'afficher Jean, Jonathan ou Jérôme et non pas Adrien ou Amélie.
La liste déroulante doit par la suite s'affiner en fonction des caractères que je tape.
ex : Un "e" tapé en deuxième caractère fera en sorte que Jean soit le seul item dans la liste.

Bonne journée
 
Dernière édition:

kjin

XLDnaute Barbatruc
Re : Procédure de MAJ des items ComboBox

Bonsoir,
Essaies peut-être comme ceci...
Code:
Dim Tablo

Private Sub UserForm_Initialize()
Dim ws1 As Worksheet
Set ws1 = Worksheets("Feuil1")
With ws1
Tablo = Application.Transpose(.Range("A2:A" & .Range("A65536").End(xlUp).Row).Value)
End With
With ComboBox1
    .AutoWordSelect = False
    .MatchEntry = 2
    .Style = 0
End With
End Sub

Private Sub ComboBox1_Change()
With ComboBox1
    .List = Tablo
    If Len(.Text) > 0 Then
        For i = .ListCount - 1 To 0 Step -1
            If UCase(Mid(.List(i), 1, Len(.Text))) <> UCase(.Text) Then
                .RemoveItem i
            End If
        Next
    End If
    '.DropDown
End With
End Sub
...sans oublier de déclarer "Tablo" en tête du module
A+
kjin
 

Discussions similaires

Statistiques des forums

Discussions
312 229
Messages
2 086 423
Membres
103 206
dernier inscrit
diambote