2010-01-04 3 views
12

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

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

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

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

ответ

25

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

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

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

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

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

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

Для статей по автоматизации надстроек, см:

Для статей на управляемых COM-надстроек, см:

Для статей, касающихся как COM надстройки и автоматизации надстроек, см:

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

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

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

- Майк

Follow-Up Ответ:

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

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

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

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

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

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

Скажи мне нужно вызвать формулу getcube, которая возвращает куб в номер общественного двойной getcube (двойной а) {вернуть * а * а; }

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

До сих пор я не вижу необходимости реализовывать IDTExtensibility2 на основе того, что вы здесь показываете, вам нужна только стандартная надстройка автоматизации. Для стандартной надстройки надстройки вы должны прочитать Writing user defined functions for Excel in .NET и Writing Custom Excel Worksheet Functions in C#. Для обсуждения того, как реализовать IDTExtensibility2 для управляемой надстройки COM, см. Implementing IDTExtensibility2 in an Automation Add-in.

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

Вы абсолютно могут реализовать IDTExtensibility2 непосредственно в вашей автоматизации надстройку, нет необходимости создавать управляемый COM надстройки для этого. Опять же, см., Implementing IDTExtensibility2 in an Automation Add-in. Однако вы хотите использовать обработку событий против объектной модели Excel. Хотя это можно сделать с помощью надстройки автоматизации, оно является нестандартным и не является той задачей, над которой предназначена надстройка автоматизации. В частности, вы хотите, чтобы пользователь вводил информацию, когда первая надстройка автоматизации загружается; это может быть особенно сложной ситуацией, поэтому я рекомендую вам использовать управляемую надстройку COM для этой задачи. Подробнее об этом см. Excel fails when Automation add-In loads.

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

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

Майк

+0

Спасибо большое. Вещи медленно начали проясняться. Я все еще зацикливаюсь на том, что у меня есть как автоматическое дополнение, так и дополнение com в той же сборке. Можете ли вы объяснить это примером, чтобы я лучше понял? – Sandy

+0

Им не обязательно быть. Каждый из них является отдельным классом. Если вы хотите, вы можете разместить каждый класс надстройки в отдельной сборке, а затем обе сборки ссылаются на третью сборку. В вашем случае, однако, я считаю, что проще всего просто добавить класс надстройки автоматизации и управляемый класс надстройки COM в пределах одной сборки. Следуйте за комментариями о том, как создать управляемую надстройку COM, которая использует мастер. Затем следуйте рекомендациям о том, как создать класс надстройки автоматизации, но добавьте класс надстройки автоматизации в ту же сборку, что и ваша управляемая надстройка COM. Это действительно настолько просто. –

+0

@MikeRosenblum В настоящее время я работаю над проектом надстройки автоматизации Excel и испытываю некоторые проблемы. Мой UDF требует получать данные через веб-службу, поэтому будут проблемы с производительностью. Если я сделаю это синхронно, приложение-клиент Excel замерзнет. Итак, мой вопрос здесь - как мы можем написать UDF, который может вызывать веб-методы ** Асинхронно **? Не могли бы вы дать мне несколько указателей, Майк? Огромное спасибо. – woodykiddy