我有一個充滿孩子的教室,每個孩子都必須列出他們最喜歡的玩具作業。有些孩子只列出1個玩具,而其他孩子列出更多。如何在VBA中設置「鋸齒陣列」?
如何創建一個鋸齒狀的數組,使Kids(x)(y)...其中x是我班的孩子數量,y是他們列爲他們最愛的玩具列表?
我有一個充滿孩子的教室,每個孩子都必須列出他們最喜歡的玩具作業。有些孩子只列出1個玩具,而其他孩子列出更多。如何在VBA中設置「鋸齒陣列」?
如何創建一個鋸齒狀的數組,使Kids(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
* A值得注意的例外是用戶定義的類型。變體不能包含這些。
當你reDim'thisStudentsToys'時,是否實際上創建了一個新的內存位置?我認爲VBA中的數組是引用。我只是想仔細檢查一下:在for循環的第二次迭代中,重寫'thisStudentsToys'數組不會改變'toys'的第一個索引嗎?如果我沒有說清楚,請讓我知道。謝謝 – 2017-08-08 20:18:41
您可以使用集合
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
你也可以串聯玩具的名單到如管道分隔的字符串,然後用拆分把字符串到一個數組需要時:
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
讓 - 弗朗索瓦·指出,每個元素都可以是一個不同長度的數組。我會補充說,每個元素也可以是其他類型,不需要是數組。例如:
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中。
您不一定需要鋸齒陣列來處理您的場景,因爲二維數組(r,c)也可以工作。每個孩子一行,每個禮物一列。數組維數將是(#子代數,MAX#代表),它只是表示某些插槽將爲空或0(取決於您的數據類型)。但至少這樣你每次給孩子添加禮物時都不需要重新設置數組。
請參閱我對[Excel宏加載陣列]的解答(http://stackoverflow.com/q/8726625/973283),其中解釋了鋸齒狀陣列。 – 2012-02-24 18:22:06