将未扩展的数组传递给VB6的Ubound函数将导致错误,因此我想在检查其上限之前检查它是否已被标注尺寸.我该怎么做呢?
(警告:虽然乍看之下可能看起来像是一个问题,但这不是初学者级别的问题.如果你熟悉"强迫"一词,或者你曾经研究过VBA规范,请继续阅读.)
假设我有一个类型的表达式Variant,我想将它分配给一个变量.听起来很简单吧?
Dim v As Variant
v = SomeMethod() ' SomeMethod has return type Variant
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果SomeMethod返回一个Object(即VarType为vbObject的Variant),则强制启动并v包含该对象的"简单数据值".换句话说,如果SomeMethod返回对TextBox的引用,v则将包含一个字符串.
显然,解决方案是使用Set:
Dim v As Variant
Set v = SomeMethod()
Run Code Online (Sandbox Code Playgroud)
这不幸的是,如果失败,SomeMethod并没有返回一个对象,例如一个字符串,产生类型不匹配错误.
到目前为止,我找到的唯一解决方案是:
Dim v As Variant
If IsObject(SomeMethod()) Then
Set v = SomeMethod()
Else
v = SomeMethod()
End If
Run Code Online (Sandbox Code Playgroud)
这有SomeMethod两次打电话的不幸副作用.
有没有需要调用SomeMethod两次的解决方案?
最终编辑:它确实似乎是一个编译器错误 - 请参阅接受的答案.
在Excel 2007中使用VBA,我在'Class1'中有以下代码:
Option Explicit
Public Function strange(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
Public Sub not_strange(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Sub
Public Function also_not_strange(ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
Run Code Online (Sandbox Code Playgroud)
以及模块中的一些模式代码:
Option Explicit
Public Function not_strange_either(dummy As String, ParamArray pa())
Debug.Print pa(LBound(pa))
End Function
Public Sub outer(v)
Dim c As Class1
Set c = New Class1
Call c.strange("", v(LBound(v)))
Call c.not_strange("", v(LBound(v)))
Call c.also_not_strange(v(LBound(v)))
Call not_strange_either("", v(LBound(v)))
End Sub
Run Code Online (Sandbox Code Playgroud)
如果从立即窗口调用'outer',如下所示:
call outer(array("a"))
Run Code Online (Sandbox Code Playgroud)
我得到了看起来很奇怪的输出: …