如何在VBA中设置“锯齿状阵列”?

时间:2012-02-24 17:55:42

标签: arrays vba jagged-arrays

我有一个满是孩子的教室,每个孩子都必须列出他们最喜欢的玩具作为作业。有些孩子只列出1个玩具,而其他孩子则列出更多。

如何创建一个锯齿状数组,使得Kids(x)(y)...其中x是我班级中的孩子数量,而y是他们列为最喜欢的玩具列表?

5 个答案:

答案 0 :(得分:29)

“Jagged array”是数组数组的俚语。 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

*一个值得注意的例外是用户定义的类型。变体不能包含这些。

答案 1 :(得分:5)

您可以使用馆藏集合

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

答案 2 :(得分:3)

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 :(得分:2)

您还可以将玩具列表连接成一个以管道分隔的字符串,然后使用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

答案 4 :(得分:2)

您不一定需要锯齿状阵列来处理您的场景,因为2D阵列(r,c)也可以使用。每个孩子一行,每个孩子一列。数组维度将是(子节点数,MAX#of presents),它只是表示某些插槽为空或0(取决于您的数据类型)。但至少这样,每次为孩子添加礼物时,您都不需要重新调整数组。