首页 > 解决方案 > 变体但不是对象

问题描述

如果我知道一些数据将是一个对象,但我不知道是什么类型,我可以将它传递给一个函数或例程,如下所示:

Sub mySubExpectingAnObject(myVal As Object)

哪个比

Sub mySubExpectingAnObject(myVal As Variant)

即使两者都有效,也应该是首选

相反,如果我知道数据位不是对象,但可能是其他任何东西(Long,DoubleString),是否有任何方法可以Dim将参数视为不是对象。例如

Sub mySubExpectingNotAnObject(myVal As NotObject)

因为如果我Variant在这里使用,就不会有自动反对象检查。是否存在这种类型?一个可以专门封装任何非对象数据类型的?是否有其他解决方法

If isObject(myVal) Then Err.Raise 5

或类似的?

标签: excelvbavariant

解决方案


我看不出使用 aVariant并抛出无效的过程调用或参数运行时错误 5 有什么问题,它几乎字面意思是“这个过程是用无效的参数调用的”,给定IsObject(theParameter)返回True.

Variant专门用于解除编译时类型约束,以便 VBA 可以处理IUnknown诸如此类的外来类型:您无法使用 aVariant 对其执行任何类型的编译时检查-根据定义aVariant的类型仅在运行时解决。

解决这个问题的惯用方法是为您的过程及其参数使用好的、有意义的名称。很难用你所拥有的例子来推荐任何东西。

没有“变体但不是对象”类型,您不能Variant在编译时使用并期望任何类型的类型验证。


推荐阅读