繁体   English   中英

嵌套函数是否可以在VBA中使用?

[英]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 
  • 手动创建一个闭包。

    定义一个将LU公开为字段或属性的类。 实例化类,设置LU一次,然后调用函数Cleaner ,在该类还定义,调用complicatedFunction与存储的LU

    显然这会产生一些开销。

您可以使用此语法

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM