私は子供たちでいっぱいの教室を持っています。子供たちはそれぞれ、お気に入りのおもちゃを課題にリストしなければなりません。一部の子供はおもちゃを1つだけリストしますが、他の子供はおもちゃをリストします。
キッズ(x)(y)...のようなギザギザの配列を作成するにはどうすればよいですか?xは私のクラスの子供の数であり、yは彼らがお気に入りとしてリストするおもちゃのリストです?
「ジャグ配列」は配列の配列の俗語です。 VBAのVariant
データ型には、配列を含め、ほぼすべてのデータを含めることができます*。したがって、Variant
型の配列を作成し、その各要素に任意の長さの配列を割り当てます(つまり、すべてが同じ長さである必要はありません)。
次に例を示します。
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
*注目すべき例外は、ユーザー定義型です。バリアントにこれらを含めることはできません。
コレクションのコレクションを使用できます
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
Kid 4, Toy 2 = Kid4Toy2
を出力します
おもちゃのリストをたとえばパイプで区切られた文字列に連結し、必要に応じてSplitを使用して文字列を配列に変換することもできます。
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-Francoisは、各要素はさまざまな長さの配列にできることを指摘しました。また、各要素は他の型でもかまいませんが、配列である必要はありません。例えば:
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
次に、それぞれの暗黙的なタイプに応じて、さまざまな子要素を参照できます。
a(2)(1)= 3
a(3)(1)= "a"
a(5)(2,1)=セルA2にあるもの。
2D配列(r、c)も機能するため、シナリオを処理するために必ずしもギザギザの配列が必要なわけではありません。子ごとに1行、プレゼントごとに1列。配列の次元は(子の数、プレゼントの最大数)になり、一部のスロットが空または0になることを意味します(データタイプによって異なります)。しかし、少なくともこの方法では、子供にプレゼントを追加するたびに配列を再利用する必要はありません。