Запрещено вызывать команду из функции XLL по соображениям безопасности (особенно для доступа к записи ..). В вашем случае Excel запрещает потоку вычислений, который выполняет вашу функцию Xll (A), вызывать вашу зарегистрированную команду (B) и т. Д. «Xlset», потому что в противном случае вы могли бы, например, создать sh Excel, изменив ячейку (с помощью команды ), который может быть одним из аргументов функции (A).
xlSet ведет себя как командно-эквивалентная функция класса 3; то есть она доступна только внутри библиотеки DLL, когда она вызывается из объекта, макроса, меню, панели инструментов, сочетания клавиш или кнопки «Выполнить» в диалоговом окне «Макрос» (доступ к которой осуществляется на вкладке «Вид» на ленте, начиная с Excel 2007, и меню Сервис в более ранних версиях). source
Поэтому, если вы хотите использовать xlset
, вам необходимо: 1) вызвать его из функции, зарегистрированной как макрос, и 2) вы не можете вызвать этот макрос из ваш xll, то есть макрос должен вызываться конечным пользователем или объектной моделью Excel (VBA, VSTO ...).
Что касается ExcelDna, я считаю, что он решает проблему, вызывая макрос (B ) из другого потока, сервера COM, который обращается к объектной модели Excel. В этом случае функция XLL (A) только делегирует вызов потоку, который не ограничен. Но это может быть опасно.
Редактировать:
Я разговаривал с ОП в чате, и оказалось, что он хотел расширить область ячеек с помощью объектной модели Excel , Но это больше не нужно: с осени 2018 года Excel автоматически изменяет размер массива xltypeMulti, возвращаемого UDF ( dynamici c array ).