如何从无法注册到函数向导的xll加载项调用函数?

时间:2013-10-11 18:53:26

标签: c++ excel vba excel-2003 xlw

我有一个xll(一个相当复杂的c ++项目)导出一个函数,由于历史原因,它需要大量的参数,并且精确地 20

这是 magic 号码:显然在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 个答案:

答案 0 :(得分:1)

由于你通过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/