IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

List box multicritère


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut List box multicritère
    Bonjour,

    J’ai crée une boite de dialogue avec des listbox pour interroger ma base de donnée avec laquelle je souhaite gérer trois colonnes.
    Colonne B : Constructeur
    Colonne C : Modèle
    Colonne D : Motorisation

    Et j’ai pour chaque colonne deux listbox. (Total 6 listbox)
    Une colonne ou j’ai la liste qui se renseigne automatiquement et la seconde ou je choisi à l’aide de bouton les données que je souhaite avoir.
    Le point dur c’est que les listbox sont interdépendantes je m’explique dans :
     Listbox 1 (filtre automatique sur la colonne B).
     Listbox 2 (je choisi les valeurs que je souhaite dans la listbox 1).
     Listbox 3 (filtre automatique par rapport aux données de la colonne B se trouvant dans la listbox 2 et affiche les données de la colonne C(Interaction).
     Listbox 4 (je choisi les valeurs que je souhaite dans la listbox 3).
     Listbox 5 (filtre automatique par rapport aux données de la colonne B se trouvant dans la listbox 2 et aux données de la colonne C se trouvant dans la listbox 4 et affiche les données de la colonne D (Interaction)).
     Listbox 6 (je choisi les valeurs que je souhaite dans la listbox 5).

    Pour l’instant j’en suis au transfert des données de la base dans la listbox1 et le choix des données dans la listbox 2.

    Si quelqu’un à déjà été exposé à ce problème ou à une idée sur comment je peux faire ?

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Tu n'auras peut être pas besoin d'autant de ListBox; 3 suffisent avec la propriété MultiSelect à True

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut list box multicritère
    Oui je veux bien prendre tous les idées qui pourront me permettre de faire mon application...

    Je mets ici un exemple de la boite de dialogue que j'ai faite en attendant de la compléter..
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Une proposition avec 3 listbox nommées LstCon, LstMod et LstMot

    A l'initialisation, on fixe le Multiselect des 3 listbox (qui pourrait être en dur dans propriétés) et on remplit sans doublons la 1ère listbox LstCon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Option Explicit
     
    Dim Tb
    Dim Constr As String
     
    Private Sub UserForm_Initialize()
    Dim Lastlig As Long
     
    Me.LstCon.MultiSelect = fmMultiSelectMulti
    Me.LstMod.MultiSelect = fmMultiSelectMulti
    Me.LstMot.MultiSelect = fmMultiSelectMulti
     
    With Feuil10
        Lastlig = .Cells(.Rows.Count, "B").End(xlUp).Row
        Tb = .Range("B10:H" & Lastlig).Value
    End With
    RemplirCons
    End Sub
     
    Private Sub RemplirCons()
    Dim i As Long, n As Long
    Dim Dico As Object
     
    n = UBound(Tb, 1)
    Set Dico = CreateObject("scripting.dictionary")
    For i = 1 To n
        If Not Dico.exists(Tb(i, 1)) Then Dico.Add Tb(i, 1), Tb(i, 1)
    Next i
    If Dico.Count > 0 Then Me.LstCon.List = Dico.items
    Set Dico = Nothing
    End Sub
    Ensuite à chaque choix (simple ou multiple) dans LstCon, on remplit LstMod sans doublons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Private Sub LstCon_Change()
    Dim i As Long
     
    Me.LstMod.Clear
    Me.LstMot.Clear
    Constr = ""
    With Me.LstCon
        For i = 0 To .ListCount - 1
            If .Selected(i) Then Constr = Constr & ";" & .List(i)
        Next i
    End With
    RemplirMod Constr
    End Sub
     
    Private Sub RemplirMod(ByVal Str As String)
    Dim i As Long, n As Long
    Dim Dico As Object
     
    If Me.LstCon.ListIndex > -1 Then
        n = UBound(Tb, 1)
        Set Dico = CreateObject("scripting.dictionary")
        For i = 1 To n
            If InStr(Str, ";" & Tb(i, 1)) Then
                If Not Dico.exists(CStr(Tb(i, 2))) Then Dico.Add CStr(Tb(i, 2)), CStr(Tb(i, 2))
            End If
        Next i
        If Dico.Count > 0 Then Me.LstMod.List = Dico.items
        Set Dico = Nothing
    End If
    End Sub
    Et au choix de LstMod on remplit LstMot sans doublons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Private Sub LstMod_Change()
    Dim Model As String
    Dim i As Long
     
    Me.LstMot.Clear
    With Me.LstMod
        For i = 0 To .ListCount - 1
            If .Selected(i) Then Model = Model & ";" & .List(i)
        Next i
    End With
    RemplirMot Constr, Model
     
    End Sub
     
    Private Sub RemplirMot(ByVal Co As String, ByVal Mo As String)
    Dim i As Long, n As Long
    Dim Dico As Object
     
    Me.LstMot.Clear
    If Me.LstMod.ListIndex > -1 Then
        n = UBound(Tb, 1)
        Set Dico = CreateObject("scripting.dictionary")
        For i = 1 To n
            If InStr(Co, ";" & Tb(i, 1)) > 0 And InStr(Mo, ";" & Tb(i, 2)) > 0 Then
                If Not Dico.exists(Tb(i, 3)) Then Dico.Add Tb(i, 3), Tb(i, 3)
            End If
        Next i
        If Dico.Count > 0 Then Me.LstMot.List = Dico.items
        Set Dico = Nothing
    End If
    End Sub
    Fichier d'illustration

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Par défaut
    - Merci sa marche très bien et en plus du premier coup génial...
    ********Vu que les difficultés que je rencontre concernent les listes box je continue sur ce post sa me permet en même temps d'avoir aussi toute mon application sur le même fil et peut être servir à une autre personne...

    Ci joint la suite de mon application reformulé ///

    Ce quelle doit faire :
    Chercher les données affiché dans listbox copié/collé sans doublons et additionnée les valeurs pour chaque données présentent dans la liste box dans feuille « «x »

    Je vais essayée d’être la plus claire possible !!!

    Je souhaite chercher à partir de la listbox3 « LstMot » sélectionnées, les données dans la feuille (« Liste pièce de rechange »).colonne (« D10 )

    • Chaque fois que la valeur est trouvé alors copié sans doublons les données de la ligne (« E10 :G ») dans la feuille (« 7- Fiche pièces de rechange »).colonne (« A7 :C ») mais aussi….
    • Chaque fois que la valeur trouvé dans la feuille (« Liste pièce de rechange »).colonne (« D10 ) additionné les valeurs de la colonne.(G10 :G) trouvées et collées les valeurs dans la feuille (« 7-Fiche pièces de rechange ») .colonnes (« D7 ) équivalent à la ligne collée précédemment.

    Je pense que si j’arrive à traduire sa en code alors mon application sera faite mais je ne suis pas encore sortie de l’auberge…

    Comme indiqué dans les données j’aurais besoins de deux boucles « for each » imbriqué mais je ne sais vraiment pas comment faire ça !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Composant Graphique] List Box "synchronisés"
    Par Raideman dans le forum C++Builder
    Réponses: 9
    Dernier message: 03/11/2006, 20h50
  2. Largeur d'une liste box
    Par poiiop dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 27/09/2004, 00h47
  3. Passer a la ligne ds une list box
    Par schnito dans le forum MFC
    Réponses: 11
    Dernier message: 19/02/2004, 14h11
  4. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 13h36
  5. Réponses: 2
    Dernier message: 17/08/2003, 21h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo