Вызов функции макроса Excel с помощью API Excel C - PullRequest
3 голосов
/ 08 апреля 2020

Я новичок в разработке XLL и пытаюсь вызвать зарегистрированную функцию как макрос в моем XLL. Я пытаюсь получить доступ для записи в ячейки рядом с моей вызывающей ячейкой.

Функция xlSet, похоже, даст мне возможность это сделать. Но не похоже, что эту функцию можно вызвать из моей функции Xll https://docs.microsoft.com/en-us/office/client-developer/excel/xlset

Из API, похоже, что эту функцию нужно вызывать из макроса. Я пытался использовать функцию xlUDF, чтобы «обмануть» Excel, заставив меня думать, что я запускаю функцию как макрос, но мне не повезло. Функция xlUDF вызывается, но xlSet по-прежнему не работает.

Как бы я вызвал макрос, который может вызывать эту функцию? Кажется, C # / ExcelDna имеет эквивалент:

object xlApp = ExcelDnaUtil.Application;
xlApp.GetType().InvokeMember("Run", BindingFlags.InvokeMethod, null, xlApp, new object[]{macroName});

Большое спасибо заранее!

1 Ответ

1 голос
/ 08 апреля 2020

Запрещено вызывать команду из функции 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 ).

...