XL 2010 VBA EXCEL : Ajout des colonnes sur une LISTBOX

Aragon10

XLDnaute Occasionnel
Bonjour le Forum,

je voudrais ajouter des colonnes sur ma Listbox. Actuellement lorsque je clique sur un nom dans le combobox il m'affiche uniquement les données existantes sur la colonne 2. existe t-il une solution pour afficher les données de la colonne 3 et 4. (ci-dessous l'exemple).


Merci pour votre aide.
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Aragon, bonjour le forum,

J'ai modifié ton code en utilisant une méthode plus rapide sur les gros tableaux. Il devrait s'adapter à ton fichier original sans difficulté.

J'ai rajouté à la fin en double-cliquant sur un élément de la ListBox1 : la première cellule de la ligne de celui-ci est sélectionnée ou bien, cela se fait automatiquement si la ListBox1 ne contient qu'un seul élément...

Le nouveau code (qui doit remplacer l'ancien dans son intégralité) :

VB:
Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private NL As Integer 'déclare la variable NL (Nombre de Lignes)
Private NC As Byte 'déclare la variable NC (Nombre de Colonnes)

Private Sub UserForm_Initialize() 'a l'initialisation de l'UserForm
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des Valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau des valeurs TV
Me.ListBox1.ColumnCount = NC + 1 'définit le nombre de colonne de la Listbox1 (une de plus que NC)
Me.ListBox1.ColumnWidths = "0" 'masque la première colonne de la ListBox1
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To NL 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 1)) = "" 'alimente le dictionnaire avec la donnée en colonne 1 de TV
Next I 'prochaine ligne de la boucle
ComboBox1.List = D.keys 'alimente la ComboBox1 avec la liste  des éléments du dictionnaire D sans doublon
End Sub

Private Sub ComboBox1_Click() 'au clic dans la ComboBox1
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim LI As Integer 'déclare la variable LI(LIgne)

Me.ListBox1.Clear 'vide la ListBox1
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    If TV(I, 1) = Me.ComboBox1.Value Then 'condition : si la données ligne I colonne 1 de TV est égale à la valeur de la CommboBox1
        ReDim Preserve TL(1 To NC + 1, 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes plus une que TV a de colonnes, K colonnes)
        TL(1, K) = I 'récupère dans la ligne 1 de TL le numéro de ligne (cette donnée sera masquée)
        For J = 1 To NC 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV
            TL(J + 1, K) = TV(I, J) 'récupère dans la ligne J + 1 de TL la donnée en colonne J de TV (= Transposition)
        Next J 'prochaine colonne de la boucle 2
        K = K + 1 'incrémente K (ajoute une colonne au tableau de lignes TL)
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
If K > 1 Then Me.ListBox1.Column = TL 'si K est supérierure à 1, alimente la ListBox1
If Me.ListBox1.ListCount = 1 Then 'condition : si la ListBox1 ne contien qu'une seule valeur
    LI = Me.ListBox1.Column(0, 0) 'définit la Ligne LI (récupérée dans la colonne masquée de la ListBox1)
    O.Activate 'active l'onglet O
    O.Cells(LI, 1).Select 'sélectionne la cellule ligne LI colonne 1 de l'onglet O
    Unload Me 'vide et ferme l'userForm en cours
End If 'fin de la condition
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-clic dans un élément de la ListBox1
Dim LI As Integer 'déclare la variable LI(LIgne)

LI = Me.ListBox1.Column(0, Me.ListBox1.ListIndex) 'définit la variable LI (récupérée dans la colonne masquée de la ListBox1)
O.Activate 'actie l onglet O
O.Cells(LI, 1).Select 'sélectionne la cellule ligne LI colonne 1 de l'onglet O
Unload Me 'vide et ferme l'userForm en cours
End Sub
 

Discussions similaires

Réponses
13
Affichages
245

Statistiques des forums

Discussions
312 843
Messages
2 092 755
Membres
105 523
dernier inscrit
mouki62530