Excel 变体而非对象
如果我知道一点数据将成为一个对象,但我不知道是什么类型的,我可以将其传递给函数或例程,如下所示:Excel 变体而非对象,excel,vba,variant,Excel,Vba,Variant,如果我知道一点数据将成为一个对象,但我不知道是什么类型的,我可以将其传递给函数或例程,如下所示: Sub mySubExpectingAnObject(myVal As Object) 这比 Sub mySubExpectingAnObject(myVal As Variant) 即使两者都起作用,也应优先考虑 相反,如果我知道数据位不是对象,但可以是其他任何东西(Long,Double,String等),是否有任何方法将参数设置为非对象。例如 Sub mySubExpectingNotAn
Sub mySubExpectingAnObject(myVal As Object)
这比
Sub mySubExpectingAnObject(myVal As Variant)
即使两者都起作用,也应优先考虑
相反,如果我知道数据位不是对象,但可以是其他任何东西(Long
,Double
,String
等),是否有任何方法将参数设置为非对象。例如
Sub mySubExpectingNotAnObject(myVal As NotObject)
因为如果我在这里使用Variant
,将不会自动进行反对象检查。是否存在这样的类型;一个可以以独占方式封装任何非对象数据类型的数据类型?除此之外还有其他解决办法吗
If isObject(myVal) Then Err.Raise 5
或者类似的?我看不出使用
变量
并抛出无效的过程调用或参数运行时错误5有什么不对,因为IsObject(参数)
返回True
,这实际上是说“此过程是用无效参数调用的”
Variant
的存在是为了解除编译时类型约束,以便VBA可以处理外来类型,例如IUnknown
等等:您无法使用Variant
并对其执行任何类型的编译时检查-根据定义,Variant
的类型只能在运行时
解决这个问题的惯用方法是为过程及其参数使用好的、有意义的名称。不过,很难用你的例子来推荐任何东西
没有“variant but not a object”类型,您不能使用
variant
并期望在编译时进行任何类型的类型验证。这里回答了这个问题:在带有^link的assoc中,Const vbObject=9。但是请注意,您的问题是关于Dim而不是测试的。…Variant
的存在是为了消除编译时类型限制,隐式类型转换不会弄糟这些限制。。。可能还需要一个字符串
,然后从那里转换。为什么它的“否”很重要?