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

The*_*ous 4 vba parameter-passing inline-functions nested-function

我试图通过从私有范围内的函数中剥离参数来清理代码,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

这可能吗?编译器抱怨"预期结束函数",因为我在结束外部函数之前开始执行函数.谷歌没有帮助:( PS我不能在mainActionHappensHere()之外定义cleaner(),因为那时正确的L和U不会被传递到它.

Joe*_*orn 5

VB.Net可以做到这一点,但我不相信VBA可以.

可能有助于您以其他方式简化此代码的两个功能是重载函数或可选参数.以下是使用可选参数的示例:

Function complicatedFunction(x as Double, Optional param1 as Double = L, Optional param2 as Double = U) As Object
...
End Function

complicatedFunction(x)
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)


GSe*_*erg 5

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
    
    Run Code Online (Sandbox Code Playgroud)
  • 手动创建一个闭包.

    定义公开的类L以及U字段或属性.实例化类,设置LU一次,然后调用函数Cleaner,也在该类中定义,调用complicatedFunction存储LU.

    显然这会产生一些开销.