excel - 变体但不是对象
问题描述
如果我知道一些数据将是一个对象,但我不知道是什么类型,我可以将它传递给一个函数或例程,如下所示:
Sub mySubExpectingAnObject(myVal As Object)
哪个比
Sub mySubExpectingAnObject(myVal As Variant)
即使两者都有效,也应该是首选
相反,如果我知道数据位不是对象,但可能是其他任何东西(Long
,Double
等String
),是否有任何方法可以Dim
将参数视为不是对象。例如
Sub mySubExpectingNotAnObject(myVal As NotObject)
因为如果我Variant
在这里使用,就不会有自动反对象检查。是否存在这种类型?一个可以专门封装任何非对象数据类型的?是否有其他解决方法
If isObject(myVal) Then Err.Raise 5
或类似的?
解决方案
我看不出使用 aVariant
并抛出无效的过程调用或参数运行时错误 5 有什么问题,它几乎字面意思是“这个过程是用无效的参数调用的”,给定IsObject(theParameter)
返回True
.
Variant
专门用于解除编译时类型约束,以便 VBA 可以处理IUnknown
诸如此类的外来类型:您无法使用 aVariant
并对其执行任何类型的编译时检查-根据定义aVariant
的类型仅在运行时解决。
解决这个问题的惯用方法是为您的过程及其参数使用好的、有意义的名称。很难用你所拥有的例子来推荐任何东西。
没有“变体但不是对象”类型,您不能Variant
在编译时使用并期望任何类型的类型验证。