有没有办法调用函数,其中调用存储在表
中**Record 1 task Function call**
124567 Email customer Call function emailcus(a,b,c,d)
434535 AddCost Call function addcost(a,b,c,d)
干杯
格雷厄姆
答案 0 :(得分:4)
是的,您可以使用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 )
答案 1 :(得分:3)
这是haarrrgh已经给出的答案的变体,所以如果你发现它有用,那么一定要支持那个。
在DB存储的函数调用中还有另一种处理占位符的方法。首先,改变您的数据:
**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
声明而不是数据库存储,但这也可以。)< / p>
修改强>
当我在提交之后重读我的“完成”帖子时,我意识到那里潜藏着一些东西。因为您在将字符串提交到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
...)。
另一种方法是将数据保留在我的第一部分中,&amp;更改Replace
来电:
EvalString = Replace(EvalString, "[TokenA]", """" & strValueA & """") 'strValueA passed in?
'or maybe
EvalString = Replace(EvalString, "[TokenB]", "'" & strValueB & "'") 'strValueA passed in?
其他一些潜在的问题:这些必须是函数,而不是Subs,并且必须在模块中声明Public
,而不是Form的代码。