gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:47:34 26 4
gpt4 key购买 nike

Excel VBA中的函数

IsArray(Range("A1:A5"))

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

这是为什么?其他可迭代对象(如 CollectionArrayList)并非如此。我如何修改我的数组检查代码以仅针对数组返回 True,而不是类似数组的对象?

最佳答案

Range 是一个对象。

Debug.Print TypeName(Range("A1:A5")) ' prints "Range"

您正在做的是隐式默认成员调用,调用Range.[_Default],归结为调用Range.Value, ...返回给定任意多单元格范围的二维数组。

object  browser showing hidden default member of Excel.Range

Debug.Print IsArray(Range("A1").Value)    ' prints "False"
Debug.Print IsArray(Range("A1:A2").Value) ' prints "True"

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

使用其他公开默认成员 的类/类型,您会得到类似的结果。 ApplicationString 吗?

Debug.Print Application ' prints "Microsoft Excel"

object browser showing hidden default member of Excel.Application

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

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

Dim foo As Variant
Set foo = Range("A1")

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

Dim foo As Variant
foo = Range("A1") '.Value is implicit

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

关于vba - 为什么一个范围显然是一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51715543/

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