[英]Are nested functions possible in VBA?
我试图通过从私有范围内的函数中剥离参数来清理代码,如下所示:
Function complicatedFunction(x as Double, param1 as Double, param2 as Double)
...
End Function
Function mainActionHappensHere(L as Double, U as Double ...)
Function cleaner(x)
cleaner = complicatedFunction(x, L, U)
End Function
...
cleaner(x) 'Many calls to this function
...
End Function
这可能吗? 编译器抱怨“预期结束函数”,因为我在结束外部函数之前开始执行函数。 谷歌没有帮助:( PS我不能在mainActionHappensHere()之外定义cleaner(),因为那时正确的L和U不会被传递到它。
VB.Net可以做到这一点,但我不相信VBA可以。
可能有助于您以其他方式简化此代码的两个功能是重载函数或可选参数。 以下是使用可选参数的示例:
Function complicatedFunction(x as Double, Optional param1 as Double = L, Optional param2 as Double = U) As Object
...
End Function
complicatedFunction(x)
但是,L和U必须是常量才能工作。
FWIW,如果事实证明你正在使用VB.Net方言,VB.Net语法如下所示:
Sub complicatedFunction(x as Double, param1 as Double, param2 as Double)
...
End Sub
Function mainActionHappensHere(L as Double, U as Double ...)
Dim cleaner As Func(Of Double, Object) =
Function(x)
Return complicatedFunction(x, L, U)
End Function
Dim y = cleaner(x) 'Many calls to this function
...
End Function
VB中没有嵌套函数,无论是VBA还是VB6或VB.NET。
将范围限制为VBA,您的选项将是:
使用GoSub
,这是最老的VB命令之一,不赞成使用,并且在VB.NET中没有升级等价物:
Function mainActionHappensHere(L as Double, U as Double ...) Dim ResultOfCleaner As Variant ... x = 5 : GoSub cleaner 'Many calls to this function 'Use ResultOfCleaner here ... x = 42 : GoSub cleaner 'Many calls to this function 'Use ResultOfCleaner here ... Exit Function cleaner: ResultOfCleaner = complicatedFunction(x, L, U) Return End Function
手动创建一个闭包。
定义一个将L
和U
公开为字段或属性的类。 实例化类,设置L
和U
一次,然后调用函数Cleaner
,在该类还定义,调用complicatedFunction
与存储的L
和U
。
显然这会产生一些开销。
您可以使用此语法
Dim fSomeFunction As Func(Of String, Boolean) = Function(ByVal something As String) As Boolean
Return True
End Function
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.