VBA: Modification d'une liste Combobox [Résolu]

Reveolte 2 Messages postés mercredi 11 janvier 2012Date d'inscription 12 janvier 2012 Dernière intervention - 11 janv. 2012 à 17:21 - Dernière réponse : Reveolte 2 Messages postés mercredi 11 janvier 2012Date d'inscription 12 janvier 2012 Dernière intervention
- 12 janv. 2012 à 09:44
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
Afficher la suite 

2 réponses

Répondre au sujet
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 11 janv. 2012 à 19:38
+3
Utile
Salut

Oui, c'est le problème des Combo.
Il y a le même genre de souci avec _Click
Il te suffit de déclarer une variable booléenne dans la partie "Déclarations" de ta page de code, par exemple
Private bActionEnCours As Boolean
et de l'utiliser comme drapeau pour dire que le programme est à l'origine du changement :
Là où tu t'apprêtes à modifier le contenu de ta Combo, tu positionnes ta variable à True :
bActionEnCours = True
et, bien sûr, tu la replaces à False quand tu as terminé.
Et dans le ComboBox_Change, il te suffit de tester ta variable :
If Not bActionEnCours Then
    ' C'est l'utilisateur qui modifie
    ' Ici mon programme
End If

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Jack
Reveolte 2 Messages postés mercredi 11 janvier 2012Date d'inscription 12 janvier 2012 Dernière intervention - 12 janv. 2012 à 09:44
0
Utile
Super Jack!!

Ca marche très bien!
Je ne connaissais pas ce système de drapeau, je mourrai moins bête ce soir.

Merci beaucoup
Commenter la réponse de Reveolte

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.