web-dev-qa-db-fra.com

VBA Excel remplit ListBox avec plusieurs colonnes

Cela peut être une question bon marché pour certains, mais je suis totalement confus sur la façon de remplir ma zone de liste.

form with listbox

En utilisant cette ligne, je peux remplir la zone de liste comme indiqué ci-dessous:
ListBox1.List = Sheets("Sheet1").Cells(1, 1).CurrentRegion.Value
ou

Dim rngName As Range
Dim ws As Worksheet
Dim i As Integer
Set ws = Worksheets("Sheet1")
    For i = 1 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row Step 1
        If ws.Cells(i, 1).Value <> vbNullString Then Me.ListBox1.AddItem 
        ws.Cells(i, 1).Value
Next i

form with listbox 1 column output

Voici les données que je prévois d'utiliser pour remplir la zone de liste et est progressive. Seule la colonne a le nombre de correctifs.
Data

Quelqu'un veuillez m'éclairer sur la façon de remplir une zone de liste adaptative à plusieurs colonnes et lignes en utilisant FOR LOOP comme indiqué dans mon code ci-dessus. Toute aide appréciée. Merci.

4
Serversta

Méthodes

  1. Il vaut toujours mieux parcourir un tableau qu'une plage - c'est beaucoup plus rapide.
  2. Il est encore plus rapide de créer un tableau de champs de données variant avec un n liner au lieu de redimensionner un tableau prédéclaré et de le remplir dans une boucle supplémentaire comme proposé par Siddharth Rout (bien qu'une bonne méthode :-) Remarque: Le code ci-dessous est basé sur son approche référencée dans le commentaire ci-dessus juste pour démontrer la différence.
  3. Remplissez ListBox1.List Avec le tableau (même méthode, mais sens inverse).

Code

Private Sub CommandButton1_Click()
' Purpose:  fill listbox with range values after clicking on CommandButton1
'           (code could be applied to UserForm_Initialize(), too)
' Note:     based on @Siddharth-Rout 's proposal at https://stackoverflow.com/questions/10763310/how-to-populate-data-from-a-range-multiple-rows-and-columns-to-listbox-with-vb
'           but creating a variant data field array directly from range in a one liner
'           (instead of filling a redimensioned array with range values in a loop)
Dim ws      As Worksheet
Dim rng     As Range
Dim MyArray                 ' variant, receives one based 2-dim data field array
'~~> Change your sheetname here
Set ws = Sheets("Sheet1")

'~~> Set you relevant range here
Set rng = ws.Range("A1:C" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)

With Me.ListBox1
    .Clear
    .ColumnHeads = False
    .ColumnCount = rng.Columns.Count

    '~~> create a one based 2-dim datafield array
     MyArray = rng

    '~~> fill listbox with array values
    .List = MyArray

    '~~> Set the widths of the column here. Ex: For 5 Columns
    '~~> Change as Applicable
    .ColumnWidths = "50;50;50"
    .TopIndex = 0
End With
End Sub

Conseils supplémentaires

  • Un autre avantage de la méthode tableau - elle surmonte la limitation intégrée de seulement 10 colonnes lors de l'utilisation du .AddItem méthode.

  • De plus, gardez à l'esprit que l'indexation de la listbox est basée sur zéro , donc par exemple vous obtenez l'adresse e-mail (colonne 3, index 2) de votre premier ligne d'élément (index 0) via ListBox1.List(0, 2), tandis que le tableau de champs de données devient automatiquement un tableau à deux dim.

  • Vous n'êtes pas limité à utiliser la méthode .List Pour extraire les informations de la liste, vous pouvez inverser l'ordre ligne-colonne en utilisant ListBox1.Column" or even create a new array out of it, which remains a 2-dim object, even if there is only ONE item (note: the La méthode Application.Transpose` redimiterait un tableau à 2 dimensions avec une seule ligne vers un tableau 1-dim).

  • Un dernier point: vous pouvez facilement sauvegarder à nouveau l'ensemble de la zone de liste dans une feuille Excel via rng = ListBox1.List, Mais veillez à définir la plage correcte.

8
T.M.

Que dis-tu de ça:

Sub foo()
Dim rngName As Range
Dim ws As Worksheet
Dim i As Integer
Set ws = Worksheets("Sheet1")
ListBox1.Clear
ListBox1.columnCount = 3
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    For i = 1 To LastRow
        If ws.Cells(i, 1).Value <> vbNullString Then ListBox1.AddItem ws.Cells(i, 1).Value
        If ws.Cells(i, 2).Value <> vbNullString Then ListBox1.List(i - 1, 1) = ws.Cells(i, 2).Value
        If ws.Cells(i, 3).Value <> vbNullString Then ListBox1.List(i - 1, 2) = ws.Cells(i, 3).Value
    Next i
End Sub
2
Xabier