COMBOBOX change et outil de recherche dans BdD

jubatail Messages postés 39 Statut Membre -  
 Utilisateur anonyme -
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

4 réponses

  1. Utilisateur anonyme
     
    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
  2. jubatail Messages postés 39 Statut Membre
     
    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
  3. jubatail Messages postés 39 Statut Membre
     
    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
  4. Utilisateur anonyme
     
    Dans ce cas utilise eventFlag qui existe déjà.
    0