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 :

Lister valeurs ListBox selon ComboBox - UserForm [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chargé de pilotage et performance
    Inscrit en
    Juillet 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chargé de pilotage et performance

    Informations forums :
    Inscription : Juillet 2016
    Messages : 25
    Par défaut Lister valeurs ListBox selon ComboBox - UserForm
    Salut a tous !

    Nouveau weekend, nouvelle question

    D'abord je m'excuse, je suis sur clavier QWERTY et n'ai donc pas les accents.

    Alors voila je dispose d'un classeur Excel avec en colonne A les clients, et en colonne B les mots cles lies a ces clients.
    Cela signifie qu'en colonne A, un meme client peut apparaitre plusieurs fois mais avec un mot cle different en colonne B.

    J'aimerai creer un userform avec une ComboBox qui me liste les clients en A sans doublons, et une ListBox qui repertorie tous les mots cles relies au client selectionne avec la ComboBox.

    Mon userform est deja cree, je sais comment remplir ma ComboBox avec les clients sans les doublons en utilisant un dictionnaire, mais je n'arrive pas a lier les mots cles de chaque clients dans ma ListBox.
    Je sais le faire lorsqu'il n'y a qu'une ligne par client et que tous les mots cles sont listes par colonnes.

    Mon code :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Private Sub UserForm_Initialize()
    Dim wb As Workbook, sh As Worksheet, i As Long
     
    Set wb = ThisWorkbook
    Set sh = Sheet1
     
    i = sh.Range("A" & Rows.Count).End(xlUp).row
     
    For x = 2 To i
        If IsError(sh.Range("A" & x)) Then sh.Range("A" & x) = "N/A"
    Next x
     
    Me.ComboBox1.Clear
     
    Call FillCombo(ComboBox1, sh.Range("A2:A" & i))
    End Sub
     
    Sub FillCombo(combo As ComboBox, rg As Range)
    Dim dict As Object, C As Range, Item As String
     
    Set dict = CreateObject("Scripting.Dictionary")
     
    For Each C In rg
        Item = Trim(C.Value)
     
            If dict.Exists(Item) = False Then
                dict.Add Item, 1
                combo.AddItem Item
            End If
    Next
     
    Set dict = Nothing
    End Sub
     
    Private Sub ComboBox1_Change()
    FillKeywordsList ComboBox1.ListIndex
    End Sub
     
     
    Sub FillKeywordsList(ByVal row As Long)
    Dim rg As Range
     
    Set rg = Sheet1.Range("B2:H2").Offset(row)
     
    ListBox1.Clear
    ListBox1.List = WorksheetFunction.Transpose(rg)
    End Sub

    Au lieu de tenter d'expliquer par les mots, je vous mets en piece jointe un exemple.
    Le but est donc de faire fonctionner mon code avec les valeurs telles qu'elles sont presentees dans l'onglet "fonctionne pas".

    Tant que j'y suis, y a t-il un moyen de trier les valeurs de la ComboBox ? De la ListBox ? Par ordre alphabetique.

    Merci infiniment pour votre aide precieuse
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par Lyricslife Voir le message
    Salut a tous !


    D'abord je m'excuse, je suis sur clavier QWERTY et n'ai donc pas les accents.
    Juste à prendre le clavier Français-Canada ou le clavier canadien multilingue. Ils ont tous les accents français et ils sont Qwerty.

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,


    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
     
    Dim f, BD()
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      BD = f.Range("A2:B" & f.[B65000].End(xlUp).Row).Value ' Array BD() pour rapidité
      Set d = CreateObject("Scripting.Dictionary")
      For i = 1 To UBound(BD)             ' on explore la colonne de niveau 1
        d(BD(i, 1)) = ""                  ' on ajoute l'élément de la famille au dictionnaire
      Next i
      Me.ComboBox1.List = d.keys
      Me.ListBox1.List = BD
    End Sub
     
    Private Sub ComboBox1_click()
      Me.ListBox1.Clear
      For i = 1 To UBound(BD)
        If BD(i, 1) = Me.ComboBox1 Then Me.ListBox1.AddItem BD(i, 2)
      Next i
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  4. #4
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour, pardonnez moi de déborder un peu.
    Juste pour signaler a BoisgontierJacques: Sur mon Mac(10.6) La macro plante et un message signale erreur d'éxécution 429, un composant ActiveX ne peut pas créer d'objet?
    Est-ce une particularité de la version Mac?
    Cordialement

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Cf version MAC ( avec Collection au lieu de Dictionary)

    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
     
    Dim f, BD()
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      BD = f.Range("A2:B" & f.[B65000].End(xlUp).Row).Value ' Array BD() pour rapidité
      tblclé = Application.Transpose(f.Range("B2:B" & f.[B65000].End(xlUp).Row).Value)
      a = SansDoublonsMAC(tblclé)
      Me.ComboBox1.List = SansDoublonsMAC(tblclé)
    End Sub
     
    Private Sub ComboBox1_click()
      Me.ListBox1.Clear
      For i = 1 To UBound(BD)
        If BD(i, 2) = Me.ComboBox1 Then Me.ListBox1.AddItem BD(i, 1)
      Next i
    End Sub
     
    Function SansDoublonsMAC(a)
      Dim Maliste As New Collection
      On Error Resume Next
      For i = LBound(a) To UBound(a)
         Maliste.Add Item:=a(i), Key:=a(i)
      Next i
      On Error GoTo 0
      Dim b(): ReDim b(1 To Maliste.Count)
      For i = 1 To Maliste.Count
        b(i) = Maliste(i)
      Next i
      SansDoublonsMAC = b
    End Function
    Boisgontier
    Fichiers attachés Fichiers attachés

  6. #6
    Membre averti
    Homme Profil pro
    Chargé de pilotage et performance
    Inscrit en
    Juillet 2016
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chargé de pilotage et performance

    Informations forums :
    Inscription : Juillet 2016
    Messages : 25
    Par défaut
    Bonjour et merci pour vos réponses !

    @EricKergresse, cela marche parfaitement et les valeurs sont même triées ! Je vais étudier ce code de plus près ! Un grand merci !

    @boisgontierjacques, j'ai pu adapter le code à mon fichier et cela marche également
    Suite à cela, afin de mieux comprendre, plusieurs questions me viennent a l'esprit :

    1. quelle est la DIM de BD ? Lorsque j'essaye d'afficher sa valeur dans un msgbox ou un debug.print j'ai un message d'erreur ;
    2. à quel moment le tri des doublons est-il effectué ?
    3. je ne comprends pas cette partie du code : d(BD(i, 2)) = "", pourquoi = "" ?
    4. comment dois-je annoncer la variable ColTri dans la Sub TriMultiCol ?

    Encore merci pour vos réponses !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lyricslife Voir le message
    Bonjour,

    Une solution possible dans le fichier joint.

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

Discussions similaires

  1. [XL-2016] limite listbox selon combobox
    Par meteo62 dans le forum Excel
    Réponses: 3
    Dernier message: 22/01/2017, 13h15
  2. [XL-2007] Tri listBox selon valeur combobox
    Par sdispro dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/07/2014, 22h07
  3. [XL-2007] Filtrer une ListBox selon la valeur d'une ComboBox
    Par Jeromeric dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/11/2011, 23h38
  4. Recupérer valeur champ selon combobox
    Par enlair dans le forum VBA Access
    Réponses: 9
    Dernier message: 22/08/2007, 17h03

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