2012-02-24 83 views
18

我有一個充滿孩子的教室,每個孩子都必須列出他們最喜歡的玩具作業。有些孩子只列出1個玩具,而其他孩子列出更多。如何在VBA中設置「鋸齒陣列」?

如何創建一個鋸齒狀的數組,使Kids(x)(y)...其中x是我班的孩子數量,y是他們列爲他們最愛的玩具列表?

+1

請參閱我對[Excel宏加載陣列]的解答(http://stackoverflow.com/q/8726625/973283),其中解釋了鋸齒狀陣列。 – 2012-02-24 18:22:06

回答

25

「鐵血陣」是一組數組俚語的集合。 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 

* A值得注意的例外是用戶定義的類型。變體不能包含這些。

+0

當你reDim'thisStudentsToys'時,是否實際上創建了一個新的內存位置?我認爲VBA中的數組是引用。我只是想仔細檢查一下:在for循環的第二次迭代中,重寫'thisStudentsToys'數組不會改變'toys'的第一個索引嗎?如果我沒有說清楚,請讓我知道。謝謝 – 2017-08-08 20:18:41

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

+0

我不熟悉的集合是如何與數組數組或鋸齒形數組不同的? – phan 2012-02-24 18:09:56

+1

您可以添加和刪除集合中的項目,但不能從數組中添加項目。如果需要,您還可以使用索引訪問項目以及索引。也許你會使用孩子的名字或ID作爲收藏的關鍵。 – ja72 2012-02-24 18:28:22

2

你也可以串聯玩具的名單到如管道分隔的字符串,然後用拆分把字符串到一個數組需要時:

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

讓 - 弗朗索瓦·指出,每個元素都可以是一個不同長度的數組。我會補充說,每個元素也可以是其他類型,不需要是數組。例如:

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 

的各種子元素可接着根據所述隱式類型的每個的被引用:

一個(2)(1)= 3

一個(3)(1) =「a」

a(5)(2,1)=無論在單元格A2中。

1

您不一定需要鋸齒陣列來處理您的場景,因爲二維數組(r,c)也可以工作。每個孩子一行,每個禮物一列。數組維數將是(#子代數,MAX#代表),它只是表示某些插槽將爲空或0(取決於您的數據類型)。但至少這樣你每次給孩子添加禮物時都不需要重新設置數組。