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

Kaz*_*Kaz 2 excel vba excel-vba variable-declaration

我可以声明一个数组:

Dim arrTest() As Variant
Run Code Online (Sandbox Code Playgroud)

或者因此:

Dim arrTest2 As Variant
arrTest2 = Array()
Run Code Online (Sandbox Code Playgroud)

但是,第一个只能作为参数传递,如下所示:

Sub(ByRef arrTest() As Variant)
Run Code Online (Sandbox Code Playgroud)

第二个是这样的:

Sub(ByRef arrTest2 As Variant)
Run Code Online (Sandbox Code Playgroud)

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

ReDim arrTest2(UBound(arrTest2) + N)
Run Code Online (Sandbox Code Playgroud)

但不是第一个.

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

Joh*_*man 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
Run Code Online (Sandbox Code Playgroud)

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

arrTest is a Variant()
arrTest2 is a Variant()
Run Code Online (Sandbox Code Playgroud)

这就是让你觉得奇怪的事.如果它们是同一类型,为什么VBA有时会将它们视为不同?

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

在此输入图像描述

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

如果您熟悉C,那么您的问题类似于许多初学C程序员询问它们之间的区别的问题,int并且int*仅在某些方面它更加神秘,因为函数喜欢varTypeTypeName隐含地取消引用任何变量变量可以说是设计缺陷.在某些情况下,如果在这种情况下typename(arrTest2)返回更准确(尽管更详细)会更好Variant/Variant().