Как вызвать функцию из надстройки xll, которая не может быть зарегистрирована в мастере функций?

У меня есть xll (довольно сложный проект на c ++), экспортирующий функцию, которая по историческим причинам принимает большое количество аргументов и точно 20.

Это магия число: очевидно, в Excel 2003 существует максимальное количество аргументов: 30 («В Microsoft Office Excel 2003 максимальное количество аргументов, которое может принять любая функция, равно 30, хотя большинство из них принимает меньше, чем это».), но свыше 20 функция не может быть зарегистрирована в мастере функций.

Теперь, как это происходит и, как вы могли догадаться, я должен был добавить Еще 3 аргументы. Итак, количество аргументов увеличивается до 23 (по крайней мере, эта функция не предназначена для «потребления человеком», но всегда вызывается оболочкой VBA).

Присоединяясь к процессу Excel с помощью отладчика VC ++, я получаю при регистрации код ошибки 4, который обозначает xlretInvCount.

Я убедился, что строка имен аргументов разделенных запятыми короче 255 символов.
Кстати, я использую xlw 4 (старая версия, я знаю).

Итак, если предел равен 30, я ожидаю, что смогу вызывать мою функцию через

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

но не использовать мастера. Беда в том, что VBA говорит мне, что функция не зарегистрирована.

Итак, как правильно использовать функцию, которая принимает более 20 аргументов и менее 30?

NB: пожалуйста, воздержитесь от объяснения очевидного. Я знаю, где настоящая суть проблемы. Рефакторинг на данный момент невозможен.

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/

1

Другие решения

Других решений пока нет …