2013-10-11 37 views
1

我有一個xll(一個相當複雜的C++項目)導出一個函數,由於歷史原因,這個函數需要大量的參數,並且精確地說是。如何從無法註冊到函數嚮導的xll加載項調用函數?

這是一個號:顯然是在Excel 2003中存在的30個參數(」在Microsoft Office Excel 2003中的最大數,任何功能可以利用參數的最大數量爲30,雖然大多數時間比少這個「),但在功能嚮導中輸入over 20 the function cannot be registered

現在,正如你所猜測的那樣,我一直要求添加3個以上的參數。好吧,所以參數計數可以達到23(至少,這個函數不是爲了「人類消費」,而是總是由VBA包裝調用)。

通過使用VC++調試器附加到Excel進程,我在註冊時得到錯誤代碼4,代表xlretInvCount

我確定逗號分隔參數名稱的字符串是shorter than 255 characters。 順便說一句,我使用xlw 4(舊版本,我知道)。

因此,如果限制是30我希望能夠通過

Application.Run("function name", ..... very long list of arguments) 

調用我的功能,但不使用嚮導。麻煩的是,VBA告訴我該功能沒有註冊。

那麼,我該如何正確使用一個函數,它需要20個以上的參數,少於30個?

注:請不要陳述明顯。我知道問題的真正關鍵所在。重構目前是不可能的。

+1

我不確定是否將此視爲重構,但通常可以通過將範圍(其中包含參數)作爲單個參數傳遞來減少參數的數量。邪惡,骯髒的選擇:將參數作爲字符串傳遞並解析字符串 - 尤其是在您通過VBA包裝器調用它之後。 –

+0

這是我正在考慮的後備,但我想知道爲什麼我顯然不能克服只應該是「不具約束力」的限制。 – Francesco

回答

1

既然你通過VBA調用你的函數,你可以直接調用它,甚至不會註冊它,即不使用XLW。

  • 申報C/C++:extern 「C」 int __declspec(dllexport) _stdcall myfunc(double arg1, double* arg2, ...)
  • 申報VBA:Function MyFunc& Lib "C:\myL.dll" Alias "[email protected]" (ByVal arg1 As Double, ByRef arg2 As Double, ...)

的@ 1指的是位置在.DEF文件的功能。

現在你可以調用VBA函數了。請參閱http://aandreasen.wordpress.com/2008/05/05/how-to-create-a-dll-for-ms-excel-vba-with-microsoft-visual-c-2008-command-line-tools/

+0

嘿,那太好了。我會盡快嘗試。函數api期望XlfOper並將它們解開爲本機類型。我希望這不會迫使我只通過應用程序來使用它。跑。現在會閱讀你的鏈接,謝謝你的指針。 – Francesco

+0

我今天只能嘗試這個,而且很有效。不幸的是,xll被寫入接受類型爲XlfOper的參數,它是一個圍繞LPXLOPER的XLW包裝器。這提出了一個有趣的問題,就是如何聲明這個函數(你的例子使用的是原生數據類型,這有點簡單)。也許我會就此提出另一個問題。目前,感謝您提供正確的輸入。 – Francesco

+1

我會使用本機C參數聲明函數,然後在其中創建XlfOper參數。或者(更好):使用本機C參數創建一般函數,並通過展開XlfOper從XLW函數調用該函數。我希望XlfOper的引用在舊函數中不會太深。 –