如何从无法注册到函数向导的xll加载项调用函数?
我有一个xll(一个相当复杂的c ++项目)导出一个函数,由于历史原因,需要大量的参数,正好20 。
这是一个神奇的数字:显然,在Excel 2003中最多有30个参数(“在Microsoft Office Excel 2003中,任何函数可以使用的参数的最大数量是30,尽pipe大多数less于这个”)。 超过20个function不能在function向导中注册 。
现在,正如你所猜测的,我已经被要求增加3个参数。 好的,所以参数计数可以达到23(至less,这个函数不是为了“人类消耗”,而是总是由VBA包装来调用)。
通过使用VC ++debugging器附加到Excel进程,我在注册时得到错误代码4,代表xlretInvCount 。
我已经确保逗号分隔参数名称的string是短于255个字符 。 顺便说一句,我使用xlw 4(旧版本,我知道)。
所以,如果限制是30我希望能够通过调用我的function
Application.Run("function name", ..... very long list of arguments)
但不使用向导。 麻烦的是,VBA告诉我,该function没有注册。
那么,我该如何正确使用一个花费超过20个参数但less于30个的函数呢?
注意:请不要陈述明显。 我知道问题的真正关键在哪里。 重构目前是不可能的。
既然你通过VBA调用你的函数,你可能直接调用它,甚至没有注册它,即不使用XLW。
- 声明在C / C ++中:
extern “C” int __declspec(dllexport) _stdcall myfunc(double arg1, double* arg2, ...)
- 声明在VBA中:
Function MyFunc& Lib "C:\myL.dll" Alias "_myfunc@1" (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 /