1

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

这是一个神奇的数字:显然在 Excel 2003 中最多有 30 个参数(“在 Microsoft Office Excel 2003 中,任何函数可以采用的最大参数数量是 30,尽管大多数都少于这个。”),但是超过 20 功能无法注册在功能向导中注册。

现在,正如你可能猜到的那样,我被要求再添加3 个参数。好的,所以参数计数上升到 23(至少,这个函数不是为“人类消费”而设计的,而是总是由 VBA 包装器调用)。

通过使用 VC++ 调试器附加到 Excel 进程,我在注册时收到错误代码 4,它代表xlretInvCount

我已确保逗号分隔的参数名称字符串短于 255 个字符。顺便说一句,我正在使用 xlw 4(我知道旧版本)。

所以,如果限制是 30,我希望能够通过调用我的函数

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

但不要使用向导。麻烦的是VBA告诉我该函数没有注册。

那么,如何正确使用参数超过 20 个且少于 30 个的函数呢?

注意:请不要说显而易见的事情。我知道问题的真正症结在哪里。目前无法进行重构。

4

1 回答 1

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 /

于 2013-10-12T05:55:23.377 回答