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

我可以这样声明一个数组:

Dim arrTest() As Variant 

或者如此:

 Dim arrTest2 As Variant arrTest2 = Array() 

然而,第一个只能作为这样的一个parameter passing:

 Sub(ByRef arrTest() As Variant) 

第二个是这样的:

 Sub(ByRef arrTest2 As Variant) 

你可以用第二个来做到这一点:

 ReDim arrTest2(UBound(arrTest2) + N) 

但不是第一个。

声明第一种方法的variables数组和第二个声明的variables数组之间有什么区别?
它们都是相同的vartype() - 8204 - Array of variants
为什么macros对待他们不同?

首先是一系列的变种。 它总是一个数组 – 它不能被重新分配,例如一个范围。 第二个是可以容纳任何东西的变体,包括一个数组(在这种情况下)。 考虑下面的代码:

 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() 

这是什么让你感到奇怪。 如果他们是同一types,为什么VBA有时候把它们看作是不同的?

答案 – 他们不是一样的types! typename (或只是varType ),当应用到variablesvariables不会返回variablestypes。 相反,它会返回variables的子types (一个只对变体有意义的概念)。 为了更清楚地了解发生了什么 – 在第一个Debug.Print语句之前放置一个断点,运行它并打开Locals Window

在这里输入图像说明

请注意, arrTest的types是Variant()arrTest2Variant/Variant(0 to -1) 。 他们真的不是同一types。 arrTest是一个数组,所以它必须遵循有关数组的VBA语法。 arrTest2根本不是一个数组 – 它是简单variables(types变体),所以它遵循简单(非数组)variables的VBA语法。 在这种情况下,指向一个数组并不能使它成为一个数组variables。

如果你熟悉C语言,你的问题类似于许多初学C语言程序员询问intint*之间区别的问题,只是在某些方面它更加神秘,因为类似varTypeTypeName函数隐式地解引用variablesvariables可以说是一个devise缺陷。 在某种情况下,如果typename(arrTest2) Variant/Variant()在这种情况下会返回更准确(尽pipe更详细)的Variant/Variant() ,那将会很好。