VBA函数调用

时间:2011-05-13 11:38:38

标签: ms-access vba

有没有办法调用函数,其中调用存储在表

**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 个答案:

答案 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的代码。