(警告:虽然乍看起来似乎不是一个问题,但这不是初学者级的问题。如果您熟悉“让我们强制使用”一词,或者您曾经研究过VBA规范,请继续阅读。)
假设我有一个type的表达式Variant
,我想将其分配给一个变量。听起来很简单,对吧?
Dim v As Variant
v = SomeMethod() ' SomeMethod has return type Variant
不幸的是,如果SomeMethod
返回一个对象(即VarType为vbObject的Variant),Let强制将插入并v
包含对象的“简单数据值”。换句话说,如果SomeMethod返回对TextBox的引用,v
则将包含一个字符串。
显然,解决方案是使用Set
:
Dim v As Variant
Set v = SomeMethod()
这不幸的是,如果失败,SomeMethod
并没有返回一个对象,例如一个字符串,产生一个类型不匹配错误。
到目前为止,我发现的唯一解决方案是:
Dim v As Variant
If IsObject(SomeMethod()) Then
Set v = SomeMethod()
Else
v = SomeMethod()
End If
不幸的是有SomeMethod
两次通话的副作用。
有没有哪一个解决方案不要求调用SomeMethod
两次?
在VBA中,将变量作为参数传递的唯一方法是将变量赋给不知道是对象还是基元的变量。
如果您无法重构代码,以将其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()
两次电话或触摸其内部工作的唯一方法。
好的,我仔细考虑了一下,我认为我找到了一个更好的解决方案,它更接近您的想法:
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
或Set
取决于其类型的变量,而不是你传递需要在按住返回值作为第一个参数变量的引用,使得子可以改变它的价值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句