XL 2013 Tableau (array) multicolonnes remonté dans Listbox, je comprends pas

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Raynaud.JF

XLDnaute Nouveau
Bonjour,
JE ne comprend rien au tableau.
Je souhaite remonter dans une listbox une liste se trouvant sous excel.
Cela ne fonctionne pas, je pense que c'est parceque je ne redimenssionne pas bien mon tableau.
Au depart je ne sais pas combien de ligne doivent être chargées, par contre je sais que mon tableau devra avoir 6 colonnes
Pouvez vous m'aider SVP, mon code ci-dessous.

Private Sub UserForm_Initialize()
Dim c As Object
Dim Tbl

x = 1 'ligne de part qui sera lue sous excel

Set maplage = Range(Cells(x, 3), Cells(x + 21, 3)) ' je vais lire 22 lignes sous excel

i = 0
For Each c In maplage
If c.Value <> "" Then
i = i + 1
ReDim Tbl(1 To i, 0 To 5)
Tbl(i, 0) = c.Row
Tbl(i, 1) = c.Offset(0, -1).Value 'N° Operation
Tbl(i, 2) = UCase(c.Offset(0, 0).Value) 'Description Operation
Tbl(i, 3) = UCase(Left(c.Offset(0, 2).Value, 32)) 'Machine
Tbl(i, 4) = c.Offset(0, 10).Value & " P/H" 'Productuiin
Tbl(i, 5) = Format(c.Offset(0, 5).Value, "0.00") & " Pers." 'Effectif
End If
Next c

With Me.ListBox1
.ColumnCount = 6
.ColumnWidths = "0;25;145;200;60;60"
.List = Tbl()
End With
 
Bonsoir Raynaud.JF,

Essayer le code ci-dessous.

Trois remarques :
  1. seule la dernière dimension d'un tableau est modifiable
  2. pour ne pas perdre les données lors d'un Redim, utiliser le paramètre Preserve
  3. le tableau étant rempli colonne par colonne au lieu de ligne par ligne (cf remarque 1), il faut le transposer quand on l'affecte à Listbox1.list
VB:
Private Sub UserForm_Initialize()
Dim c As Range, maplage As Range, Tbl(), x&, i&
   x = 1
   Set maplage = Range(Cells(x, 3), Cells(x + 21, 3))

   For Each c In maplage
      If c.Value <> "" Then
         i = i + 1
         ReDim Preserve Tbl(0 To 5, 1 To i)
         Tbl(0, i) = c.Row
         Tbl(1, i) = c.Offset(0, -1).Value
         Tbl(2, i) = UCase(c.Offset(0, 0).Value)
         Tbl(3, i) = UCase(Left(c.Offset(0, 2).Value, 32))
         Tbl(4, i) = c.Offset(0, 10).Value & " P/H"
         Tbl(5, i) = Format(c.Offset(0, 5).Value, "0.00") & " Pers."
      End If
   Next c

   With Me.ListBox1
      .ColumnCount = 6
      .ColumnWidths = "0;25;145;200;60;60"
      .List = Application.Transpose(Tbl)
   End With
End Sub
 
Bonjour et Merci "MaPomme"
Cela fonctionne, et tes remarques mon éclairées, une nouvelle fois merci.
Une dernière explication pour illuminer ma journée... qu'entendons nous par dimension d'un tableau ??? est-ce "la colonne". Dernière dimension ? dernière colonne remontée ? je n'arrive pas a me representer cela dans ma tête.
 
Bonjour Raynaud.JF,

Un tableau est une structure pouvant avoir plusieurs dimensions. Ces dimensions correspondent aux nombre d'indices à utiliser pour en désigner un élément.

Dimension 1 : dim T(1 to 5)
Dans ce cas, on accède à un élément par T(2) par exemple. On peut redimensionner le tableau car la première dimension est aussi la dernière (ex: redim preserve (1 to 20) )

Dimension 2 : dim T(1 to 5, 1 to 4)
Dans ce cas, on accède à un élément par T(2,3) par exemple. On ne peut modifier que la dernière dimension du tableau (ex: redim preserve T(1 to 5, 1 to 7) )
Un tableau à deux dimensions peut être perçu comme étant la notion usuelle de tableau (table avec lignes et colonnes)

Dimension 3 : dim T(1 to 5, 1 to 4, 1 to 10)
Dans ce cas, on accède à un élément par T(2,3,8) par exemple. On ne peut modifier que la dernière dimension du tableau (ex: redim preserve T(1 to 5, 1 to 4, 1 to 15) )


Et ainsi de suite...
 
Rebonjour MaPomme, et merci des infos complémentaires.
Je reviens tout de même sur mon problème du debut. Si je n'ai qu'une ligne a remonter cf.dans fichier joint, ma listebox s'affiche vide, si j'ai au moins 2 lignes remplies, ma listebox affiche bien toutes les lignes trouvées.
Sais-tu pourquoi ? et comment solutionner ce problème ? ; Merci par avance
 

Pièces jointes

Bonjour Nicole, merci pour la réponse, mais le truc c'est que je ne veux pas remonter toutes les lignes, mais uniquement les lignes qui dans lesquelles il y a une valeur dans la colonne "Desc Op"
C'est pour cela que dans mon exemple je test par "If c.Value <> "" Then..." le fait de remonter ou pas
 
Bonjour,
Essaie cette méthode :
Code:
Private Sub UserForm_Initialize()
Dim Arr, x&, iR&, iC&
x = 1
With Feuil1
   Arr = .Range(.Cells(x, 1), .Cells(x + 21, 6)).Value
End With
With ListBox1
    .ColumnCount = 6
    .ColumnWidths = "0;25;100;100;60;60"
End With
    For iR = 1 To 20
        If Arr(iR, 3) <> "" Then
         ListBox1.AddItem Arr(iR, 1)   'ajoute une ligne
            For iC = 1 To 5 'Ajoute des données dans les colonnes de droite
             ListBox1.List(ListBox1.ListCount - 1, iC) = Arr(iR, iC)
            Next
        End If
    Next
End Sub
A+
 
Bonjour à tous,

Pour éviter les erreurs (cas d'une seule ligne pour ListBox1 ou aucune ligne), on peut utiliser le code modifié ci-dessous :
L'astuce consiste à ajouter deux lignes 'bidon' à Tbl de telle sorte que la transposition fonctionne toujours puis à retirer ces deux lignes de ListBox1.List.
VB:
Private Sub UserForm_Initialize()
Dim c As Range, maplage As Range, Tbl(), x&, i&
  x = 1
  Set maplage = Range(Cells(x, 3), Cells(x + 21, 3))
  'pour éviter les erreurs, on peuple le tableau de deux lignes 'bidon'
  i = 2: ReDim Preserve Tbl(0 To 5, 1 To i)
  For Each c In maplage
    If c.Value <> "" Then
      i = i + 1: ReDim Preserve Tbl(0 To 5, 1 To i)
      Tbl(0, i) = c.Row
      Tbl(1, i) = c.Offset(0, -1).Value
      Tbl(2, i) = UCase(c.Offset(0, 0).Value)
      Tbl(3, i) = UCase(Left(c.Offset(0, 2).Value, 32))
      Tbl(4, i) = c.Offset(0, 10).Value & " P/H"
      Tbl(5, i) = Format(c.Offset(0, 5).Value, "0.00") & " Pers."
    End If
  Next c

  With Me.ListBox1
    .ColumnCount = 6
    .ColumnWidths = "0;25;145;200;60;60"
    .List = Application.Transpose(Tbl)
    'on retire les deux premiers Item 'bidon'
    .RemoveItem 0: .RemoveItem 0
  End With
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
179
Réponses
10
Affichages
389
Retour