define a function alias in VBA, possible?

∥☆過路亽.° 提交于 2019-12-04 06:13:43

Would Run suit?

new_func = IIf(term, "foo1", "foo2")
''new_func arg1, arg2, arg3

res = Run(new_func, "a", "b", 1)

More information: http://msdn.microsoft.com/en-us/library/aa199108(office.10).aspx

Alex K.

If the 2 functions were implemented in 2 different class modules you could give them the same name & call them across an interface. That's about as close as you can get. (and its not very close)

'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

Try this:

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

The AddressOf operator.

However as noted on http://discuss.fogcreek.com/joelonsoftware4/default.asp?cmd=show&ixPost=140196&ixReplies=19

"AddressOf is really a cheap hack. VB doesn't support first-class function values like most other languages, but with AddressOf is supports it halfway. Yes you can get the address of a function but you can't invoke a function by address (unless that function is a message processor and only then with the Win32 function CallWndProc). All you can do to simulate this behavior is take generic dispatch objects instead of function pointers and ensure that the objects support the necessary functions. "

Unfortunately, that's about as close as you'll get, I believe.

For more info on AddressOf, see here.

Tom Juergens

No, unfortunately, that's not possible with VBA. Would be nice, but you'll just have to stick to your first syntax.

Update: So, I stand by my original assertion that the construct proposed in the question does not exist in VBA, but Alex K. and Remou have provided usable workarounds.

I realise this is an old question, but I suggest using STD.Types.Callback which is part of my VBA library.

Usage:

sub test()
  Dim msg as STD_Types_Callback
  set msg = STD.Types.Callback.Create("Module","Module1","Msg")
  'or
  'set msg = STD.Types.Callback.Create("Object",myObject,"Msg")

  DoMessage(msg, "hello world") '=> "hello world"
end sub


function Msg(message)
  Msgbox message
end function

function DoMessage(a as object, b as string)
  a(b)
end function
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!