`Array`和`Array()`有什么区别?

时间:2015-08-23 01:58:37

标签: excel vba excel-vba variable-declaration

我可以声明一个数组:

Dim arrTest() As Variant

或者因此:

Dim arrTest2 As Variant
arrTest2 = Array()

然而,第一个只能作为这样的参数传递:

Sub(ByRef arrTest() As Variant)

和第二个像这样:

Sub(ByRef arrTest2 As Variant)

你可以用第二个来完成这个:

ReDim arrTest2(UBound(arrTest2) + N)

但不是第一个。

第一种方式声明的变量数组与第二种方式声明的变量数组有什么区别?  它们都是相同的vartype() - 8204 - Array of variants
 为什么宏会以不同的方式对待它们?

1 个答案:

答案 0 :(得分:5)

第一个是变种数组。 总是一个数组 - 它不能被重新分配为例如一个范围。第二种是几乎可以容纳任何东西的变体,包括一个数组(在这种情况下它就是这样)。请考虑以下代码:

Sub test()
    Dim arrTest() As Variant
    Dim arrTest2 As Variant
    arrTest2 = Array()
    Debug.Print "arrTest is a " & TypeName(arrTest)
    Debug.Print "arrTest2 is a " & TypeName(arrTest2)
End Sub

当你运行它时,你会得到这个:

arrTest is a Variant()
arrTest2 is a Variant()

令你觉得奇怪的是什么。如果它们属于同一类型,为什么VBA有时会将它们视为不同?

答案 - 他们不是相同的类型! typename(或仅varType),当应用于变量变量时,根本不会返回变量类型。相反,它返回变量的子类型(一个仅对变体有意义的概念)。要更清楚地了解正在发生的事情 - 在第一个Debug.Print语句之前设置一个断点,运行它,然后打开Locals Window

enter image description here

请注意arrTest的类型Variant()arrTest2的类型是Variant/Variant(0 to -1)。他们真的不是同一类型。 arrTest是一个数组,因此它必须遵循关于数组的VBA语法。 arrTest2根本不是数组 - 它是简单变量(类型变量),因此它遵循简单(非数组)变量的VBA语法。事实上,在这种特殊情况下,它指向一个数组并不会使它成为一个数组变量。

如果您熟悉C,那么您的问题类似于许多初级C程序员询问intint*之间的差异的问题,只是在某些方面它在这里更加神秘,因为事实上像varTypeTypeName这样的函数隐含地取消引用任何变量变量可以说是一个设计缺陷。在某些情况下,如果typename(arrTest2)在这种情况下会返回更准确(尽管更详细)Variant/Variant(),那将会很不错。