У меня есть 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: пожалуйста, воздержитесь от объяснения очевидного. Я знаю, где настоящая суть проблемы. Рефакторинг на данный момент невозможен.
Поскольку вы вызываете свою функцию через VBA, вы можете вызывать ее напрямую, даже не регистрируя ее, т.е. НЕ ИСПОЛЬЗУЯ XLW.
extern “C” int __declspec(dllexport) _stdcall myfunc(double arg1, double* arg2, ...)
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/
Других решений пока нет …