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 :

Listbox dépendantes en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Par défaut Listbox dépendantes en VBA
    Bonjour à tous.

    Je ne trouve pas, malgré de multiples recherches et essais, la solution à un problème qui doit pourtant pas être si compliquée que ça :

    Dans un Userform, j'ai plusieurs listboxs qui sont alimentées chacune par une colonne d'une feuille (sous excel97).

    Je voudrais pouvoir réactualiser une listbox en fonction des valeurs selectionnées par l'utilisateur dans les listbox précédentes.

    Par exemple, la listbox1 contient le nom d'entreprises clientes et la listbox2 le nom des collaborateurs. Je voudrais, lorsque l'utilisateur selectionne une ou plusieurs entreprises dans listbox1, que listbox2 n'ait comme entrées que les collaborateurs correspondants à ces entreprises.

    Les entreprises sont dans la colonne D et les collaborateurs dans la colonne E, et toutes les colonnes contiennent des données à partir de la ligne 10.

    J'ai donc une fonction pour alimenter une listbox (qui m'a été donnée par Qwaz , parce que là aussi je peinais comme un galérien) :
    EDIT : me suis gouré, j'avais trouvé le code je sais plus où sur le net, mais Qwaz et Laetitia m'avaient vraiment beaucoup aidé.


    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
    'alimente une listbox lst à partir d'une plage Target de la feuil1 (nom = "BASE") 
    Private Sub AlimList(lst As Object, ByVal Target As Excel.Range)
     
    Dim tablo As Variant, Tempo As Variant, i As Long, j As Long
        Worksheets("BASE").Activate  'à défaut d'instancier la feuille
        tablo = Target.Value
    'triAlpha
        For i = 1 To UBound(tablo)
            For j = 1 To UBound(tablo)
                If tablo(i, 1) < tablo(j, 1) Then
                    Tempo = tablo(i, 1)
                    tablo(i, 1) = tablo(j, 1)
                    tablo(j, 1) = Tempo
                End If
            Next j
        Next i
    'Remplissage excluant les doublons
        lst.AddItem tablo(1, 1)
        For i = 2 To UBound(tablo)
            If tablo(i, 1) <> tablo(i - 1, 1) Then lst.AddItem tablo(i, 1)
        Next
        lst.ListIndex = -1
    End Sub

    J'ai essayé de créer plusieurs fonctions usant de différentes stratégies telles que :

    - récupérer les numéros des lignes comportant les valeurs 'clés' de listbox1 pour ensuite récupérer les valeurs à mettre dans listbox2 => pas réussi

    - même chose avec les coordonnées des cellules => pas réussi

    A chaque fois j'ai essayé de stocker les coordonnées de plusieurs façons différentes : tableau, range (via Union), collections, etc ...
    Pareil pour le "décalage" des coordonnées (pour passer de la colonne E à la D), j'ai essayé en modifiant les strings des coordonnées, en utilisant Offset, ...

    Je dois juste être trop mauvais. J'ai commencé le VBA y'a une semaine pour mon stage.

    Auriez-vous des pistes, ou encore mieux, des codes ? J'ai beau essayer de trouver d'autres moyens, là je cale.

    Je vous mets pas mes codes pour pas vous influencer, si vous les voulez y'a qu'à demander (je les ai pas tous gardés par contre ).

    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Par défaut
    Je continue d'essayer, j'en arrive à la fonction suivante :

    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
    'fonction qui retourne un range contenant les cellules correspondantes à
    'celles de plageRecherche qui contiennent valeurCherchee.
    'decal sert pour la fonction offset
     
    Public Function plageValeur(ByVal valeurCherchee As String, ByVal plageRecherche As Range, ByVal decal As Integer) As Range
     
    Dim maCell As Range
     
    For Each maCell In plageRecherche.Cells
        If maCell.Value = valeurCherchee Then
     
            If plageValeur Is Nothing Then
                Set plageValeur = maCell.Offset(, decal)
            Else
                Set plageValeur = Application.Union(plageValeur, maCell.Offset(, decal))
            End If
        End If
     
    Next maCell
     
     
    End Function
    Et voici l'initialize dans lequel je teste l'appel avec la valeur BBF (qui existe bien dans la colonne D):

    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
    Private Sub UserForm_Initialize()
     
        Dim tstPlag As Excel.Range
        With Sheets(1)
     
        Set tstPlag = plageValeur("BBF", Range("D10:D" & Range("D" & Rows.Count).End(xlUp).Row), 1)
     
        'Pour une raison inconnue,
        'AlimList ne marche pas sur la listbox concernée par le premier appel
        'donc le premier appel est fait sur une box cachée (listbox5) qui sert de poubelle à bug
            AlimList ListBox5, Range("A1:A2")
            AlimList ListBox1, Range("D10:D" & Range("D" & Rows.Count).End(xlUp).Row)
            AlimList ListBox2, tstPlage
            'AlimList ListBox2, Range("E10:E" & Range("E" & Rows.Count).End(xlUp).Row)
            AlimList ListBox3, Range("F10:F" & Range("F" & Rows.Count).End(xlUp).Row)
            AlimList ListBox4, Range("L10:L" & Range("L" & Rows.Count).End(xlUp).Row)
     
        End With
    End Sub
    J'obtiens une erreur 424 - objet requis sur l'appel d'Alim Listbox avec tstPlage, et j'ai eu beau essayer de tourner la chose dans tous les sens, je n'y arrive pas.
    Des idées ?

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    je pense que tu doit remplacer..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub AlimList(lst As Object, ByVal Target As Excel.Range)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub AlimList(lst As ListBox, ByVal Target As Excel.Range)
    Je n'ai pas regarder le reste de tes codes.
    A+

  4. #4
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Par défaut
    Bonjour, et merci de t'attarder sur mon problème.

    La fonction AlimList marche bien (à part le premier appel, d'où la poubelle à bug), et je me souviens avoir déjà essayé cette variante au moment où j'avais essayé de l'adapter, puis on m'avait suggéré de mettre lst en objet, et ça va nikel comme ça.
    Le problème viendrait apparement de tstPlage, du coup c'est bien ma fonction plageValeur qui va pas.

  5. #5
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Par défaut
    Re-bonjour à tous,

    Je pense avoir mieux ciblé le problème :

    Dans la fonction plageValeur, dans la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plageValeur = maCell.Offset(, decal)
    Offset me retourne la valeur de la cellule ciblée après décalage, alors que j'essaie de récupérer l'adresse de cette cellule.
    J'ai essayé avec la propriété Address mais ça me renvoie une erreur d'incompatibilité de type précisément sur cette propriété (alors que quand je met un point après le offset ça me propose bien "address").

    Du coup je bloque toujours pour récupérer l'adresse.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    difficile de répondre avec des bribes de fonctions,
    Toutefois, je pense que Offset nécesite 2 paramètres, si tu ne veux pas de différence de ligne tu doit mettre 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maCell.Offset(0, decal))
    Dès demain je me pencherais un peu plus sur ton problème, aujourd'hui j'ai pas trop le temps.
    A+

Discussions similaires

  1. [XL-2013] listbox et code vba
    Par david.guedes dans le forum Excel
    Réponses: 8
    Dernier message: 06/03/2014, 15h10
  2. [VBA-E] 2 ListBox avec valeurs "dépendantes l'une de l'autre"
    Par dado91400 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/03/2007, 09h51
  3. [VBA-E] erreur avec listbox.rowsource
    Par repié dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/02/2006, 10h55
  4. [VBA][Access]: Listbox se référant à une autre BD
    Par Alexj51 dans le forum Access
    Réponses: 4
    Dernier message: 07/02/2006, 15h36
  5. [Excel vba + ADO(X)] afficher BDD dans listbox
    Par Emcy dans le forum Access
    Réponses: 4
    Dernier message: 13/12/2005, 12h46

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