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 :

Renseigner des ListBox/ComboBox multi-colonnes - Récupérer la sélection


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut Renseigner des ListBox/ComboBox multi-colonnes - Récupérer la sélection
    Question récurrente : comment remplir une listbox multi-colonnes.
    L'aide donne bien des exemples mais pas tous...

    Un travail sur les listbox m'a montré qu'il n'était pas toujours évident de renseigner des listbox ou comboBox selon ce qu'on voulait placer "dedans".
    Le code suivant ne se veut pas exhaustif mais devrait renseigner sur certaines de ces méthodes.
    Pierre Fauconnier et SilkyRoad m'ont aidé à retrouver le nord, DarkVader a ajouté une méthode que je n'ai pas jugé utile d'ajouter parce, bien que différente, celle-ci faisait doublon avec les précédentes. Quand à bbil, il ne sait même pas qu'un code donné pour VB m'a également été utile...

    Le code suivant est à placer dans un userform comportant 5 listbox et un bouton.
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    Dim FL1 As Worksheet
     
    Private Sub CommandButton1_Click()
        Unload Me
    End Sub
     
    Private Sub UserForm_Initialize()
        Set FL1 = Worksheets("Feuil1")
     
    '*** Déclarations pour partie communes aux quatre premiers exemples *********
    Dim DerLigne As Long, DerCol As Byte
        DerLigne = FL1.Range("A65535").End(xlUp).Row 'DerLigne de la plage
        DerCol = FL1.Range("IV1").End(xlToLeft).Column   'Dernière colonne
    '****************** Peuvent être placées en paramètres ****************
    '*** Auquel cas, dans les procédures appelées, supprimer ces lignes ***
    '********************** et ajouter les paramètres *********************
     
        '                                Les mêmes avec paramètres
        PrésentationEnLignes            'PrésentationEnLignes DerLigne DerCol
        PresentationEnColonnes          'PresentationEnColonnes DerLigne DerCol
        PresentationEnLignesAvecAddItem 'PresentationEnLignesAvecAddItem DerLigne
        AfficherCertainesCellules       'AfficherCertainesCellules DerLigne
        ListerUnRépertoireAvecAddItem
    End Sub
     
    '*******************  METHODE CLASSIQUE ********************
    '************ Affichage en lignes d'une plage de données ************
     
    Sub PrésentationEnLignes() 
    Dim DerLigne As Long, DerCol As Byte
        DerLigne = FL1.Range("A65535").End(xlUp).Row 'Dernière ligne de la plage
        DerCol = FL1.Range("IV1").End(xlToLeft).Column   'Dernière colonne
     
        Me.ListBox1.ColumnCount = DerCol
        Me.ListBox1.RowSource = _
        FL1.Range(Cells(1, 1), Cells(DerLigne, DerCol)).Address(False, False)
    End Sub
     
    '*********** Affichage en colonnes d'une plage de données ***********
     
    Sub PresentationEnColonnes() 'Affichage en colonnes
    Dim DerLigne As Long, DerCol As Byte
        DerLigne = FL1.Range("A65535").End(xlUp).Row 'Dernière ligne de la plage
        DerCol = FL1.Range("IV1").End(xlToLeft).Column   'Dernière colonne
     
        Dim Tableau(), NoLigne As Long
        ReDim Tableau(DerLigne, DerCol)
     
        Me.ListBox2.ColumnCount = DerLigne 'On fixe le nbre de colonnes de la liste
        'Création du tableau : Pour chaque ligne, toutes les colonnes
        For NoLigne = 1 To DerLigne
            For NoCol = 1 To DerCol  '(NoLigne-1 et NoCol-1) l'index commençant à 0
                Tableau(NoLigne - 1, NoCol - 1) = FL1.Cells(NoLigne, NoCol).Value
            Next
        Next
        Me.ListBox2.Column() = Tableau()
    End Sub
     
    '************* Affichage en lignes de certaines colonnes ************
     
    Sub PresentationEnLignesAvecAddItem()
    Dim Liste
    Dim DerLigne As Long, DerCol As Byte
        DerLigne = FL1.Range("A65535").End(xlUp).Row 'Dernière ligne de la plage
     
        Liste = Array(1, 3, 5, 7) 'liste des colonnes ds la feuille de calculs
        DerCol = UBound(Liste)
        Me.ListBox3.ColumnCount = DerCol + 1
        'On remplit la première colonne
        For NoLigne = 1 To DerLigne
            Me.ListBox3.AddItem FL1.Cells(NoLigne, Liste(0)).Value
        Next
        For NoCol = 1 To DerCol
            For NoLigne = 0 To DerLigne - 1
                Me.ListBox3.Column(NoCol, NoLigne) = _
                FL1.Cells(NoLigne + 1, Liste(NoCol)).Value
            Next
        Next
    End Sub
     
    '************* Affichage en lignes de certaines cellules ************
     
    Sub AfficherCertainesCellules() 'sur une seule colonne
    Dim Tableau()
    Dim NoCol As Byte, NoLigne As Byte
        NoCol = 5 'Colonne unique
        ListLignes = Array(6, 9, 15) 'Listes des No de lignes
        ReDim Tableau(UBound(ListLignes))
        For NoLigne = 0 To UBound(ListLignes)
            Debug.Print ListLignes(NoLigne)
            Tableau(NoLigne) = _
            FL1.Cells(ListLignes(NoLigne), NoCol).Value
        Next
        'Me.ListBox4.ColumnCount = 1 '(valeur par défaut donc inutile ici)
        Me.ListBox4.List() = Tableau()
    End Sub
     
    '************* Affichage en lignes sur deux colonnes ************
     
    Sub ListerUnRépertoireAvecAddItem()
    Dim Chemin As String, NomFich As String
    Dim i As Integer
        Me.ListBox5.ColumnCount = 2
        Me.ListBox5.ColumnWidths = "45;60" 'dimensionne les colonnes de la liste
        Chemin = "C:\"
        NomFich = Dir(Chemin)
     
        'Ligne d'en-tête
        Me.ListBox5.AddItem "Répertoire"
        Me.ListBox5.Column(1, 0) = "Nom du fichier"
     
        'Chargement de la listbox
        While NomFich <> ""
            i = i + 1
            Me.ListBox5.AddItem Chemin, i
            Me.ListBox5.Column(1, i) = NomFich
            NomFich = Dir
        Wend
    End Sub
    A toutes fins utiles, je joins un fichier utilisant ces cinq méthodes Listbox multi-colonnes.zip

    NB - Le code concernant les plages de cellules peut naturellement se simplifier et les DerLigne = ... et DerCol = ... n'ont qu'une raison didactique.

    Second problème :
    Comment remplir une listbox des résultats de calculs divers :
    Dans un userform, placer deux listbox et placer ce code dans la feuille de code de l'userform.
    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
    Private Sub UserForm_Initialize()
    Dim Tableau(), i As Integer, NoCol As Byte
    Dim NbrElements As Integer
        NbrElements = 1000
        Me.ListBox1.ColumnCount = 5
        ReDim Tableau(NbrElements, 4)
     
        'Simulation des calculs effectués pour renseigner un tableau
        For i = 0 To NbrElements
            For NoCol = 0 To 4
                Tableau(i, NoCol) = Int(1000 * Rnd) + 1
            Next
        Next
        'Affichage en lignes sur 5 colonnes
        ListBox1.List() = Tableau()
     
        'Affichages en colonnes sur 5 lignes
        Me.ListBox2.ColumnCount = NbrElements + 1 'commence à zéro (!)
        ListBox2.Column() = Tableau()
    End Sub

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut Propriété ListIndex, ColumnText et Text
    Plusieurs méthodes permettent de lire les données placées dans un combobox multi-colonnes.
    Utilisation de la propriété List(Listindex) et les propriétés ColumnText et Text.
    Le 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
    Private Sub ComboBox3_Click()
        'Donne la valeur de la première colonne de la sélection
        Me.Label6.Caption = "= " & Me.ComboBox3.List(ComboBox3.ListIndex)
    
        'Donne la valeur de la seconde colonne de la sélection
        Me.ComboBox3.TextColumn = 2
        Me.Label7.Caption = "= " & Me.ComboBox3.Text
    
        'Donne la valeur de la quatrième colonne de la sélection
        Me.ComboBox3.TextColumn = 4
        Me.Label11.Caption = "= " & Me.ComboBox3.Text
    
        'Affiche la valeur de la troisième colonne
        Me.ComboBox3.TextColumn = 3
        'Me.ComboBox3.Text donnera le contenu de la colonne 3
    End Sub
    Le résultat

Discussions similaires

  1. [C#] ListBox Control multi colonnes
    Par youda dans le forum Windows Forms
    Réponses: 2
    Dernier message: 31/05/2016, 15h15
  2. [Débutant] Récupérer la valeur d'un combobox multi colonnes
    Par dvdavid dans le forum C#
    Réponses: 10
    Dernier message: 17/07/2014, 13h36
  3. Utilisation ListBox en multi-colonne
    Par beekeep dans le forum MFC
    Réponses: 3
    Dernier message: 15/10/2006, 23h54
  4. [VB.NET]ComboBox Multi-Colonnes
    Par Golzinne dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/03/2006, 18h55
  5. Affichage ComboBox multi-colonnes
    Par dough29 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/12/2005, 12h28

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