如何从无法注册到函数向导的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 /