Вызов функции VBA - PullRequest
       5

Вызов функции VBA

3 голосов
/ 13 мая 2011

Есть ли способ вызвать функцию, где вызов хранится в таблице

**Record 1  task            Function call**
124567      Email customer  Call function emailcus(a,b,c,d)
434535      AddCost         Call function addcost(a,b,c,d)

Приветствия

Грэм

Ответы [ 2 ]

4 голосов
/ 13 мая 2011

Да, для этого вы можете использовать функцию Eval().

Синтаксис:

Dim ReturnValue As String

ReturnValue = Eval("MyFunction(1, 2)")

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

Я указываю на это, потому что я не уверен, являются ли параметры a, b, c, d в вашем примере только фиктивными значениями для вашего примера, или вы ожидаете, что VBA заполнит значения некоторых переменных с именем a, b, c, d автоматически.
Функция Eval не делает это, поэтому, если вам нужны значения переменных в качестве параметров, вам придется сделать что-то вроде этого:

Dim ReturnValue As String
Dim EvalString As String

EvalString = "MyFunction(" & Variable1 & ", " & Variable2 & ")"

ReturnValue = Eval(EvalString )
3 голосов
/ 13 мая 2011

Это вариант ответа, уже предоставленного haarrrgh, поэтому, если вы сочтете его полезным, обязательно проголосуйте и за него.

Существует еще один способ работы с заполнителями в вызовах функций, хранящихся в БД. Во-первых, измените ваши данные таким образом:

**Record 1  task            Function call** 
124567      Email customer  Call function emailcus([TokenA],[TokenB])
434535      AddCost         Call function addcost([TokenA],[TokenB])

Обратите внимание, что [SquareBrackets] - это , а не , на самом деле требуется синтаксис в этом примере, просто то, что я склонен использовать в этой ситуации. Важная часть заключается в том, чтобы сделать маркеры параметров чем-то, чего нет в других местах строкового значения (включая другие токены). Вы можете использовать столько параметров, сколько вам нужно, просто убедитесь, что вызывающий код знает, сколько ожидается от каждой строки вызова функции (я сократил ее, чтобы сократить следующий код).

Затем, когда пришло время вызвать вашу функцию, сделайте следующее:

Dim ReturnValue   As String    'or as appropriate for individual the function's return
Dim EvalString    As String

EvalString = 'code to fetch from table

EvalString = Replace(EvalString, "[TokenA]", strValueA) 'strValueA passed in?
EvalString = Replace(EvalString, "[TokenB]", strValueB) 'strValueB passed in?

ReturnValue = Eval(EvalString)

В VB6, по крайней мере (поэтому я предполагаю, что это правда в VBA), Replace быстрее, чем конкатенация. Я также нахожу это более читабельным, но это может быть потому, что я привык использовать аналогичную технику для построения команд SQL в коде (используя Const декларации, а не хранилище БД, но это тоже будет работать).

EDIT

Когда я перечитал свой «готовый» пост сразу после его отправки, я понял, что там скрывается гоча. Поскольку вы делаете подстановку перед передачей строки в Eval, это фактические значения, которые помещаются в строку, , а не переменные. Код, который я представил выше, работает нормально , если ваши параметры числовые, но если они строкового типа, вы должны включить кавычки, либо в ваши данные, либо в ваш вызов Replace. Я предпочитаю первое, поэтому измените ваши данные на это:

**Record 1  task            Function call** 
124567      Email customer  Call function emailcus('[TokenA]','[TokenB]')
434535      AddCost         Call function addcost('[TokenA]','[TokenB]')

Это работает как проверено с Const. Хранится в записи БД, вам может понадобиться это:

**Record 1  task            Function call** 
124567      Email customer  Call function emailcus(""[TokenA]"",""[TokenB]"")
434535      AddCost         Call function addcost(""[TokenA]"",""[TokenB]"")

(который также работает с Const ...).

Альтернатива - оставить данные такими, как они есть в моей первой части, и изменить Replace вызовов:

EvalString = Replace(EvalString, "[TokenA]", """" & strValueA & """") 'strValueA passed in?
'or maybe
EvalString = Replace(EvalString, "[TokenB]", "'" & strValueB & "'") 'strValueA passed in?

Пара других потенциальных ошибок: эти должны быть функциями, а не подпрограммами, и они должны быть объявлены Public в модуле , а не в Код формы.

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