在Excel VBA中预定义多维数组

9

我知道我们可以使用以下方法在Excel VBA中定义单维数组:

 GroupCols = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L")

如何以相同方式预定义多维数组?

另外我想以以下方式跟踪特定级别

 Level[16][0]
 Level[16][1]
 Level[16][2]

 Level[8][0]
 Level[8][1]
 Level[8][2]

 Level[7][0]
 Level[7][1]
 Level[7][2]

第一个索引定义了层级,因此可能不是连续的……比如在16之后是直接8等等。对于每个i,我需要三个信息,即0、1、2第二个索引。

有人可以指导我如何在Excel VBA中实现相同的功能吗?

4个回答

10

使用evaluate()函数定义2D数组的方法与使用array()函数定义1D数组类似:

Sub Array2DWithEvaluate()

Dim Array2D As Variant

'[] ist a shorthand for evaluate()
'Arrays defined with evaluate start at 1 not 0

Array2D = [{"1,1","1,2","1,3";"2,1","2,2","2,3"}]

Debug.Print Array2D(2, 2) '=> 2,2

End Sub

如果您想使用字符串来定义数组,您需要像这样使用它。
Sub Array2DWithEvaluateFromString()

Dim strValues As String
Dim Array2D As Variant

strValues = "{""1,1"",""1,2"",""1,3"";""2,1"",""2,2"",""2,3""}"

Array2D = Evaluate(strValues)

Debug.Print Array2D(2, 2) '=> 2,2

End Sub

如果您想了解Evaluate()函数的其他用途,请参考这篇优秀的帖子。 http://www.ozgrid.com/forum/showthread.php?t=52372

9
你不能像那样在数组中使用非连续的索引。如果你只使用了非连续的一部分索引,那么所有其他元素都将为空但仍会占用存储空间,这既低效又容易出错(LaunchMissile = Levels(17,1),哎呀!)。
你需要的是Dictionary对象。在使用之前,必须按照以下设置参考:工具 > 引用 > 选中Microsoft Scripting Runtime。
示例:
Dim Levels As Scripting.Dictionary
Set Levels = New Scripting.Dictionary

' Fill up the dictionary
Levels.Add Key:=16, Item:=Array("A", "B", "C")
Levels.Add Key:=8, Item:=Array("FAI", "CNT", "YES")
Levels.Add Key:=7, Item:=Array("Once", "Twice", "Thrice")

' Retrieve items from the dictionary
Debug.Print Levels.Item(8)(0)
Debug.Print Levels.Item(8)(1)
Debug.Print Levels.Item(8)(2)

请注意,Collection对象也可以完成此操作。优点:VBA本地支持,无需设置引用。缺点:键是只写的,可能会很麻烦。

3
您可以使用Array(Array())例如。
data = Array(Array(1,2), Array(3,4))

要引用第一个元素,使用 data(0)(0)

(以上内容摘自这里)


为什么要这样做,而不是使用一个二维数组?这看起来过于复杂,但可能有原因... - Jean-François Corbett
在某些情况下,它可以避免创建一个几乎为空的矩阵。 - iDevlop
怎么会呢?数组的数组 data(i)(j) 怎么可能不包含与等价的二维数组 data2D(i,j) 相同数量的元素呢? - Jean-François Corbett
如果您在第一维中只需要7、8和16,则data(2)将为空。 - iDevlop
明白了,谢谢。这是一个好的解决方案...但你仍然在所有空位上存储一个变量Empty,也就是在这种情况下仍然存储1个元素而不是3个。对于稀疏数据集来说并不是非常高效。无论如何,加一。 - Jean-François Corbett
@Jean-FrançoisCorbett:你的解决方案更好,我同意。我会尽量记住那个字典对象。 - iDevlop

0

无法像使用array()函数时那样声明和填充二维数组。您可以使用ReDim定义数组维度,然后填充它。以下是一个示例:

ReDim myArray(0 To 16, 0 To 3)
myArray(0, 0) = "A"
myArray(0, 1) = "B"
...

不幸的是,当你创建一个数组时,从下限到上限的每个条目都会创建一个元素。它们是空的,但它们存在,所以你需要注意这一点,特别是如果你计划循环遍历它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接