gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:58:28 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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:

enter image description here

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

如果您熟悉 C,您的问题与许多 C 初学者提出的有关 intint* 之间差异的问题类似,只是在某些方面有所不同这里更加神秘,因为像 varTypeTypeName 这样的函数隐式取消引用任何变体变量这一事实可以说是一个设计缺陷。在某种程度上,如果 typename(arrTest2) 在这种情况下能够返回更准确(尽管更冗长)的 Variant/Variant(),那就太好了。

关于vba - `Array` 和 `Array()` 和有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32162477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com