(警告:虽然乍一看可能像一个,但这是not一个初级问题。如果您熟悉“Let coercion”这句话或者您曾经研究过 VBA 规范,请继续阅读。)
假设我有一个类型的表达式Variant
,我想将它分配给一个变量。听起来很容易,对吧?
Dim v As Variant
v = SomeMethod() ' SomeMethod has return type Variant
不幸的是,如果SomeMethod
返回一个对象(即 VarType 为 vbObject 的变体),让胁迫 https://msdn.microsoft.com/en-us/library/ee177257.aspx踢入并v
包含对象的“简单数据值”。换句话说,如果 SomeMethod 返回对 TextBox 的引用,v
将包含一个字符串。
显然,解决方案是使用Set
:
Dim v As Variant
Set v = SomeMethod()
不幸的是,如果SomeMethod
does not返回一个对象,例如一个字符串,产生一个类型不匹配 error.
到目前为止,我找到的唯一解决方案是:
Dim v As Variant
If IsObject(SomeMethod()) Then
Set v = SomeMethod()
Else
v = SomeMethod()
End If
这有调用的不幸的副作用SomeMethod
twice.
有没有一个解决方案可以not需要打电话SomeMethod
twice?
在 VBA 中,将 Variant 分配给您不知道它是对象还是基元的变量的唯一方法是将其作为参数传递。
如果您无法重构代码以便v
作为参数传递给 Sub、Function 或 Let Property(尽管Let
这也适用于对象),你可以随时声明v
在模块范围内并有一个专用的 Sub 仅用于保存分配该变量:
Private v As Variant
Private Sub SetV(ByVal var As Variant)
If IsObject(var) Then
Set v = var
Else
v = var
End If
End Sub
与其他地方打电话SetV SomeMethod()
.
不太漂亮,但这是不打电话的唯一方法SomeMethod()
两次或触摸其内部运作。
Edit
好吧,我仔细考虑了一下,我想我找到了一个更好的解决方案,更接近您的想法:
Public Sub LetSet(ByRef variable As Variant, ByVal value As Variant)
If IsObject(value) Then
Set variable = value
Else
variable = value
End If
End Sub
[...] 我想 VBA 中没有 LetSet v = ... 语句
现在有:LetSet v, SomeMethod()
您没有需要的返回值Let
or Set
根据其类型传递给变量,而是传递应将返回值作为第一个参数的变量引用这样 Sub 就可以改变它的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)