J'ai une salle de classe pleine d'enfants, qui doivent chacun énumérer leurs jouets préférés pour une mission. Certains enfants ne mentionnent qu'un seul jouet tandis que d'autres en énumèrent davantage.
Comment créer un tableau irrégulier tel que Kids (x) (y) ... où x est le nombre d'enfants dans ma classe et y est la liste des jouets qu'ils listent comme favoris?
"Tableau dentelé" est un argot pour tableau de tableaux. Le type de données Variant
de VBA peut contenir à peu près tout *, y compris un tableau. Vous créez donc un tableau de type Variant
et vous affectez à chacun de ses éléments un tableau de longueur arbitraire (c'est-à-dire que tous ne doivent pas avoir la même longueur).
Voici un exemple:
Dim nStudents As Long
Dim iStudent As Long
Dim toys() As Variant
Dim nToys As Long
Dim thisStudentsToys() As Variant
nStudents = 5 ' or whatever
ReDim toys(1 To nStudents) ' this will be your jagged array
For iStudent = 1 To nStudents
'give a random number of toys to this student (e.g. up to 10)
nToys = Int((10 * Rnd) + 1)
ReDim thisStudentsToys(1 To nToys)
'code goes here to fill thisStudentsToys()
'with their actual toys
toys(iStudent) = thisStudentsToys
Next iStudent
' toys array is now jagged.
' To get student #3's toy #7:
MsgBox toys(3)(7)
'will throw an error if student #3 has less than 7 toys
* Une exception notable concerne les types définis par l'utilisateur. Les variantes ne peuvent pas les contenir.
Vous pouvez utiliser une collection de collections
Public Sub Test()
Dim list As New Collection
Dim i As Integer, j As Integer
Dim item As Collection
For i = 1 To 10
Set item = New Collection
For j = 1 To i
item.Add "Kid" & CStr(i) & "Toy" & CStr(j)
Next j
list.Add item
Next i
Debug.Print "Kid 4, Toy 2 = " & list(4)(2)
End Sub
Quelles sorties Kid 4, Toy 2 = Kid4Toy2
Vous pouvez également concaténer la liste des jouets, par exemple en une chaîne séparée par des tuyaux, puis utiliser Split pour transformer la chaîne en un tableau si nécessaire:
Sub UntangleTheString()
Dim sToys As String
Dim aToys() As String
Dim x As Long
sToys = "baseball|doll|yoyo"
aToys = Split(sToys, "|")
For x = LBound(aToys) To UBound(aToys)
Debug.Print aToys(x)
Next
End Sub
Jean-François a souligné que chaque élément peut être un tableau de longueur variable. J'ajouterais que chaque élément peut également être d'autres types et n'a pas besoin d'être des tableaux. Par exemple:
Dim c as New Collection
Dim a(1 to 5) as Variant
c.Add "a","a"
c.Add "b","b"
a(1) = 5
a(2) = Array(2,3,4)
set a(3) = c
a(4) = "abcd"
a(5) = Range("A1:A4").Value
Les différents éléments enfants peuvent alors être référencés en fonction du type implicite de chacun:
a (2) (1) = 3
a (3) (1) = "a"
a (5) (2,1) = tout ce qui se trouve dans la cellule A2.
Vous n'avez pas nécessairement besoin d'un tableau dentelé pour gérer votre scénario car un tableau 2D (r, c) fonctionnera également. Une ligne pour chaque enfant et une colonne pour chaque cadeau. Les dimensions du tableau seront (# d'enfants, MAX # de cadeaux) et cela signifiera simplement que certains des emplacements seront vides ou 0 (selon votre type de données). Mais au moins de cette façon, vous n'aurez pas besoin de redimensionner le tableau chaque fois que vous ajoutez un cadeau pour un enfant.