請注意標籤:VBA,而不是VB6,而不是VB.NET。VBA中的自定義回調
這是特定於MS Access中的VBA。我在我稱之爲「Enumerable」的模塊中構建了一組方法。它做了很多讓人聯想到.NET中的Enumerable類和接口的事情。我想實現的一件事是ForEach方法,與.NET Enumerable.Select method類似。
我構建了一個使用Application.Run方法爲每個元素調用函數的版本,但Application.Run只能用於用戶定義的方法。例如,以下工作:
' User-defined wrapper function:
Public Function MyReplace(_
Expression As String, Find As String, StrReplace As String, _
Optional Start As Long = 1, _
Optional Count As Long = 1, _
Optional Compare As VbCompareMethod = vbBinaryCompare)
MyReplace = Replace(Expression, Find, StrReplace, Start, Count, Compare)
End Function
' Using Application.Run to call a method by name
Public Sub RunTest()
Debug.Print Run("MyReplace", "Input", "In", "Out")
End Sub
RunTest按預期打印「輸出」。以下不起作用:
Debug.Print Run("Replace", "Input", "In", "Out")
它引發運行時錯誤430:「類不支持自動化或不支持預期的接口」。這是預期的,因爲該文檔指出Application.Run只適用於用戶定義的方法。
VBA確實有一個AddressOf運算符,但只適用於將函數指針傳遞給外部API函數的情況;使用AddressOf創建的函數指針在VBA中不可使用。同樣,這在文檔中有記載(或參見例如VBA - CallBacks = Few Cents Less Than A Dollar?)。
那麼有沒有其他的方法來識別和調用使用變量的方法?或者,我的回調 - ish嘗試將通過Application.Run方法限制爲用戶定義的函數嗎?
你不會能夠使用addressof,但VBA支持類,所以基於接口的回調是好的; 'sub something(arg as string,myCallBack as IWhatever)... myCallBack.call(...)'將你的方法加入到一個類中,你可以用「CallByName」的名字來調用它們 - 由於處理它有點弱動態數量的參數,替代http://www.devx.com/tips/Tip/15422 –
我有點困惑,你真的需要幫助。你的第一段談到實施'For ...每一個',但你的問題的其餘部分談論試圖在VBA函數上使用'Application.Run'。 – mischab1
@ mischab1 - 查看任何.NET IEnumerable擴展方法。在他們中的大多數人中,您提供了一個回調來執行集合中的每個成員。我正在嘗試在VBA中做同樣的事情。 VBA沒有委託或函數指針或任何東西。我已經使用Application.Run作爲替代,但它的適用性有限。 –