Userform et Listes Imbriquées

Ptitgoud

XLDnaute Nouveau
Bonjour le forum,

J'ai un problème avec les listes de mon userform.
Tout d'abord je souhaiterais que ma Combobox1 agisse un peu comme les choix que peut proposer un filtre, c'est-à-dire je voudrais qu'elle prenne en compte les données situées dans une colonne mais sans y inscrire les doublons, je ne sais pas si cela est possible ...

Ensuite je voudrais qu'a partir de la sélection faite via la combobox1, la combobox2 nous liste uniquement les données de la colonne 2 correspondant à la sélection combobox1 ...
Par exemple, dans l'exemple que je vous joins, si je sélectionne A dans ma liste, j'aimerais que ma combobox2 affiche les choix 1,2 et 4 uniquement.

Merci d'avance!
 

Pièces jointes

  • Listes Imbriquées.xls
    32.5 KB · Affichages: 51
  • Listes Imbriquées.xls
    32.5 KB · Affichages: 50
  • Listes Imbriquées.xls
    32.5 KB · Affichages: 49

JNP

XLDnaute Barbatruc
Re : Userform et Listes Imbriquées

Bonjour Ptitgoud :),
Ton bonheur ICI :p.
Pour la suite, ben il suffit de mettre le même code dans l'événement Change de ComboBox1 et de rajouter un test pour savoir si tu rajoutes ou non à la liste :rolleyes:...
Bonne suite :cool:
 
D

Denis

Guest
Re : Userform et Listes Imbriquées

Bonjour Ptitgoud, JNP et le Forum
ci-joint ton fichier
Bon courage et à +
Denis
 

Pièces jointes

  • Listes Imbriquées.xls
    35 KB · Affichages: 69
  • Listes Imbriquées.xls
    35 KB · Affichages: 70
  • Listes Imbriquées.xls
    35 KB · Affichages: 73

Dull

XLDnaute Barbatruc
Re : Userform et Listes Imbriquées

Salut Ptitgoud, le Forum

Essaye de rechercher avec "CreateObject("Scripting.Dictionary")"

Mais comme c'est les fêtes de fin d'année :)

regardes le Fichier Joint avec les codes, et autres Plages Nommées

Code:
Option Explicit
Dim MonDico As Object, C As Range, temp, i As Byte
Private Sub ComboBox1_Change()
  Set MonDico = CreateObject("Scripting.Dictionary")
  For i = 1 To Range("Carton").Count
    If Range("Codes")(i) = ComboBox1 Then
      temp = Range("carton")(i)
      If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
    End If
    Next i
    With ComboBox2
        .Visible = True
        .List = MonDico.items
        .ListIndex = -1
    End With

End Sub

Private Sub UserForm_Initialize()

Set MonDico = CreateObject("Scripting.Dictionary")
  For Each C In [Codes]
    If Not MonDico.Exists(C.Value) Then MonDico.Add C.Value, C.Value
  Next C
  temp = MonDico.items
  Me.ComboBox1.List = temp
End Sub

EDITION: Salut Jean-Noël leBiennommée :), Denis :)
Bonne Journée
 

Pièces jointes

  • Ptitgoud.xls
    34.5 KB · Affichages: 69
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Userform et Listes Imbriquées

Bonjour Ptitgoud, bonjour le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous :
Code:
Private plage As Range 'déclare la variable plage
Private cel As Range 'déclare lavariable cel (CELlule)


Private Sub UserForm_Initialize()
Dim dico As Object 'déclare la variable dico (DICiOnnaire)
Dim temp As Variant 'déclare la variable temp (TEMPoraire)

Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
With Sheets("Feuil1") 'prend en compte l'onglet"Feuil1"
    Set plage = .Range("A2:A" & .Range("A65536").End(xlUp).Row) 'définit la variable plage
End With 'fin de la prise en compte de...
For Each cel In plage 'boucle sur toutes les cellules éditées cel de la plage
    dico(cel.Value) = "" 'alimente le dictionnaire
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère les données du dictionnaire sans doublon
ComboBox1.List = temp 'alimente la ComboBox1
End Sub


Private Sub ComboBox1_Change() ' au clic dans la ComboBox1
Me.ComboBox2.Clear 'vide la Combobox2
For Each cel In plage 'boucle sur toutes les cellules éditées cel de la plage
    'si la valeur de la cellule cel est égale à la valeur de lq ComboBox1, ajoute la cellule ajdacente à cel (colonne B) à la Combobox2
    If cel.Value = Me.ComboBox1.Value Then Me.ComboBox2.AddItem cel.Offset(0, 1).Value
Next cel 'prochaine cellule de la boucle
End Sub
Le fichier :

[Edition]
Oops 'achement en r'tard moi ! Bonjour Jean Noël, Denis, Dull...
 

Pièces jointes

  • Ptitgoud_v01.xls
    37 KB · Affichages: 58
Dernière édition:

fhoest

XLDnaute Accro
Re : Userform et Listes Imbriquées

Bonjour,
edit: bonjour a tous ceux qui ont été plus rapide que moi.
tu peux mettre ce code comme ceci il fonctionne:
il faut que tu agrandis ton userform dessine un listview et que tu le rétrécisse (userform pour que l'on ne voit pas le listview)
'dans modules 1
Code:
Sub inicb1()
UserForm1.ListView1.ListItems.Clear
With Feuil1
drligne = .[a:b].Find("*", , , , 1, 2).Row
Set dico = CreateObject("Scripting.Dictionary")
For Each c In .Range("a2:a" & drligne)
If Not dico.Exists(c.Value) And c.Value <> "" Then dico.Add c.Value, c.Value
Next c
End With
a = dico.keys
With UserForm1
.ListView1.ListItems.Clear
.ListView1.View = lvwReport
.ListView1.Sorted = False
For k = 0 To dico.Count - 1
lg = lg + 1
.ListView1.ListItems.Add lg, , a(k)
Next
.ListView1.Sorted = True
For k = 1 To dico.Count
.ComboBox1.AddItem .ListView1.ListItems(k)
Next
.Show 0
End With
End Sub
Sub inicb2()
UserForm1.ListView1.ListItems.Clear
UserForm1.ComboBox2.Clear
With Feuil1
drligne = .[a:b].Find("*", , , , 1, 2).Row
Set dico = CreateObject("Scripting.Dictionary")
For Each c In .Range("b2:b" & drligne)
If Feuil1.Cells(c.Row, 1) = UserForm1.ComboBox1.Text Then
If Not dico.Exists(c.Value) And c.Value <> "" Then dico.Add c.Value, c.Value
End If
Next c
End With
a = dico.keys
With UserForm1
.ListView1.ListItems.Clear
.ListView1.View = lvwReport
.ListView1.Sorted = False
For k = 0 To dico.Count - 1
lg = lg + 1
.ListView1.ListItems.Add lg, , a(k)
Next
.ListView1.Sorted = True
For k = 1 To dico.Count
.ComboBox2.AddItem .ListView1.ListItems(k)
Next
End With
End Sub
Sub Bouton1_QuandClic()
Call inicb1
End Sub
'dans userform1
Code:
Private Sub ComboBox2_Enter()
Call inicb2
End Sub
Ps: le code n'est pas de moi excepter l'adaptation a ton fichier (merci encore a ceux qui m'ont aidé pour ce code)
A+
 

Ptitgoud

XLDnaute Nouveau
Re : Userform et Listes Imbriquées

Bonjour tout le monde,

Merci pour vos réponses!

Je vais tester tout ça!!

Edit :
Toutes vos propositions sont différentes mais fonctionnent comme je le souhaite, il ne me reste plus qu'a choisir laquelle je vais garder!
Merci encore à vous tous!

Bonnes fêtes de fin d'année!
 
Dernière édition:
D

Denis

Guest
Re : Userform et Listes Imbriquées

Re le fil,
beaucoup de bonne solutions, juste un mot pour fhoest. Au lieu de mettre un listview et le cacher par la suite, utilise plutôt un tableau que tu redimensionnes a chaque entrée de donnée par la commande "redimpreserve". Ceci allège ton programme et accélère l’exécution.
Voir "redimpreserve" dans l'aide vba, très bien expliqué!
Bon courage et à +
Denis
 

fhoest

XLDnaute Accro
Re : Userform et Listes Imbriquées

Bonjour denis ,
comme j'ai stipuler le code n'est pas de moi il m'a été très utile,mais je te remercie pour ton conseille j'irais jeter un oeil dès que j'ai un peu de temps
c'est vrai que si cela peut encore être plus rapide c'est intéressant car le but du code au départ été la rapidité.
Merci encore pour le conseil pour info le listview sert égalent a faire un tri par ordre alphabétique et perso je n'ai pas analyser les autres code proposé pour voir si cela été gerer.
A+
 

Ptitgoud

XLDnaute Nouveau
Re : Userform et Listes Imbriquées

Re,

Je reviens vers vous parce que j'ai un soucis.
J'ai remplacé la deuxieme ComboBox par une ListBox afin de voir directement les différents résultats.
Sur un fichier exemple la macro fonctionne parfaitement, néanmoins sur un second fichier la macro ne me renvoie aucun résultat dans la listbox
Je vous joins les deux fichiers, si quelqu'un pourrait m'indiquer d'où vient le problème sur le second fichier (les variables me renvoient pourtant les bonnes valeurs lors d'un débogage ...), le fichier test.xls étant celui ou la macro ne fonctionne pas.

Merci d'avance!

EDIT : C'est bon j'ai trouvé il fallait que je mette
If cel.Value = Me.ComboBox1.Text Then
au lieu de
If cel.Value = Me.ComboBox1.Value Then
 

Pièces jointes

  • Exple_Liste.xls
    36 KB · Affichages: 71
  • test.xls
    390.5 KB · Affichages: 78
  • test.xls
    390.5 KB · Affichages: 83
  • test.xls
    390.5 KB · Affichages: 86
Dernière édition:

fhoest

XLDnaute Accro
Re : Userform et Listes Imbriquées

Bonjour
le problème vient du fait que tu test une valeur et non du texte
change comme ceci:
Code:
Private Sub ComboBox1_Change()
Me.ListBox1.Clear

For Each cel In plage
    If cel.Text = Me.ComboBox1.Value Then
    Me.ListBox1.AddItem cel.Offset(0, 1).Value
    End If
Next cel

End Sub
A+
 

Discussions similaires

Réponses
8
Affichages
240
Réponses
21
Affichages
1 K

Statistiques des forums

Discussions
312 323
Messages
2 087 301
Membres
103 512
dernier inscrit
sisi235