Modification d'une liste combobox

Résolu/Fermé
reveolte - 11 janv. 2012 à 17:12
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 - 16 janv. 2012 à 14:17
Bonjour à tous,

Voici mon souci:
Je travaille sur VBA//Excel pour une base de données de clients.
J'ai besoin d'un Userform avec une combobox.
Mon but est d'aider l'utilisateur à la saisie de la façon suivante:

A l'initialisation du form, la liste de la combobox ne comprend aucun item.
La liste doit se créer dynamiquement en fonction de ce que rentre l'utilisateur dans la partie "text" de la combobox.

Ex: si l'utilisateur commence a rentrer la lettre "b", automatiquement ma combo va dérouler son menu et afficher uniquement les clients dont la lettre "b" est comprise dans le nom.

J'ai déjà construit ma Sub, et elle marche.
Seulement je suis obligé (je crois) la placer dans l'évenement "Change" (cf code ci-dessous)

Le GROS problème, c'est que les méthodes "List","AddItem" et "RemoveItem" déclenchent également l'évenement "Change". Or je dois en utiliser au moins une pour modifier la liste. Ce qui me cause une erreur vu que ma Sub est déjà dans le même évenement: ça fait tourner en rond!!

Si une bonne âme peut m'aider, je lui serais mille fois reconnaissant!!
Merci d'avance.



Private Sub CBNomCtc_Change()

i = 0
EntreeNom = CBNomCtc.Text
Nblignes = Sheets("BDD Contact").Range("A65536").End(xlUp).Row + 1

'Recherche de correspondance entre le Text de la combo et la base de données de clients
With Sheets("BDD Contact").Range("D2:D" & Nblignes)
Set c = .Find(EntreeNom, LookIn:=xlValues)
Set Plage = Nothing
If Not c Is Nothing Then
firstAddress = c.Address
Do
Set a = c.Offset(columnoffset:=-2)
If a.Value = NumSte Then
If Not Plage Is Nothing Then
Set Plage = Application.Union(Plage, c)

Else
Set Plage = c
End If
End If
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress

'Traitement correspondance
If Not Plage Is Nothing Then
ReDim Tab1(1 To Plage.Count, 1)

For Each Cell In Plage
i = i + 1
Tab1(i, 0) = Cell
Next

'Attribution de la liste (et c'est là que ça coince!!!)
CBNomCtc.List = Tab1

'Classement par ordre alphabétique
For i = LBound(CBNomCtc.List, 1) To UBound(CBNomCtc.List, 1) - 1
For j = i + 1 To UBound(CBNomCtc.List, 1)
If CBNomCtc.List(i, 0) > CBNomCtc.List(j, 0) Then
a = CBNomCtc.List(i, 0)
b = CBNomCtc.List(i, 1)
CBNomCtc.List(i, 0) = CBNomCtc.List(j, 0)
CBNomCtc.List(i, 1) = CBNomCtc.List(j, 1)
CBNomCtc.List(j, 0) = a
CBNomCtc.List(j, 1) = b
End If
Next
Next

End If

End If
End With

End Sub

2 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 645
12 janv. 2012 à 17:43
Bonjour,

J'ai testé cette macro sur mon Excel 2003.
Elle fonctionne parfaitement.
L'événement change n'est déclenché que par la modification de la valeur du champ soit par l'utilisateur soit par macro (ce qui n'est pas le cas ici).
Pour moi après test, l'événement change n'est pas déclenché par List.

Donc je ne vois pas ou est le souci mais il ne semble pas être dans cette macro.

Un autre avis peut-être...

PS : J'offre un coup à boire c'est ma 1000° ;-)
0
Bonjour Pilas,

Je vous remercie d'avoir pris le temps de répondre.
En faisant marcher la macro au pas à pas, c'est bien l'affectation du array Tab1 qui déclenchait l'évènement change.

Quoiqu'il en soit, j'ai obtenu une autre réponse sur un autre forum:
En utilisant une technique de "drapeau", j'ai pu contourner le problème:

Je déclare une variable boolean "Flag".
Je place celle-ci avec la valeur "True" juste avant la modification de la combo.
Puis je lui affecte la valeur "False" juste après.
Enfin, je mets une condition au début de l'évènement Change pour le déclenchement :
If Flag = False then .... (déclenchement normal de l'évènement Change)

J'espère avoir été assez clair pour les futurs lecteurs.

Merci encore
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 645
Modifié par pilas31 le 16/01/2012 à 14:38
Merci, habituellement les demandeurs qui postent sur plusieurs forums ne viennent plus nous dire la solution trouvée ailleurs.
Je vous remercie d'avoir fait cette démarche.

Ceci dit je ne m'explique pas pourquoi cela fonctionne chez moi. (je vais quand même essayer de creuser pour ma culture personnelle)

Bonne continuation.
0