web-dev-qa-db-fra.com

Comment configurer un "tableau dentelé" dans VBA?

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?

21
phan

"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.

31

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

6
ja72

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
3
Steve Rindsberg

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.

3
Excel Developers

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.

2
John Parker