【问题标题】:What is the difference between `Array` and `Array()`?`Array` 和 `Array()` 有什么区别?
【发布时间】:2015-08-23 01:58:36
【问题描述】:

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

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

【问题讨论】:

    标签: vba excel variable-declaration


    【解决方案1】:

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

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

    如果你熟悉 C,你的问题类似于许多 C 初学者询问intint* 之间的区别的问题,只是在某些方面它更神秘,因为函数像varTypeTypeName 隐式取消引用任何变体变量可以说是设计缺陷。在某种程度上,如果typename(arrTest2) 在这种情况下返回更准确(尽管更冗长)的Variant/Variant(),那就太好了。

    【讨论】:

    • 第二个是可以容纳任何东西的变体...... 是的,他们现在甚至添加了对在变体中存储 UDT 变量的支持。仍然不能存储在变体中的一种类型是固定长度字符串。
    • @ExcelHero 有趣——我不知道有什么变体不能引用。
    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2018-02-13
    • 1970-01-01
    • 2017-06-28
    • 2016-04-15
    相关资源
    最近更新 更多