2011-05-13 89 views
3

有没有办法来调用一个函数,其中调用存储在表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) 

干杯

格雷厄姆

回答

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声明而非DB存储,但这也可以)。

编辑

正如我重读我的“完成”后刚刚提出申请后,我意识到,有一个疑难杂症潜伏在那里。因为你在之前进行替换将字符串提交到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在模块,而不是在窗体的代码。

4

是的,你可以使用该​​功能。

语法:

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) 
+0

感谢您的帮助 – Graham 2011-05-15 19:50:40