COMBOBOX change et outil de recherche dans BdD

Fermé
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017 - 30 août 2017 à 10:27
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 30 août 2017 à 14:15
Bonjour,

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:

4 réponses

Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
30 août 2017 à 13:42
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
Set 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.

0
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017
30 août 2017 à 14:01
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 ?
0
jubatail Messages postés 37 Date d'inscription lundi 31 juillet 2017 Statut Membre Dernière intervention 14 septembre 2017
30 août 2017 à 14:01
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
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 931
30 août 2017 à 14:15
Dans ce cas utilise eventFlag qui existe déjà.
0