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

What is the difference between `Array` and `Array()`?

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

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
为什么宏以不同的方式对待它们?

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

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),当应用于变体变量时 根本不会 return 变量类型。相反,它 return 是变量的 子类型 (这个概念只对变体有意义)。为了更清楚地了解正在发生的事情——在第一个 Debug.Print 语句 运行 之前放置一个断点,然后打开 Locals Window:

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

如果你熟悉C的话,你的问题和很多初学C的程序员问的int和[=23=的区别]的问题很相似,只是这里有些神秘因为像 varTypeTypeName 这样的函数隐式取消引用任何变体变量这一事实可以说是一个设计缺陷。在某种程度上,如果 typename(arrTest2) 在这种情况下 return 更准确(尽管更冗长)Variant/Variant() 就好了。