Доступ к коду XLL в Excel

Относится к: Excel 2013 | Office 2013 | Visual Studio

Чтобы функции и команды, которые содержит код XLL, были доступны в Microsoft Excel, они:

  • должны быть экспортированы XLL;

  • должны быть зарегистрированы в Excel.

Регистрация функций и команд в Excel

Регистрация указывает Excel о точке входа DLL следующее:

  • является ли она скрытой или, если речь идет о функции, будет ли она отображаться в мастере функций;

  • можно ли будет ее вызвать только с листа макроса XLM или также с обычного листа;

  • если это команда, является ли она функцией листа или эквивалентной функцией листа макроса;

  • каким будет ее имя в операции экспорта XLL/DLL и какое имя следует использовать в Excel.

  • Если это функция:

    • какие типы данных она возвращает и принимает в качестве аргументов;

    • будет ли она возвращать свой результат, изменяя аргумент на месте;

    • является ли она постоянной;

    • является ли она потокобезопасной (поддерживается начиная с Excel 2007);

    • какой текст мастер вставки функций и редактор автозаполнения должны отображать для поддержки при вызове функции;

    • к какой категории функций она должна относиться.

Все это реализуется с помощью функции C API xlfRegister, эквивалентной функции XLM REGISTER.

Вызов функций XLL непосредственно из Excel

После регистрации функции листа макроса и листа XLL можно вызывать из любого расположения, откуда можно вызвать встроенную функцию:

  • из формулы массива или одной ячейки на листе;

  • из формулы массива или одной ячейки на листе макроса;

  • из определения имени;

  • из полей условий и ограничений в диалоговом окне условного форматирования;

  • из других надстроек через функцию C API xlUDF;

  • из Visual Basic для приложений (VBA) через метод Application.Run.

Можно получить ссылку на ячейку или диапазон ячеек вызова в нужной функции с помощью функции C API xlfCaller. Если функция вызывалась из выражения условного форматирования ячейки, все равно возвращается ссылка на связанную ячейку или несколько ячеек, поэтому нельзя предположить, что формула с ячейкой содержит функцию XLL. Если функция вызывалась из пользовательской функции VBA (UDF), xlfCaller также возвращает адрес ячеек, которые вызывали функцию VBA. Дополнительные сведения см. в статье xlfCaller.

Примечание.

Excel также вызывает код функции XLL из диалоговых окон Мастер вставки функции и Замена. Может потребоваться ограничить обычное выполнение вашего кода в случае диалогового окна Вставка аргументов функции, особенно в тех случаях, когда выполнение функции может занять много времени. Чтобы обнаружить, вызывается ли функция из одного из таких диалоговых окон, необходимо реализовать в проекте код, который будет просматривать все открытые окна, чтобы определить, является ли окно переднего плана одним из таких диалоговых окон, и, если да, какое именно.

Вызов команд XLL непосредственно из Excel

После регистрации команды XLL можно вызывать всеми способами, которыми можно вызвать другие пользовательские макросы:

  • посредством связывания с объектом элемента управления, встроенным в лист;

  • из диалогового окна "Выполнить макрос";

  • из пользовательского макроса VBA с использованием метода Application.Run;

  • из настраиваемого элемента меню или панели инструментов;

  • с помощью сочетаний клавиш, заданных при регистрации команды;

  • в качестве команды, которую следует выполнять при обработке указанного события.

Примечание.

Команды XLL являются скрытыми таким образом, что они не отображаются в списке доступных макросов в диалоговых окнах Excel. Но они могут быть введены вручную в поле имени макроса. В таких диалоговых окнах необходимо вводить заданное при регистрации имя, а не имя экспорта DLL.

Приложение Excel обрабатывает все команды XLL, зарегистрированные в нем, как имеющие такой вид:

short WINAPI xll_cmd_name(void)
{
// Function code...
    return 1;
}

Excel игнорирует возвращаемое значение, если оно не было вызвано с листа макросов XLM. Если оно было вызвано так, возвращаемое значение преобразуется в TRUE или FALSE. Поэтому следует обеспечить возвращение 1 при успешном выполнении команды и 0 при ошибке или отмене команды.

Можно получить сведения о том, как команда была вызвана, с помощью функции C API xlfCaller. Дополнительные сведения см. в статье xlfCaller.

Начиная с Excel 2007 пользовательский интерфейс существенно отличается от более ранних версий. В большинстве случаев по-прежнему поддерживаются функции C API, позволяющие выполнять операции добавления и удаления настраиваемых строк меню, меню, вложенных меню, элементов меню, настраиваемых панелей инструментов и кнопок панели инструментов. Тем не менее они не всегда могут обеспечить доступность добавляемого элемента способом, который знаком вашим пользователям. Следует тщательно проверить, является ли добавленная функция по-прежнему доступной, или реализовать пользовательскую настройку под определенную версию. Начиная с Excel 2007 пользовательский интерфейс лучше всего настраивать с использованием модуля управляемого кода, который затем можно тесно связать с вашими командами XLL.

См. также