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 :

Remplissage ListBox multicolonnes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Remplissage ListBox multicolonnes
    Bonjour,
    Je cherche à remplir une ListBox multicolonnes à partir des colonnes B, C, E et F de mon classeur Excel, allant de la ligne 2 à la dernière ligne contenant une valeur.

    J'ai réussi quand ma ListBox ne contennait qu'une seul colonne, je passais par un tableau. Mais quand il y a plusieurs colonnes je bloque.

    Voici mon code pour l'instant:

    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
     
    Sub ChargerFenetre()
        Dim flist0()
        Dim flist1()
        Dim flist2()
        Dim flist3()
        Dim i As Integer
        Dim derniereCelluleTab As Integer
        Dim szTmp As String
     
        derniereCelluleTab = Range("B2").End(xlDown).Row
        ReDim flist0(derniereCelluleTab - 2)
        ReDim flist1(derniereCelluleTab - 2)
        ReDim flist2(derniereCelluleTab - 2)
        ReDim flist3(derniereCelluleTab - 2)
     
        Range("B2").Resize(Range("B2").End(xlDown).Row).Select
        i = 0
        For Each cc In Selection
            If Trim$(cc) <> "" Then
                flist0(i) = cc
                i = i + 1
            End If
        Next
     
        Range("C2").Resize(Range("C2").End(xlDown).Row).Select
        i = 0
        For Each cc In Selection
            If Trim$(cc) <> "" Then
                flist1(i) = cc
                i = i + 1
            End If
        Next
     
        Range("E2").Resize(Range("E2").End(xlDown).Row).Select
        i = 0
        For Each cc In Selection
            If Trim$(cc) <> "" Then
                flist2(i) = cc
                i = i + 1
            End If
        Next
     
        Range("F2").Resize(Range("F2").End(xlDown).Row).Select
        i = 0
        For Each cc In Selection
            If Trim$(cc) <> "" Then
                flist3(i) = cc
                i = i + 1
            End If
        Next
     
        Load frmMain
        frmMain.lstContrats.List(frmMain.lstContrats.ListCount - 1, 1) = flist0    'ni cette façon
        frmMain.lstContrats.List(1) = flist1      'ni celle-ci ne marche
        frmMain.lstContrats.List(2) = flist2
        frmMain.lstContrats.List(3) = flist3
        frmMain.Show
    End Sub
    Merci

  2. #2
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Première chose, évite d'utiliser des Select en VBA sauf raison spécifique (si on doit visuellement se rendre compte qu'une cellule est sélectionnée par exemple).
    Ensuite, il y aura un souci ici si la dernière ligne non vide n'est pas la même selon les colonnes.
    J'essaie de te faire un petit exemple de code dont tu pourras t'inspirer.

  3. #3
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    essayes ce code à integrer dans ton USF, je n'ai pas testé et ne sais pas si ça correspond à ta demande
    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
    Private Sub UserForm_Activate()
    Dim flist
    Dim flist1()
    Dim i As Integer
    Dim derniereCelluleTab As Integer
    Dim szTmp As String
    With Sheets("Feuil1") 'à changr par le nom de ta feuille
      derniereCelluleTab = .Range("B" & .Rows.Count).End(xlUp).Row
      flist = .Range("B2:F" & derniereCelluleTab)
    End With
    ReDim flist1(1 To derniereCelluleTab, 1 To 4)
    For i = 1 To UBound(flist, 1)
      flist1(i, 1) = Trim(flist(i, 1))
      flist1(i, 2) = Trim(flist(i, 2))
      flist1(i, 3) = Trim(flist(i, 4))
      flist1(i, 4) = Trim(flist(i, 5))
    Next i
    With lstContrats
      .ColumnCount = 4
      For i = 1 To UBound(flist1, 1)
        .AddItem flist1(i, 1)
        .Column(1, .ListCount - 1) = flist(i, 2)
        .Column(2, .ListCount - 1) = flist(i, 3)
        .Column(3, .ListCount - 1) = flist(i, 4)
      Next i
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses. Casefayere le problème c'est que la ta solution prend les colonnes B à F, donc même la D que je ne dois pas prendre. Dois-je utiliser 2 flist différents, un pour BC l'autre pour EF?
    Dernière modification par AlainTech ; 28/04/2012 à 23h55. Motif: Suppression de la citation

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    c'est que la ta solution prend les colonnes B à F,
    j'ai écris trop vite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 1 To UBound(flist1, 1)
        .AddItem flist1(i, 1)
        .Column(1, .ListCount - 1) = flist1(i, 2)
        .Column(2, .ListCount - 1) = flist1(i, 3)
        .Column(3, .ListCount - 1) = flist1(i, 4)
      Next i
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Voici un petit code à adapter. Pour ma part je l'ai mis directement dans le UserForm_Initialize de frmMain, et j'ai mis un frmMain.Show quelque part :
    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
    Option Explicit
     
    Private Sub UserForm_Initialize()
     
        Dim ws As Worksheet
        Dim lastRow As Integer
        Dim fList() As Variant
        Dim c1, c2, c3, c4 As String
        Dim iRow, iList As Integer
     
        Set ws = Worksheets("Feuil2") 'Mettre ici la feuille dans laquelle sont les données
     
        'Recherche de la dernière ligne
        lastRow = ws.Range("B65000").End(xlUp).Row
        ReDim fList(3, lastRow - 2)
     
        'On insère les valeurs s'il n'y a pas de cellules vides sur la ligne
        iList = 0
        For iRow = 2 To lastRow
            c1 = ws.Cells(iRow, "B").Value
            c2 = ws.Cells(iRow, "C").Value
            c3 = ws.Cells(iRow, "E").Value
            c4 = ws.Cells(iRow, "F").Value
     
            If Trim(c1) <> "" And Trim(c2) <> "" And Trim(c3) <> "" And Trim(c4) <> "" Then
                fList(0, iList) = c1
                fList(1, iList) = c2
                fList(2, iList) = c3
                fList(3, iList) = c4
     
                iList = iList + 1
            End If
     
        Next iRow
     
        'A la fin, seulement iList lignes vraiment insérées, et il faut retourner le tableau
        Dim fList2() As Variant
        ReDim fList2(iList - 1, 3)
        Dim i, j As Integer
        For i = 0 To iList - 1
            For j = 0 To 3
                fList2(i, j) = fList(j, i)
            Next j
        Next i
     
        'On affecte ce tableau au listView
        lstContrats.List = fList2
     
    End Sub

  7. #7
    Invité
    Invité(e)
    Par défaut
    Nickel merci au deux. ZebreLoup peux-tu juste m'expliquer les parametres de tes Redim avant de cloturer cette discution? Et pourquoi on utilise un fList2?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ReDim fList(3, lastRow - 2)
    ReDim fList2(iList - 1, 3)
    Merci
    Dernière modification par Chtulus ; 26/04/2012 à 16h21. Motif: Citation inutile !

  8. #8
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    J'utilise un tableau à 2 dimensions (pour avoir des colonnes dans le listView). Les 2 paramètres du Redim sont les indices max sur chaque dimension.
    J'utilise flist2 parce que flist n'est pas "dans le bon sens", les colonnes devant être sur la deuxième dimension. Et je ne mets pas flist dans le bon sens dès le début, car on ne peut faire un redim preserve que sur la dernière dimension.

    Ca aurait été 10 fois plus simple si on ne faisait pas le test qu'il n'y a pas de cellule vide sur la ligne.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ZebreLoup Voir le message
    Ca aurait été 10 fois plus simple si on ne faisait pas le test qu'il n'y a pas de cellule vide sur la ligne.
    Aurais-tu un exemple pour ce cas, juste pour voir à quoi ça ressemblerai?

    Merci pour tes explications concernant les arguments mais pourquoi le 3? J'aurai mis 4 moi vu que le tableau a 4 colonnes. Mais vu que ça marche comme ça c'est que je me trompe

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

Discussions similaires

  1. [VB6] Remplissage ListBox à partir d'une liste
    Par speedster dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 06/06/2006, 13h35
  2. [VBA-E] eviter blanc remplissage listbox avec tableau
    Par chmod777 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/04/2006, 12h16
  3. Remplissage ListBox
    Par beb30 dans le forum MFC
    Réponses: 4
    Dernier message: 29/03/2006, 10h11
  4. [VBA-A]Remplissage ListBox
    Par cuicui08 dans le forum VBA Access
    Réponses: 18
    Dernier message: 27/02/2006, 11h05
  5. [C#] remplissage listBox avec un dataSet
    Par aymron dans le forum ASP.NET
    Réponses: 5
    Dernier message: 18/10/2005, 10h44

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