Réinitialiser combobox en cascade

helene51

XLDnaute Junior
Bonjour le forum,

Encore une fois je reste bloquée avec mes combobox et je ne trouve pas la solution. Je me tourne donc vers vos lumières pour comprendre ce qui ne marche pas avec mon code ...

Sur un formulaire (Userform2) j'ai 2 combobox : Combobox1 et Combobox2. Je charge ma première combobox avec les données d'une colonne (après élimination des doublons) et en fonction de mon choix, je filtre mes données et je dois choisir un autre critère dans ma seconde Combobox (après élimination des doublons). Là, tout fonctionne très bien.

Mon problème est que lorsque je lance le Userform 2 fois de suite, les valeurs de choix (fait précédemment) restent dans les combobox : si lors de ma 1ere saisie j'ai choisi B dans le combobox1 et B2 dans le combobox2, lors de ma 2ème saisie je vois affiché avant même y toucher B et B2.

J'ai essayé de caser un "userform2.combobox1.clear" mais ça ne fonctionne pas, j'obtient erreur d'execution 6 dépassement de capacité.

Voici un petit bout de mon code :
Code:
Dim i As Byte, k As Byte
Dim Temp As String
Dim Fait As Boolean, Fait2 As Boolean
Dim Ligne As Integer, Derligne As Integer, Li As Integer
Dim Cel As Range

Sub UserForm_Initialize()
ComboBox1.Clear

Sheets("Donnees brutes").Activate
With Sheets("Donnees brutes")
    Derligne = .UsedRange.Rows.Count
    .Range("A2:A" & Derligne).EntireRow.Hidden = False
    For j = 2 To Derligne
        ComboBox1 = .Range("A" & j)
        If ComboBox1.ListIndex = -1 And .Range("A" & j) <> "" Then ComboBox1.AddItem .Range("A" & j)
    Next j
    
    With ComboBox1
      For i = 0 To .ListCount - 1
        For k = 0 To .ListCount - 1
          If .List(i) < .List(k) Then
            Temp = .List(i)
            .List(i) = .List(k)
            .List(k) = Temp
          End If
        Next k
      Next i
      .ListIndex = -1
    End With
End With
Fait = True
End Sub

Private Sub ComboBox1_Change()
Fait2 = False
If Fait = False Then Exit Sub 'pour éviter le passage lors de l'initialisation
With Sheets("Donnees brutes")
    .Range("A2:A" & ActiveSheet.UsedRange.Rows.Count).EntireRow.Hidden = False
    Set Mondico = CreateObject("Scripting.Dictionary")
    For Each Cel In Range("C2:C" & Derligne)
        If Cel.Offset(0, -2) Like ComboBox1.Value Then
        If Not Mondico.Exists(Cel.Value) Then Mondico.Add Cel.Value, Cel.Value
        End If
    Next
    ComboBox2.List = Mondico.items

    With ComboBox2
      For i = 0 To .ListCount - 1
        For k = 0 To .ListCount - 1
          If .List(i) < .List(k) Then
            Temp = .List(i)
            .List(i) = .List(k)
            .List(k) = Temp
          End If
        Next k
      Next i
      .ListIndex = -1
    End With
    
    a = Mondico.RemoveAll
    Application.ScreenUpdating = False
    For Li = 2 To Derligne
        If Cells(Li, 1).Value <> ComboBox1.Value Then Cells(Li, 1).EntireRow.Hidden = True
    Next
    Application.ScreenUpdating = True
End With

Fait2 = True
End Sub

Private Sub ComboBox2_Change()
Application.ScreenUpdating = False
If Fait2 = False Then Exit Sub
With Sheets("Donnees brutes")
    .Range("A2:A" & ActiveSheet.UsedRange.Rows.Count).EntireRow.Hidden = False
    For Li = 2 To Derligne
        If Cells(Li, 1).Value <> ComboBox1.Value Then Cells(Li, 1).EntireRow.Hidden = True
        If Cells(Li, 3).Value <> ComboBox2.Value Then Cells(Li, 1).EntireRow.Hidden = True
    Next
    Application.ScreenUpdating = True
    Fait = True
    Fait2 = True
End With

End Sub
 

helene51

XLDnaute Junior
Re : Réinitialiser combobox en cascade

Bonjour gilbert_RGI, bonjour le forum,

J'ai essayé ta solution mais ça ne change pas mon problème. J'ai toujours en visu ma sélection précédente lorsque je veux faire une 2ème saisie.

En fait, avec mes 2 combobox je fais des filtres sur ma base de données puis je clique sur un bouton pour afficher 1 graphique. Quand mon graphique est affiché, je peux refaire une autre recherche et c'est là que ça ne marche pas. Quand j'affiche de nouveau mon USF, mes combobox sont encore remplies des valeurs précédentes. J'aimerai qu'elles soient vides comme la première fois à l'ouverture du fichier. Est-ce possible ?

J'ai essayé quelque chose du type :
ComboBox2.RemoveItem (ComboBox2.ListIndex)
mais ça ne change rien.

Du coup, je ne peux faire qu'1 recherche après l'autre en fermant le fichier à chaque fois. Pas très pratique !

Si quelqu'un a une autre idée à me soumettre, je veux bien tester volontiers.

Merci.
 

helene51

XLDnaute Junior
Re : Réinitialiser combobox en cascade

Rebonjour le forum, gilbert_RGI,

J'ai trouvé le moyen de simplifier ma demande ... enfin que ce soit plus clair : j'ai fait un petit exemple.

Dans mon fichier joint, mon problème est que lorsque l'on relance le USF (après un premier choix dans les 2 Cbx) les valeurs sont toujours apparentes.

Je souhaite les réinitialiser. Est-ce possible ?

Merci pour vos idées.
 

Pièces jointes

  • Init combobox.xls
    38.5 KB · Affichages: 126

Robert

XLDnaute Barbatruc
Repose en paix
Re : Réinitialiser combobox en cascade

Bonjour le fil, bonjour le forum,

Remplace UserForm1.Hide par Unload me.
Car Hide masque l'Userform mais ne le vide pas. Tu le retrouve dans le même état au prochain Show. Tandis que Unload lui vide et masque l'userform...
 

helene51

XLDnaute Junior
Re : Réinitialiser combobox en cascade

Bonjour Robert,

Merci pour ta réponse.

J'ai testé mais ça ne fonctionne pas. J'ai un message d'erreur : Erreur d'éxecution 6, dépassement de capacité. (j'ai remplacé Userform1.hide par unload me)

Je ne comprends pas cette erreur et pourquoi ça ne fonctionne pas ...

Si vous savez me l'expliquer, je veux bien comprendre.

Merci.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Réinitialiser combobox en cascade

Bonsoir le fil, bonsoir le forum,

Hélène en pièce jointe ton fichier modifié.
Le premier problème venait du fait que tu comparais l'inégalité de la valeur d'une cellule et celle de la Combobox1 :
Code:
If Cells(Li, 1).Value <> ComboBox1.Value Then Rows(Li).Hidden = True
et comme la cellule renvoie une valeur numérique et la ComboBox1 un valeur texte toutes les lignes étaient masquée. J'ai corrigé avec :
Code:
If [COLOR=red]CStr([/COLOR]Cells(Li, 1).Value[COLOR=red])[/COLOR] <> ComboBox1.Value Then Rows(Li).Hidden = True
Ensuite, au clic sur le bouton, tu voulais, je pense, réafficher toutes les ligne mais comme seule la première était affichée, la variable Derligne définie comme ça :
Code:
Derligne = Sheets("Feuil1").[A2].End(xlDown).Row
renvoyait 65536 et comme elle est décalré Integer, il y avait Dépassement de capacité.
 

Pièces jointes

  • Helene_v01.xls
    47.5 KB · Affichages: 169

helene51

XLDnaute Junior
Re : Réinitialiser combobox en cascade

Bonjour Robert, bonjour le forum,

J'ai testé ta solution. Ca marche nickel !

Un grand merci d'avoir passé du temps sur mon problème.

Je vais bien regarder ton code pour apprendre et ne plus avoir le problème la prochaine fois.

Merci beaucoup.

Bonne journée.
 

Discussions similaires

Réponses
4
Affichages
208
Réponses
11
Affichages
286

Statistiques des forums

Discussions
312 191
Messages
2 086 052
Membres
103 109
dernier inscrit
boso_vs_viking