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

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
 

mapomme

XLDnaute Barbatruc
Supporter XLD
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
 

Raynaud.JF

XLDnaute Nouveau
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.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
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...
 

Raynaud.JF

XLDnaute Nouveau
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

  • TestListbox.xlsm
    20.3 KB · Affichages: 34

Raynaud.JF

XLDnaute Nouveau
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
 

Alza

XLDnaute Junior
Bonjour,

Une solution peut-être ?

Alza'

EDIT : petite coquille, il te faut remplacer
Code:
derligne = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row

par

Code:
derligne = Sheets("Feuil1").Range("C" & Rows.Count).End(xlUp).Row
 

Pièces jointes

  • TestListbox.xlsm
    18 KB · Affichages: 30

bof

XLDnaute Occasionnel
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+
 

mapomme

XLDnaute Barbatruc
Supporter XLD
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
 

Discussions similaires

Statistiques des forums

Discussions
312 160
Messages
2 085 840
Membres
103 001
dernier inscrit
vivinator