[英]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.