我可以声明一个数组:
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
为什么宏会以不同的方式对待它们?
答案 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
:
请注意arrTest
的类型Variant()
,arrTest2
的类型是Variant/Variant(0 to -1)
。他们真的不是同一类型。 arrTest
是一个数组,因此它必须遵循关于数组的VBA语法。 arrTest2
根本不是数组 - 它是简单变量(类型变量),因此它遵循简单(非数组)变量的VBA语法。事实上,在这种特殊情况下,它指向一个数组并不会使它成为一个数组变量。
如果您熟悉C,那么您的问题类似于许多初级C程序员询问int
和int*
之间的差异的问题,只是在某些方面它在这里更加神秘,因为事实上像varType
和TypeName
这样的函数隐含地取消引用任何变量变量可以说是一个设计缺陷。在某些情况下,如果typename(arrTest2)
在这种情况下会返回更准确(尽管更详细)Variant/Variant()
,那将会很不错。