Excel VBA 中的函数
IsArray(Range("A1:A5"))
Run Code Online (Sandbox Code Playgroud)
将返回True包含多个单元格的任何范围(据我所知)。
为什么是这样?Collection其他可迭代对象(例如和 )的情况并非如此ArrayList。如何修改数组检查代码以True仅返回数组,而不返回类似数组的对象?
ARange是一个对象。
Debug.Print TypeName(Range("A1:A5")) ' prints "Range"
Run Code Online (Sandbox Code Playgroud)
您正在做的是隐式默认成员调用invoking Range.[_Default],它归结为 invoking ,...在给定任何多单元格Range.Value范围的情况下返回一个 2D 数组。

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)

当然不是——它是一个对象,但有一个默认成员,在调用时,归结为调用其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)
编写代码,说它做什么,做它说的- 尽可能避免隐式默认成员调用。
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |