如何在Excel VBA中初始化多维数组变量

14
Microsoft网站建议使用以下代码:

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

但是当我尝试在Excel VBA模块中使用它时,会出现编译错误。以下内容适用于一维数组:

A = Array(1, 2, 3, 4, 5)

但是我没有找到类似的适用于二维数组的方法。有什么思路吗?

请注意,Microsoft网站的代码正在初始化嵌套数组而不是多维数组。 - im_chc
3
Microsoft网站上的链接指的是“Visual Basic”,而不是“Visual Basic for Applications”。 - LeasMaps
每当我搜索VBA文档时,我首先检查的是URL是否为“office/vba”或“dotnet/visual-basic”。Office VBA是你在Excel中使用的。dotnet visual basic是指VB.NET,这是为.Net框架开发的语言,是Visual Basic Script的“继承者”。 - Toddleson
5个回答

35

您还可以使用简写格式,利用Evaluate函数和静态数组。在下面的代码中,varData被设置为[]Evaluate函数的简写,而{...}表达式表示一个静态数组。每一行用;分隔,每个字段用,分隔。它可以得到与simoco的代码相同的结果,但语法更接近于您最初的问题:

Sub ArrayShorthand()

    Dim varData As Variant
    Dim intCounter1 As Integer
    Dim intCounter2 As Integer

    ' set the array
    varData = [{1, 2, 3; 4, 5, 6; 7, 8, 9}]

    ' test
    For intCounter1 = 1 To UBound(varData, 1)
        For intCounter2 = 1 To UBound(varData, 2)
            Debug.Print varData(intCounter1, intCounter2)
        Next intCounter2
    Next intCounter1

End Sub

1
这个答案比被接受的答案更好,因为它创建了一个真正的二维数组,可以使用标准的varData(row, col)表示法进行访问。 - ChaimG
3
@Robin [...] 是 Excel 的一部分,而不是 Access,它是 Evaluate 方法的快捷方式。 - chris neilsen
1
这种语法的缺点是,它不能使用“_”将其分成3行(对我来说)。而使用“array(...)”可以代替实现此功能。 - 6diegodiego9
@RobinMackenzie 顺便告诉你一声,虽然这是一个旧帖子,但你可能会对我使用 Application.Index() 的替代方法来缩短数组的方法感兴趣。 - T.M.
1
谢谢,看起来很有趣。再加1。 - Robin Mackenzie
显示剩余7条评论

13

微软网站建议...

这个建议适用于VB.NET,但不适用VBA。

对于VBA,你走对了方向。你可以这样做:

Dim A as Variant
A = Array(Array(1, 2), Array(3, 4), Array(5, 6))

非常感谢,我现在可以使用 X=A(1)(2) 访问数组的成员。 - user3807215
在这种情况下,如何获取不同的尺寸? - Enissay
8
请注意,它创建的是“锯齿数组”(由数组组成的一维数组),而不是二维数组。 - GSerg

3

Application.Index()的替代方案

在Dmitriv Pavliv使用嵌套数组的基础上(作为Robin Mackenzie简洁方法的替代方案),您可以进一步应用Application.Index()在这个数组数组上(每个元素数量相同)- 请注意双零参数!:

Sub Get2DimArray()
    Dim arr() As Variant
    'a) build array of arrays (aka as jagged array)
    arr = Array(Array(1, 2, 4), Array(4, 5, 6), Array(7, 8, 9))
    'b) make it 2-dimensional
    arr = Application.Index(arr, 0, 0)
End Sub

结果为 一个 2 维数组(1 到 3,1 到 3),其中

   * Row 1 ~> 1|2|4
   * Row 2 ~> 4|5|6
   * Row 3 ~> 7|8|9

相关链接

关于 Application.Index() 函数的一些特殊情况 的进一步阅读


1
在这里,您可以通过指定其维度来生成空数组。 维度为X+1,因为0在数组中算作一个位置。
Dim MyArray(X, X) As Integer

然后,您可以通过执行以下示例进行填充。
MyArray (0,0) = 1
MyArray (0,1) = 2
MyArray (1,0) = 3
MyArray (1,1) = 4

...

如果您想要更方便的方式来填充它,您可以使用For循环,如果您填充数字有固有逻辑的话。而且如此等等。

0

如果在运行时才知道大小。

Dim nRows As Integer, nCols As Integer
...
Dim yourArray() As Integer
ReDim yourArray(1 to nRows, 1 to nCols) 'One base initialisation
'ReDim yourArray(0 to nRows - 1, 0 to nCols - 1) 'Zero base initialisation

然后你可以这样初始化(或访问)网格:

yourArray(1, 1) = ... 'set first cell

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