2015-08-04 17 views
2

У меня есть большое количество функций, которые мне нужно вызвать, которые имеют одни и те же аргументы, и я хотел бы иметь возможность централизовать их, чтобы избежать громоздких блоков кода. Очевидно, я мог бы использовать функцию-оболочку, чтобы просто позвонить всем остальным, но я не всегда называю их всеми. Моя следующая мысль, что я мог бы поместить функции в виде списка или словаря и вызывать их оттуда, так же, как в Python:Можно ли использовать словарь Excel VBA для вызова функции?

def foo(): 
    return "foo" 

myDict = { "foo": foo } 

myDict["foo"]() 

Возвращает foo

нечто подобное возможно в VBA? Если да, то какой самый простой способ сделать это?

+0

Вероятно, лучше всего использовать 'Application.Run (myDict (« foo »)), но это не шаблон, который хорошо переносится на VBA, что не соответствует lly имеют понятие указателей функций. –

+0

Существует функция CallByName, которая может использоваться для вызова любой функции по ее строковому представлению. Так, например, вы можете сделать: 'CallByName (" foo ")', который в свою очередь вызовет функцию с именем «foo». Это то, что вы ищите? –

ответ

0

Там не появляется, чтобы быть действительно прямым способом сделать это , однако это можно сделать, используя комбо списка и функцию CallByName.

Вы можете сделать список, который содержит все имена функций как строки:

myFunctions = ("foo" "bar" "baz") 

Вы можете перебрать массив для вызова функции:

For Each functionName in myFunctions 
    CallByName Sheet1, functionName, VbMethod, listOfArguments 
Next functionName 

Функция может быть отфильтрована с If

1

Если функции находятся внутри объектов/классов, вы можете позвонить им по имени напрямую. Этот код работает внутри SHEET1, потому что это объект. Он не будет работать в модуле, так как это выходит за пределы возможностей функции CALLBYNAME.

Таким образом, вы можете хранить имена в ключе словаря, а затем просто использовать ключ (без указателя функции не требуется)

Public Sub Something(arg1 As String) 
    MsgBox arg1 
End Sub 

Public Sub test() 
    CallByName Sheet1, "Something", VbMethod, "data 1" 
End Sub 
Смежные вопросы