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
A voir également:
- COMBOBOX change et outil de recherche dans BdD
- Changer de dns - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Outil de benchmark gratuit - Accueil - Utilitaires
- Télécharger outil capture d'écran ciseaux - Télécharger - Capture d'écran
- Rechercher ou entrer l'adresse mm - recherche google - Guide
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, ici
Et là
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.
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, ici
Set obj = Me.Controls("ComboBox_CAT_" & inc) obj est un comboxbox.
Et là
obj.Value = Sheets(NomFeuille).Cells(i, inc + 3).Texttu 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 ?
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