2011-05-13 85 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