COMBOBOX change et outil de recherche dans BdD
jubatail
Messages postés
39
Statut
Membre
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
Voici le code qui permet l'initialisation de mes combobox :
Voici le code qui permet de modifier la userform en fonction des sélections déjà effectuées :
Pourquoi la procédure combobox_change se lance au niveau de la ligne que j'ai mis en gras ?
merci
julie
Voici le code qui permet l'initialisation de mes combobox :
For inc = 1 To NbColonne
'nommage des labels
Set obj = Me.Controls("Label" & inc)
obj.Caption = NomColonne(inc - 1)
'remplissage des boxs
Set obj = Me.Controls("ComboBox_CAT_" & inc)
<gras> For i = 4 To Sheets(NomFeuille).Cells.Find("*", , LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'évite de répeter deux fois la même donnée
obj.Value = Sheets(NomFeuille).Cells(i, inc + 3).Text</gras>
If obj.ListIndex = -1 Then obj.AddItem Sheets(NomFeuille).Cells(i, inc + 3).Text
Next i
'on met des boxs vides à l'ouverture de la fenêtre
obj.Value = ""
Next
Voici le code qui permet de modifier la userform en fonction des sélections déjà effectuées :
Private Sub ComboBox_CAT_1_Change()
If eventFlag = False Then Call actualiserBoxes
End Sub
Pourquoi la procédure combobox_change se lance au niveau de la ligne que j'ai mis en gras ?
merci
julie
4 réponses
-
Bonjour
la balise de code invalide la balise de gras, mais bon on voit écrit <gras>...</gras> dans ton code.
VBA, c'est pas mon fort, mais à vue de nez, iciSet obj = Me.Controls("ComboBox_CAT_" & inc)obj est un comboxbox.
Et làobj.Value = Sheets(NomFeuille).Cells(i, inc + 3).Text
tu changes sa valeur, donc l'évèment changed est déclenché.
Une solution simple est de mettre un booléen global, avant toutes ces boucles tu le passes à True, et après tu le remets False.
Dans l'événement, tu agis seulement quand ce booléen vaut False.
-
merci pour ta réponse qui m'a permis de comprendre :)
je te montre la procédure actualiser boxe ou justement la j'ai mis un booléen global!! est ce que je dois faire pareil pour l'initialisation de la userform du coup ? -
Private Sub actualiserBoxes() Dim inc As Integer, i As Integer Dim obj As Object Dim Ligne As Range Dim num As String, nom As String eventFlag = True ' on active le flag évènement pour ne pas appeler indéfiniment l'évènement "change" If Me.Visible = True Then ' si la userform a déjà été initialisée alors... Set obj = Me.ActiveControl num = Right(obj.Name, 1) ' on active le filtre concerné worksheets(NomFeuille).Range("$A$3:$AW$1000").AutoFilter Field:=num + 3, Criteria1:=obj.Value For inc = 1 To NbColonne Set obj = Me.Controls("ComboBox_CAT_" & inc) If "ComboBox_CAT_" & inc <> Me.ActiveControl.Name Then ' Si ce n'est pas la boxe sélectionnée alors... nom = obj.Value obj.Clear ' pour chaque ligne filtrée on récupère la valeur de la cellule concernée For Each Ligne In worksheets(NomFeuille).AutoFilter.Range.Columns(inc + 3).SpecialCells(xlCellTypeVisible).Cells obj.Value = Ligne.Text If obj.ListIndex = -1 And Ligne.Text <> sheets(NomFeuille).Cells(3, inc + 3).Text Then obj.AddItem Ligne.Text Next Else ' sinon on récupère juste la valeur active et on vide le contenu de la boxe sélectionnée nom = obj.Value obj.Clear End If obj.Value = nom ' puis on replace la valeur initiale de la boxe (vide ou valeur qui avait été choisie par l'utilisateur) Next End If ' libération mémoire et flag évènement Set obj = Nothing eventFlag = False End Sub -