为什么范围显然是数组?

时间:2018-08-06 20:58:45

标签: vba excel-vba

在Excel VBA中的功能

IsArray(Range("A1:A5"))

对于包含一个以上单元格(据我所知)的任何范围,将返回True

这是为什么?其他类似CollectionArrayList的可迭代对象则不是这样。以及如何修改数组检查代码以仅针对数组而不是类似数组的对象返回True

2 个答案:

答案 0 :(得分:4)

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

写出说明其作用并按其说明的代码-尽可能避免隐式默认成员调用。

答案 1 :(得分:0)

您可以使用TypeOf功能来确定这一点:

Function arrayIsRange(arr As Variant) As Boolean
    arrayIsRange = TypeOf arr Is Excel.Range
End Function

使用中:

Sub test()
    'prints "True"
    Debug.Print arrayIsRange(Range("A1:C3"))


    arr = Array(1, 2, 3)
    'prints "False"
    Debug.Print arrayIsRange(arr)
End Sub