Introduction
Lors de la restitution des données contenues dans un contrôle ListBox (multi-colonnes) vers une variable tableau, on peut constater l'apparition d'un certain nombre de valeurs NULL. L'échange entre la ListBox et une variable tableau, via la propriété List du contrôle, induit nécessairement l'ajout de colonnes comportant des valeurs NULL.
Tests préliminaires
Un petit test pour s'en assurer :
Private Sub UserForm_Initialize()
Dim i As Integer, j As Integer
ListBox1.ColumnCount = 5
'remplissage de la listbox
For i = 0 To 2
ListBox1.AddItem i
For j = 1 To 4
ListBox1.List(i, j) = j
Next
Next
'transfert des données vers la variable tableau
Dim TB()
TB = ListBox1.List()
'restitution des données
For i = LBound(TB, 1) To UBound(TB, 1)
For j = LBound(TB, 2) To UBound(TB, 2)
Debug.Print TB(i, j)
Next
Next
End Sub
Nous renvoie, non seulement les valeurs « inscrites » par le code dans la listbox, mais une certaine quantité de NULL. Ceci peut s'avérer préjudiciable si l'on veut retourner ces valeurs dans une feuille de calcul Excel, en utilisant, par exemple, la propriété Resize de l'objet Range :
Range(« A1 »).Resize(UBound(Tb, 1), UBound(Tb, 2)) = Tb
A noter : le problème ne se pose qu'avec un tableau à plusieurs dimensions.
Il ne se pose pas si la listbox ne comporte qu'une seule dimension (colonne).
Analyse
Ce test nous montre que l'affectation d'échange :
TB = ListBox1.List()
, inclut le dimensionnement du tableau, de manière
systématique, à
10 colonnes (sauf dans le cas d'un tableau à une seule dimension, et donc d'une listbox à une seule colonne).
Même si l'on dimensionne la variable tableau à priori, celle-ci sera redimensionnée par l'affectation de la propriété List.
Solution
La solution, afin de transférer le contenu d'un contrôle ListBox vers une variable tableau, sans faille, en utilisant la propriété List du contrôle, est de redimensionner cette variable, à posteriori, à la bonne « taille ».
Comment déterminer la taille de la seconde dimension du tableau (nombre de colonnes) ?
Tout simplement en utilisant la propriété ColumnCount, comme ceci :
Private Sub CommandButton2_Click()
ListBox1.ColumnCount = 5
For i = 0 To 4
ListBox1.AddItem i
For j = 1 To ListBox1.ColumnCount
ListBox1.List(i, j) = i & " - " & j
Next
Next
Dim TB()
TB = ListBox1.List() ' on va avoir 10 colonnes ! et donc ===>>
' on "force la main" pour ne laisser que les colonnes utiles ====>>
ReDim Preserve TB(ListBox1.ListCount - 1, ListBox1.ColumnCount - 1)
For i = LBound(TB, 1) To UBound(TB, 1)
For j = LBound(TB, 2) To UBound(TB, 2)
Debug.Print TB(i, j)
Next
Next
End Sub
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.