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 :

alimentation d'une listbox


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Juillet 2010
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Juillet 2010
    Messages : 155
    Points : 96
    Points
    96
    Par défaut alimentation d'une listbox
    Bonjour,

    Mon problème doit être simple mais j'ai beau cherché je ne parviens pas à corriger, j'ai une list box qui se remplit très bien sauf si je veux une 10° colonne. Sur le web je ne trouve numl part que c'est limité à 10 pourtant, si j'enleve les ligne avec un indice de 10 ou plus ça fonctionne et si je les remets ça plante.
    Please help, j'y suis presque ^^

    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
     
    Private Sub UserForm_Activate()
        Dim i As Long
        Dim X As Integer, DerniereLigne As Integer
    'Sheets("data_global").Select
     'On récupère la dernière ligne de la source de données
        If Sheets("data_CD05").Cells(Rows.Count, 1).End(xlUp).Row = 1 Then
            DerniereLigne = 2
        Else
            DerniereLigne = Sheets("data_CD05").Cells(Rows.Count, 1).End(xlUp).Row
        End If
     
            ListBox1.Clear
     'On définit la dimension de nos colonnes
             With Me.ListBox1
             'taille de la police par defaut à 8
             .FontSize = 10
                .ColumnHeads = False
                .ColumnWidths = "15;30;120;120;120;120;120;100;100;100;120;0"
                .ColumnCount = 12
                .ListStyle = 1
                .MultiSelect = 1
            End With
     'On alimente la list box avec les données qui nous intéressent
            For X = 1 To DerniereLigne
            If Left(Sheets("data_CD05").Cells(X, 2), 7) = "Demande" Then
     
            Me.ListBox1.AddItem Sheets("data_CD05").Cells(X, 1)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Sheets("data_CD05").Cells(X, 4)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Sheets("data_CD05").Cells(X, 11)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Sheets("data_CD05").Cells(X, 12)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 4) = Sheets("data_CD05").Cells(X, 5)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 5) = Sheets("data_CD05").Cells(X, 6)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 6) = Sheets("data_CD05").Cells(X, 8)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = Sheets("data_CD05").Cells(X, 9)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 8) = Sheets("data_CD05").Cells(X, 10)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 9) = " "
              '  Me.ListBox1.List(Me.ListBox1.ListCount - 1, 10) = Sheets("data_CD05").Cells(X, 3)
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 11) = " "
                Me.ListBox1.List(Me.ListBox1.ListCount - 1, 12) = Sheets("data_CD05").Cells(X, 3)
     
            End If
        Next X

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut

    A priori, on passe par un tableau structuré pour réaliser cela. La table de données, même petite, est l'outil idéal pour alimenter une listbox. Donc normalement, tu devrais passer ta plage en tableau.

    Un ListBox est effectivement, par défaut, limité à 10 colonnes, de sorte que AddItem pour ajouter une ligne puis .list(Ligne, Colonne) = Value va bloquer pour Colonne > 10. Il existe trois possibilités d'alimenter un listbox et passer par List ou Column fait sauter la limite des colonnes:
    1. AddItem;
    2. Passer un array à la propriété List du listbox;
    3. Passer un array à la propriété Column qui va le transposer pour charger la liste.



    Ici, le "problème" vient du fait que les colonnes qui chargent le listbox ne sont pas dans le même ordre que celles du tableau structuré d'origine. Tu as alors trois solutions:
    1. Créer un tableau structurer temporaire, y passer tes colonnes dans le bon ordre puis passer ce tableau à Listbox1.List;
    2. Créer un array du nombre de colonnes voulues et le passer à Listbox1.List, puis vider la liste et passer par AddItem;
    3. Créer un array temporaire et le charger avec les données de tes colonnes puis le passer à Listbox1.list.



    Perso, la première solution a ma préférence, car elle peut être rendue générique. Il suffirait de sortir les noms des tableaux du code pour les y faire rentrer par arguments (et supprimer les dernières lignes concernant la listbox) pour obtenir une fonction générique de transfert de certaines colonnes d'un tableau vers les colonnes correspondantes d'un autre tableau.

    Voici le tableau d'origine (j'ai pris les noms de colonnes du tableau de A à J par flemmardise, mais il faut bien comprendre dans les codes 2 et 3 que les lettres de colonne se rapportent aux entêtes du tableau et pas aux colonnes de la feuille). On remarquera, à nouveau, que l'utilisation de tableaux structurés découplent le code des positions des données dans les feuilles en permettant au code d'utiliser la structuré nommée des tableaux et non les adresses des cellules sur les feuilles. C'est un gain considérable et un confort inégalé pour le programmeur.

    Nom : 2021-07-03_073658.png
Affichages : 91
Taille : 137,6 Ko


    Solution 1
    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
    Sub ShowUsf1()
      Dim Source As ListObject, Temp As ListObject
      Dim i As Long
     
      Set Source = Range("tableau1").ListObject
      Set Temp = Range("t_temp").ListObject
     
      If Not Temp.DataBodyRange Is Nothing Then Temp.DataBodyRange.Delete
      Temp.ListRows.Add
      Temp.ListColumns(1).DataBodyRange.Resize(Source.ListRows.Count).Value = _
        Source.ListColumns(Temp.ListColumns(1).Name).DataBodyRange.Value
      For i = 2 To Temp.ListColumns.Count
        Temp.ListColumns(i).DataBodyRange.Value = _
          Source.ListColumns(Temp.ListColumns(i).Name).DataBodyRange.Value
      Next i
     
      With UserForm1
        .ListBox1.List = Range("t_Temp").Value
        .Show
      End With
    End Sub


    Solution 2
    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
    Sub ShowUsf2()
      Dim t(1 To 1, 1 To 12)
      Dim i As Long
     
      With UserForm1
        .ListBox1.List = t
        .ListBox1.Clear
        For i = 1 To Range("tableau1").Rows.Count
          .ListBox1.AddItem Range("tableau1[J]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 1) = Range("tableau1[A]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 2) = Range("tableau1[C]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 3) = Range("tableau1[E]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 4) = Range("tableau1[P]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 5) = Range("tableau1[N]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 6) = Range("tableau1[G]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 7) = Range("tableau1[B]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 8) = Range("tableau1[M]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 9) = Range("tableau1[O]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 10) = Range("tableau1[D]")(i).Value
          .ListBox1.List(.ListBox1.ListCount - 1, 11) = Range("tableau1[F]")(i).Value
        Next
        .Show
      End With
    End Sub


    Solution 3
    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
    Sub ShowUsf3()
      Dim i As Long
     
      ReDim t(1 To Range("tableau1").Rows.Count, 1 To 12)
      For i = 1 To Range("tableau1").Rows.Count
        t(i, 1) = Range("tableau1[J]")(i).Value
        t(i, 2) = Range("tableau1[A]")(i).Value
        t(i, 3) = Range("tableau1[C]")(i).Value
        t(i, 4) = Range("tableau1[E]")(i).Value
        t(i, 5) = Range("tableau1[P]")(i).Value
        t(i, 6) = Range("tableau1[N]")(i).Value
        t(i, 7) = Range("tableau1[G]")(i).Value
        t(i, 8) = Range("tableau1[B]")(i).Value
        t(i, 9) = Range("tableau1[M]")(i).Value
        t(i, 10) = Range("tableau1[O]")(i).Value
        t(i, 11) = Range("tableau1[D]")(i).Value
        t(i, 12) = Range("tableau1[F]")(i).Value
      Next i
      With UserForm1
        .ListBox1.List = t
        .Show
      End With
    End Sub


    Au passage, si tu mets les largeurs des colonnes "en dur" dans le code, alors mets-les directement dans les propriétés de la listbox lors de la conception et tu peux alors supprimer les lignes de code qui "formatent" ton listbox. (Moins il y a de code, plus on est heureux)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Alimentation d'une listbox multicolonne
    Par Mr l'Ashanti dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 25/03/2021, 21h34
  2. Alimentation d'une LISTBOX par une variable tableau triée
    Par Osaka2017 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/06/2019, 09h05
  3. [XL-2010] Alimentation d'une listbox , plage discontinue
    Par Pierre67 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/09/2018, 14h18
  4. Alimentation d'une Listbox à l'aide d'une BDD
    Par Titom1978 dans le forum VB.NET
    Réponses: 4
    Dernier message: 07/08/2013, 17h42
  5. Réponses: 3
    Dernier message: 25/03/2004, 11h35

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