web-dev-qa-db-ja.com

VBAで「ギザギザの配列」を設定するにはどうすればよいですか?

私は子供たちでいっぱいの教室を持っています。子供たちはそれぞれ、お気に入りのおもちゃを課題にリストしなければなりません。一部の子供はおもちゃを1つだけリストしますが、他の子供はおもちゃをリストします。

キッズ(x)(y)...のようなギザギザの配列を作成するにはどうすればよいですか?xは私のクラスの子供の数であり、yは彼らがお気に入りとしてリストするおもちゃのリストです?

21
phan

「ジャグ配列」は配列の配列の俗語です。 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を出力します

6
ja72

おもちゃのリストをたとえばパイプで区切られた文字列に連結し、必要に応じて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
3
Steve Rindsberg

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にあるもの。

3

2D配列(r、c)も機能するため、シナリオを処理するために必ずしもギザギザの配列が必要なわけではありません。子ごとに1行、プレゼントごとに1列。配列の次元は(子の数、プレゼントの最大数)になり、一部のスロットが空または0になることを意味します(データタイプによって異なります)。しかし、少なくともこの方法では、子供にプレゼントを追加するたびに配列を再利用する必要はありません。

2
John Parker