определить псевдоним функции в VBA, возможно? - PullRequest
5 голосов
/ 30 ноября 2010

Я использую VBA за MS Access. Скажем, у меня есть глобальные методы foo1 и foo2, которые получают одинаковые аргументы, но делают разные вещи.Я знаю, что в C ++ я могу назначить функции псевдоним.Что-то вроде: вместо:

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?

Ответы [ 5 ]

6 голосов
/ 30 ноября 2010

Будет ли Run костюм?

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

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

Дополнительная информация: http://msdn.microsoft.com/en-us/library/aa199108(office.10).aspx

3 голосов
/ 30 ноября 2010

Если бы 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
1 голос
/ 30 ноября 2010

Попробуйте это:

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). Все, что вы можете сделать, чтобы смоделировать это поведение, - это использовать общие объекты отправки вместо указателей на функции и убедиться, что объекты поддерживают необходимые функции. " 1012 *

К сожалению, это примерно так близко, как вы, я полагаю.

Подробнее о AddressOf см. здесь .

1 голос
/ 30 ноября 2010

Нет, к сожалению, это невозможно с VBA. Было бы неплохо, но вам просто нужно придерживаться своего первого синтаксиса.

Обновление: Итак, я придерживаюсь своего первоначального утверждения, что предложенная в вопросе конструкция не существует в VBA, но Алекс К. и Рему предоставили полезные обходные пути.

0 голосов
/ 31 января 2019

Я понимаю, что это старый вопрос, но я предлагаю использовать STD.Types.Callback , который является частью моей библиотеки VBA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...