簡體   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