Подтвердить что ты не робот

Расширение надстройки и надстройка COM

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

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

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

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

4b9b3361

Ответ 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, в классе, хранящемся в той же сборке.

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

- Майк

Последующий ответ:

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

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

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

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

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

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

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

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

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

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

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

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

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

Mike