2010-11-30 77 views
5

我在MS Access後面使用VBA 假設我有全局方法foo1和foo2,它們獲取相同的參數但做了不同的事情。 我知道在C++中,我可以爲函數分配一個別名。喜歡的東西: 代替:在VBA中定義函數別名,可能嗎?

If (term) then 
    foo1 arg1, arg2, arg3 
else 
    foo2 arg1, arg2, arg3 
End If 

我想寫:

Var new_func = Iff (term, foo1,foo2) 
new_func arg1, arg2, arg3 

我能做到這一點的VBA?

回答

1

不幸的是,這不適用於VBA。會很好,但你只需要堅持你的第一個語法。

更新:所以,我堅持我原來的主張,即問題中提出的構造不存在於VBA中,但Alex K.Remou已提供可用的解決方法。

1

試試這個:

http://oreilly.com/catalog/vbanut/chapter/booklet.html#sect5

AddressOf操作。

然而,隨着上指出http://discuss.fogcreek.com/joelonsoftware4/default.asp?cmd=show&ixPost=140196&ixReplies=19

「AddressOf真的是一個廉價的黑客攻擊。VB不支持其它大多數語言一樣頭等函數值,但AddressOf是支持它一半是的,你可以得到的地址但是你不能通過地址調用一個函數(除非該函數是一個消息處理器,並且只有Win32函數CallWndProc)。模擬這種行爲所能做的只是使用通用的調度對象而不是函數指針,並確保該物體支持必要的功能。「

不幸的是,我相信這就像你會得到一樣。

欲瞭解更多有關AddressOf的信息,請參閱here

+0

聰明的想法,但我沒有(還)見AdressOf將如何幫助這裏,因爲它不能被用來在VBA內調用的函數。 – 2010-11-30 10:27:17

+0

不幸的是,這是一個'嘗試看到VBA的限制'鏈接。 AddressOf並通過一個接口調用相同名字的函數(如果其他海報是正確的)大概就像你會得到的一樣。 – 2010-11-30 11:20:32

+1

作爲一個可怕的黑客,您可以實際使用CallWindowProc來調用指針的任何VBA地址,只要簽名匹配並且您爲hwnd使用0即可。你甚至可以傳遞As String。 – 2010-11-30 12:08:21

3

如果2個函數在2個不同的類模塊中實現,則可以給它們起一個名稱&通過接口調用它們。這是關於你可以得到的。 (和它的不是很緊密)

'empty interface class, name: IFoo 
Public Function TheFunc(i As Integer) As Long 
' 
End Function 
'class clsFoo1 
Implements IFoo 

Private Function IFoo_TheFunc(i As Integer) As Long 
MsgBox "I'm clsFoo1" 
End Function 
'class clsFoo2 
Implements IFoo 

Private Function IFoo_TheFunc(i As Integer) As Long 
MsgBox "I'm clsFoo2" 
End Function 
'module code; 
Dim myFoo As IFoo 
If var = 1 Then 
    Set myFoo = New clsFoo1 
Else 
    Set myFoo = New clsFoo2 
End If 

myFoo.TheFunc 12345 
相關問題