为什么范围显然是一个数组?

Gre*_*edo 3 excel vba

Excel VBA 中的函数

IsArray(Range("A1:A5"))
Run Code Online (Sandbox Code Playgroud)

将返回True包含多个单元格的任何范围(据我所知)。

为什么是这样?Collection其他可迭代对象(例如和 )的情况并非如此ArrayList。如何修改数组检查代码以True仅返回数组,而不返回类似数组的对象?

Mat*_*don 5

ARange是一个对象。

Debug.Print TypeName(Range("A1:A5")) ' prints "Range"
Run Code Online (Sandbox Code Playgroud)

您正在做的是隐式默认成员调用invoking Range.[_Default],它归结为 invoking ,...在给定任何多单元格Range.Value范围的情况下返回一个 2D 数组。

显示 Excel.Range 的隐藏默认成员的对象浏览器

Debug.Print IsArray(Range("A1").Value)    ' prints "False"
Debug.Print IsArray(Range("A1:A2").Value) ' prints "True"
Run Code Online (Sandbox Code Playgroud)

该默认成员调用是“在您背后”进行的,因为 VBA 正在“提供帮助”,并且看到您正在调用IsArray(someObjectReference),转到该 的接口someObjectReference,看到它有一个默认成员,并评估IsArray(someObjectReference.DefaultMember)而不是IsArray(someObjectReference),这不会没有用(对象引用显然不是数组......对吗?)。

对于公开默认成员的其他类/类型,您会得到类似的结果。是Application一个String

Debug.Print Application ' prints "Microsoft Excel"
Run Code Online (Sandbox Code Playgroud)

显示 Excel.Application 的隐藏默认成员的对象浏览器

当然不是——它是一个对象,但有一个默认成员,在调用时,归结为调用其Name属性 getter。

分配对象引用时,Set需要关键字:

Dim foo As Variant
Set foo = Range("A1")
Run Code Online (Sandbox Code Playgroud)

如果没有Set关键字,相同的代码将分配给返回对象的默认成员

Dim foo As Variant
foo = Range("A1") '.Value is implicit
Run Code Online (Sandbox Code Playgroud)

编写代码,说它做什么,做它说的- 尽可能避免隐式默认成员调用。

  • 也许值得添加 - VBA 中的默认属性是 `Set` 存在的原因:区分请求对象本身和它的默认属性。相反,VB.NET 没有默认属性,因此没有“Set”关键字。 (2认同)