Надстройка автоматизации и надстройка COM

Я новичок в программировании надстроек, и мне нужна помощь в следующем сценарии:

У меня есть надстройка автоматизации C # Excel, которая вызывает несколько UDFs. Я хочу выполнить проверку имени пользователя и пароля во время загрузки надстройки автоматизации, для которой при загрузке надстройки должен появиться экран, на котором пользователь может ввести свои данные. Как это можно сделать с помощью надстройки автоматизации?

Как вообще можно выполнять обработку событий с помощью надстроек автоматизации? Я хочу, чтобы некоторые вычисления выполнялись, когда пользователь нажимает F9 для вычисления формулы UDF в некоторых ячейках.

Есть ли статьи, объясняющие обработку событий в надстройках автоматизации?


person Sandy    schedule 04.01.2010    source источник


Ответы (1)


Надстройки автоматизации, как правило, не предназначены для обработки таких функций. Ваша надстройка может реализовать IDTExtensibility2, чтобы получить ссылку на объект Excel.Application, в котором работает ваша надстройка. Отсюда вы можете получить доступ ко всем событиям класса Excel.Application. Но надстройка автоматизации обычно не предназначена для обработки событий объектной модели Excel - она ​​предназначена только для поддержки пользовательских функций (UDF).

Я хочу выполнить проверку имени пользователя и пароля во время загрузки надстройки автоматизации, для чего при загрузке надстройки должен появиться экран, на котором пользователь может ввести свои данные. Как это можно сделать с помощью надстройки автоматизации?

Остерегайтесь попыток предпринять какие-либо действия при первой загрузке надстройки автоматизации. Надстройка автоматизации загружается по запросу, что означает, что она не загружается, пока она не понадобится Excel. Обычно он загружается, когда пользователь начинает вводить первую определяемую пользователем функцию (UDF) вашей надстройки автоматизации в ячейку. Проблема в том, что большинство программных команд не будут выполнены при попытке выполнения, пока пользователь все еще редактирует ячейку. Следовательно, если вы попытаетесь предпринять такие действия при первой загрузке надстройки, весьма вероятно, что она загружается, когда Excel находится в режиме, который не позволяет вашему коду безопасно выполняться. (Подробнее об этом см .: Ошибка Excel при загрузке надстройки автоматизации.)

Чтобы обойти эту проблему, вместо этого можно использовать управляемую надстройку COM, которая предназначена для обработки событий объектной модели Excel. Ваша управляемая надстройка COM может даже загрузить вашу надстройку автоматизации, если вы захотите; либо управляемый класс надстройки COM и класс надстройки автоматизации могут находиться в одной сборке, и в этом случае они могут взаимодействовать напрямую.

Как вообще можно выполнять обработку событий с помощью надстроек автоматизации? Я хочу, чтобы некоторые вычисления выполнялись, когда пользователь нажимает F9 для вычисления формулы udf в некоторых ячейках.

Обнаружение нажатия клавиши F9 может быть выполнено путем подписки на событие «Excel.Application.SheetCalculate», которое будет срабатывать каждый раз, когда любой рабочий лист завершит вычисление. Расчет в этом случае может быть запущен по любой причине, а не только по нажатию клавиши F9. Если вы хотите специально перехватить клавишу F9, вам нужно будет использовать обратный вызов Application.OnKey, который доступен только через VBA. Однако вы можете предоставить класс в своем проекте для COM и вызвать его из надстройки VBA, которая вызывается из события Application.OnKey.

Статьи о надстройках автоматизации см .:

Статьи об управляемых надстройках COM см .:

Статьи о надстройках COM и надстройках автоматизации см .:

Статьи, в которых обсуждается использование надстройки VBA, которая вызывает ваше управляемое приложение, см. В следующих статьях:

Я знаю, что это нужно переварить, но, надеюсь, это поможет вам в этом. В целом, я бы порекомендовал управляемую надстройку COM для обработки функций вашего пользовательского интерфейса. Данные, сохраненные управляемой надстройкой COM, можно было бы легко использовать совместно с надстройкой автоматизации, либо если обе надстройки ссылаются на общую сборку, либо имея как управляемый класс надстройки COM, так и надстройку автоматизации. в классе проводится в рамках одного собрания.

Я надеюсь, что это поможет, и, пожалуйста, спросите, не хотите ли вы, чтобы я уточнить что-нибудь еще.

- Майк

Дополнительный ответ:

Большое спасибо за ссылки и указатели. Я прошел по ссылкам и четко представляю, что нужно делать. :)

Рад, что это помогло. :) Читаю много, предлагаю распечатать и все прочитать. Вы хотите сделать что-то достаточно продвинутое, поэтому чем больше вы знаете о теме, тем лучше для вас будет.

Если я использую надстройку на основе COM для обработки событий Excel, как мне включить свои функции UDF?

Управляемая надстройка COM не может предоставлять функции UDF. Для этого вам все равно понадобится надстройка автоматизации. Однако ваш управляемый класс надстройки COM и ваш класс надстройки автоматизации могут находиться в одной сборке, если хотите. Таким образом, ваша надстройка COM может запрашивать у пользователя необходимую информацию, и эти значения будут доступны надстройке автоматизации при запуске внутри нее пользовательских функций.

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

Пользовательские функции, предоставляемые вашей надстройкой автоматизации, будут автоматически включены в мастер «Вставить функцию» в категорию, соответствующую имени вашей надстройки автоматизации. Однако описание не будет автоматически включать столько информации, сколько предоставляется для встроенных функций Excel. Функциональность по умолчанию обычно хороша, но если вы хотите предоставить более полную информацию для мастера «Вставить функцию», это сложная тема сама по себе. См .: Excel 2007 UDF: как добавить описание функции, помощь аргумента.

Скажем, мне нужно вызвать формулу getcube, которая возвращает куб числа public double getcube (double a) {return a * a * a; }

Когда моя надстройка использует как настраиваемый интерфейс, определяющий мои UDF, так и IDTExtensibility2, как мне справиться с таким случаем? Не могли бы вы объяснить этот случай на примере?

Пока я не вижу необходимости внедрять IDTExtensibility2 на основе того, что вы здесь показываете, вам нужна только стандартная надстройка автоматизации. Для стандартной надстройки автоматизации вы должны прочитать Запись, определяемая пользователем функции для Excel в .NET и Написание пользовательских функций рабочего листа Excel на C #. Для обсуждения того, как реализовать IDTExtensibility2 для управляемой надстройки COM, см. Реализация IDTExtensibility2 в надстройке автоматизации.

Есть ли способ просто реализовать IDTExtensibility2 в надстройке автоматизации, чтобы получить доступ к объекту Excel.Application, или мне следует создать для него отдельную надстройку COM?

Вы абсолютно можете реализовать IDTExtensibility2 непосредственно в своей надстройке автоматизации, для этого нет необходимости создавать управляемую надстройку COM. Опять же, см. Реализация IDTExtensibility2 в надстройке автоматизации . Однако вы хотите использовать обработку событий для объектной модели Excel. Хотя это можно сделать с помощью надстройки автоматизации, это нестандартно и не является той задачей, для которой надстройка автоматизации предназначена. В частности, вы хотите, чтобы пользователь вводил информацию при первой загрузке надстройки автоматизации; это может быть особенно сложной ситуацией, поэтому я рекомендую вам использовать управляемую надстройку COM для этой задачи. Подробнее об этом см. В разделе Ошибка Excel при загрузке надстройки автоматизации.

Чтобы уточнить, управляемые надстройки COM и надстройки автоматизации - это просто классы, которые были сделаны видимыми для COM и правильно зарегистрированы. Нет причин, по которым эти два класса не могут существовать в одной сборке. И поскольку кажется, что вы хотите, чтобы ваша функциональность включала как UDF, так и обработку событий объектной модели Excel, единая сборка, включающая как управляемую надстройку COM, так и надстройку автоматизации, позволит вам обрабатывать все функции, которые вы ищете. так, как ожидает Excel.

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

Майк

person Mike Rosenblum    schedule 04.01.2010
comment
Большое спасибо. Вещи постепенно начали проясняться. Я все еще застрял в части наличия и моего надстройки автоматизации, и надстройки com в одной сборке. Не могли бы вы объяснить это на примере, чтобы я лучше понял? - person Sandy; 07.01.2010
comment
Они не должны быть такими. Каждый - отдельный класс. При желании можно поместить каждый класс надстройки в отдельную сборку, а затем обе сборки будут ссылаться на третью сборку. В вашем случае, однако, я думаю, что проще всего просто поместить и класс надстройки автоматизации, и класс управляемой надстройки COM в одной сборке. Следуйте описаниям создания управляемой надстройки COM, в которой используется мастер. Затем следуйте описанию того, как создать класс надстройки автоматизации, но поместите свой класс надстройки автоматизации в ту же сборку, что и управляемая надстройка COM. Это действительно так просто. - person Mike Rosenblum; 07.01.2010
comment
@MikeRosenblum В настоящее время я работаю над проектом надстройки автоматизации Excel, и у меня возникли некоторые проблемы. Мой UDF требует получения данных через веб-службу, поэтому могут возникнуть проблемы с производительностью. Если я сделаю это синхронно, клиентское приложение Excel зависнет. Итак, мой вопрос: как мы можем написать UDF, который может вызывать веб-методы асинхронно? Не могли бы вы дать мне несколько советов, Майк? Большое спасибо. - person woodykiddy; 20.09.2011