Ошибка Excel 406 при использовании надстроек VBA и ActiveX. - PullRequest
12 голосов
/ 15 декабря 2011

Моя Excel надстройка (XLL AddIn, назовите ее MyAddIn) построена на C #, ExcelDNA, NetOffice, VS2010.У клиента есть еще одно дополнение (назовем его B), я думаю, оно написано на VBA.Клиент говорит, B отлично работает без MyAddIn.После установки MyAddIn происходит сбой B с ошибкой:

Код ошибки: 406 Сообщение об ошибке: немодальные формы не могут отображаться в этом главном приложении из библиотеки ActiveX DLL, элемента управления ActiveX илиСтраница свойств.

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

Вот шаги, о которых сообщается, чтобы увидеть проблему:

  1. Когда установлен надстройка B, она не делает никаких записей в реестре.для Microsoft Excel.
  2. Когда установлен MyAddin, он создает запись в реестре для Microsoft Excel.
  3. Записи реестра здесь в основном говорят о том, что надстройка должна открываться при запуске Excel, поэтому B надстройка не запускается, Excel работает нормально, MyAddIn работает нормально.
  4. Теперь, когда B addin запущен, он выдает ошибку 406., показанную выше.
  5. Мы можем игнорировать ошибку и продолжать работать с B addin;отключение MyAddIn - это обходной путь.
  6. Когда запускается плагин B, мы видим, что сначала загружается MyAddIn перед надстройкой B, а затем появляется ошибка 406.
  7. Когда мы удаляем MyAddIn, эта ошибка больше не встречается и все работает нормально.
  8. Чтобы удалить эту ошибку, мы попытались изменить порядок реестра, чтобы надстройка B всегда была открытадо MyAddin.
    • Это работает, но это глобальное изменение для Microsoft Excel, что означает, что B надстройка будет всегда открываться, даже когда мы запускаем только Excel.Это нежелательно, так как надстройка B не может позволить пользователям работать со статическими данными, поскольку надстройка B продолжает обновлять в режиме реального времени.По этой причине надстройка B не делает запись в настройках реестра.Таким образом, изменения реестра не вариант.Мы не всегда можем открыть B надстройку, когда открыт Excel.

1 Ответ

1 голос
/ 12 мая 2014

У меня нет ответа, но вот несколько вещей, которые вы можете попробовать.

Вы можете сказать, с каким типом Addin вы имеете дело, выполнив File |Выберите и выберите вкладку Addins.

Если событие происходит, как только вы загрузите Addin B, это, вероятно, означает, что вы вызываете немодальное диалоговое окно, как оно указано, но есть несколько других вещей, которые могут вызвать подобные ошибки.

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

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

  1. В Visual Studio используйте Project |Свойства |Отладьте , выберите Запустите внешнюю программу и введите полный путь к Excel.

  2. Загрузите Addin B вручную, чтобы выдать ошибку

  3. Вломитесь в отладчик и изучите стек вызовов.

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

Если бы мне пришлось угадывать, я бы сказал, что, вероятно, в вашей надстройке есть обработчики событий, которые вызывают проблему, и выможет потребоваться сделать что-то вроде замены .Show на `.ShowDialog 'или отложить обработку формы до тех пор, пока не будет обработан обработчик событий, но это только предположение.

...