Private Sub CommandButton2_Click()
ListBox1.ColumnCount = 5
ListBox1.Width = 300
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 valables" ====>>
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
For i = 2 To UBound(TC, 1)
If TC(i, 1) = Me.ComboBox1.Value Then
Me.ListBox1.AddItem 'tout seul
Me.ListBox1.List(ListBox1.ListCount - 1, 0) = TC(i, 1)
Me.ListBox1.List(ListBox1.ListCount - 1, 1) = TC(i, 2)
Me.ListBox1.List(ListBox1.ListCount - 1, 2) = TC(i, 3)
'Me.ListBox1.List(ListBox1.ListCount - 1, 3) = i
End If
Next i
Dim toto As Range
Set toto = Worksheets("Donnees").Range("A1").CurrentRegion
ListBox1.ColumnCount = toto.Columns.Count
ListBox1.ListFillRange = "Donnees!" & toto.Address
Dim toto As Range
Set toto = Worksheets("Donnees").Range("A1").CurrentRegion
ListBox1.ColumnCount = toto.Columns.Count
ListBox1.RowSource = "Donnees!" & toto.Address
Private Sub ComboBox1_Click() Dim i As Integer For i = 2 To UBound(TC, 1) If TC(i, 1) = Me.ComboBox1.Value Then Me.ListBox1.AddItem 'tout seul Me.ListBox1.List(ListBox1.ListCount - 1, 0) = TC(i, 1) Me.ListBox1.List(ListBox1.ListCount - 1, 1) = TC(i, 2) Me.ListBox1.List(ListBox1.ListCount - 1, 2) = TC(i, 3) End If Next i End Sub
Private Sub CommandButton1_Click() Dim Tb, i As Integer, j As Integer Tb = ListBox1.List Range("A12").Resize(UBound(Tb, 1), UBound(Tb, 2)) = Tb Me.Hide 'For i = LBound(Tb, 1) To UBound(Tb, 1) ' For j = LBound(Tb, 2) To UBound(Tb, 2) ' Debug.Print Tb(i, j) ' Next j 'Next i End Sub
Option Explicit Private TC Private Sub UserForm_Initialize() Dim Lig As Long Me.ListBox1.ColumnCount = 3 Me.ListBox1.ColumnWidths = "98;98;98" Me.ListBox1.Width = 300 Rempli_TC MsgBox "=> 1ère dim : " & UBound(TC, 1) & vbCrLf & "=> 2ème dim : " & UBound(TC, 2) For Lig = 1 To 4 ComboBox1 = TC(Lig, 1) If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem TC(Lig, 1) Next Lig End Sub Private Sub ComboBox1_Click() Dim i As Integer, Tb For i = 2 To UBound(TC, 1) If TC(i, 1) = Me.ComboBox1.Value Then Me.ListBox1.AddItem 'tout seul Me.ListBox1.List(ListBox1.ListCount - 1, 0) = TC(i, 1) Me.ListBox1.List(ListBox1.ListCount - 1, 1) = TC(i, 2) Me.ListBox1.List(ListBox1.ListCount - 1, 2) = TC(i, 3) End If Next i Tb = ListBox1.List 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 Sub Rempli_TC() ReDim TC(1 To 4, 1 To 3) TC(1, 1) = "Jerome" TC(2, 1) = "Mickael" TC(3, 1) = "Jerome" TC(4, 1) = "Valerie" TC(1, 2) = "pruneau" TC(2, 2) = "peche" TC(3, 2) = "poire" TC(4, 2) = "spaghetti" TC(1, 3) = 1 TC(2, 3) = 10 TC(3, 3) = 3 TC(4, 3) = 5 End Sub
Jerome
poire
3
Null
Null
Null
Null
Null
Null
Null
Jerome
poire
3
Null
Null
Null
Null
Null
Null
Null
Jerome
poire
3
Null
Null
Null
Null
Null
Null
Null
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionMe.ListBox1.AddItem
Tb = ListBox1.List
Private Sub UserForm_Initialize()
Dim Lig As Long
ListBox1.ColumnCount = 3
ListBox1.ColumnWidths = "98;98;98"
ListBox1.Width = 300
For i = 0 To 4
ListBox1.AddItem i
For j = 1 To 3
ListBox1.List(i, j) = j
Next
Next
Dim TB()
ReDim TB(1 To ListBox1.ListCount, 1 To ListBox1.ColumnCount)
' GoTo 10
TB = ListBox1.List()
For i = LBound(TB, 1) To UBound(TB, 1)
For j = LBound(TB, 2) To UBound(TB, 2)
'MsgBox TB(i, j)
Debug.Print TB(i, j)
Next
Next
Exit Sub
10:
For i = 0 To ListBox1.ListCount - 1
For j = 0 To ListBox1.ColumnCount - 1
TB(i + 1, j + 1) = ListBox1.List(i, j)
Next
Next
For i = LBound(TB, 1) To UBound(TB, 1)
For j = LBound(TB, 2) To UBound(TB, 2)
'MsgBox TB(i, j)
Debug.Print TB(i, j)
Next
Next
End Sub
TB = ListBox1.List()
Private Sub CommandButton1_Click()
Dim Lig As Long
For i = 0 To 4
ListBox1.AddItem i
Next
Dim TB()
ReDim TB(1 To ListBox1.ListCount)
TB = ListBox1.List()
For i = LBound(TB, 1) To UBound(TB, 1)
Debug.Print TB(i, j)
Next
Exit Sub
End Sub
La définition de la propriété ColumnCount sur 0 affiche zéro colonne et la définition sur -1 affiche toutes les colonnes disponibles. Pour une source de données indépendante, il y a une limite de 10 colonnes (0 à 9).
Source de données
Emplacement des données auquel est lié un contrôle, par exemple une cellule d'une feuille de calcul. La valeur en cours d'une source de données peut être enregistrée dans la propriété Value d'un contrôle. Toutefois, le contrôle n'enregistre pas les données, il n'affiche que les informations enregistrées dans la source de données.
Private Sub UserForm_Initialize()
Dim Lig As Long
ListBox1.ColumnCount = 9
ListBox1.ColumnWidths = "98;98;98"
ListBox1.Width = 300
For i = 0 To 2
ListBox1.AddItem i
For j = 1 To 9
ListBox1.List(i, j) = j
Next
Next
Dim TB()
TB = ListBox1.List()
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
29 juin 2015 à 09:29
Tout d'abord, je précise que ton code solutionne le problème impeccablement, sans bavures.
Cependant, j'ai voulu pousser un peu plus loin (pour bien tout assimiler) et je me retrouve encore avec d'autres incohérences (selon moi) que je ne saisis pas.
Si, me dis-je, dans ton code, on dimensionnait le tableau avant de lui affecter des valeurs, que se passerait-il?
Pour tester, j'inverse deux lignes dans ton code :
Je m'attendais à une erreur 9 dépassement de capacité.
.....
Et bien non.
Ce code me renvoie encore des valeurs Null, comme si la ligne TB = ListBox1.List() redimensionnais, à nouveau, le tableau!
Autre curiosité, car je ne suis pas "fan" des Dim suivis de ReDim...
Tant qu'à faire, si on connait le nombre de lignes et de colonnes que l'on souhaite "injecter" dans la listbox, autant ne pas s'en priver et dimensionner le tableau pour en forcer la taille.
Ce code me renvoie une erreur de compilation "impossible d'affecter à une variable tableau". Pourtant, depuis 3-4 jours, on affecte bien la List() à une variable tableau?
29 juin 2015 à 10:31
J'avais également essayé un redimensionnement à priori et non à posteriori.
Sans succès (les null sont là) pour un,e raison simple :
L'affectation d'échange :
TB = ListBox1.List()
inclut le dimensionnement du tableau. Et Microsoft l'a conçue sur une "base" systématique de 10 colonnes, sauf dans le cas d'un tableau à une seule dimension (et donc d'une listbox à une seule colonne).
J'ignore la raison pour laquelle Microsoft en a ainsi décidé. Je ne peux que supposer qu'il s'en sert pour séparer en colonnes.
Je rappelle que les listboxes de VB6 ne sont pas les mêmes et ne permettent pas, contrairement à celles de VBA, un éclatement REEL en colonnes multiples, aux cellules desquelles on peut se référer.
Comment sont "construites" les listboxes de VBA (qui, elles, peuvent comporter plusieurs colonnes "réelles" et non seulement d'affichage) ? Je l'ignore, mais suppose qu'il y a "derrière" un calcul arithmétique, tant pour l'affichage que pour la lecture. Et je suppose (je ne peux que supposer) que Microsoft a décidé de faciliter ce calcul en :
- ramenant toujours au même nombre de colonnes (10)
- n'affichant toutefois dans la listbox que celles à "retenir"
La transposition vers une matrice, toutefois, reprend l'ensemble des colonnes (celles utiles et celles ignorées dans la listbox). Il s'en suit un tableau de 10 colonnes.
Il n'y a dès lors aucun autre recours que celui de se débarrasser soi-même (à posteriori, donc) des colonnes "superflues"... ce que fait tout simplement mon code.
29 juin 2015 à 10:39
Je vais maintenant pouvoir me lancer dans la rédaction.
29 juin 2015 à 10:55
Dim Tb(LIG_COUNT - 1, COL_COUNT - 1)
est impossible sous VB.
Sous VB : l'instruction Dim ne peut contenir des variables. Seul Redim le permet
29 juin 2015 à 11:00