ListBox vers tableau sans faille

Contenu du snippet

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

A voir également

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.