在Excel VBA中的功能
IsArray(Range("A1:A5"))
对于包含一个以上单元格(据我所知)的任何范围,将返回True
。
这是为什么?其他类似Collection
和ArrayList
的可迭代对象则不是这样。以及如何修改数组检查代码以仅针对数组而不是类似数组的对象返回True
?
答案 0 :(得分:4)
Range
是一个对象。
Debug.Print TypeName(Range("A1:A5")) ' prints "Range"
您正在做的是一个隐式默认成员调用,调用Range.[_Default]
,最后归结为调用Range.Value
,...返回给定的二维数组多单元格范围。
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)
,这将没有用(对象引用显然不是数组...对吗?)
对于其他暴露默认成员的类/类型,您将获得类似的结果。 Application
是String
吗?
Debug.Print Application ' prints "Microsoft Excel"
当然不是-它是一个对象,但是具有默认成员,该成员在被调用时归结为调用其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