Ошибка Excel 406 при использовании надстроек VBA и ActiveX.

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

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

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

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

  1. Когда надстройка B установлена, она не делает никаких записей в реестре для Microsoft Excel.
  2. При установке MyAddin в реестре создается запись для Microsoft Excel.
  3. Записи реестра здесь в основном говорят о том, что надстройка должна быть открыта при запуске Excel, поэтому надстройка B не запускается, Excel работает нормально, MyAddIn работает нормально.
  4. Теперь при запуске надстройки B выдает показанную выше ошибку 406.
  5. Мы можем игнорировать ошибку и продолжить работу с надстройкой B; отключение MyAddIn является обходным путем.
  6. При запуске надстройки B мы видим, что сначала загружается надстройка MyAddIn перед надстройкой B, а затем получаем ошибку 406.
  7. Когда мы удаляем MyAddIn, эта ошибка больше не возникает и все работает нормально.
  8. To remove this error, we tried changing the registry order to make the B addin always open before MyAddin.
    • This works, but then this a global change for Microsoft Excel, which means B addin will always open, even when we launch only Excel. This is not desired, as B addin then can't let users work with the static data as the B addin keeps on refreshing real-time. That is the reason the B addin doesn't make an entry in the registry settings. So registry changes are not an option. We can’t always open B addin whenever Excel is open.

person toosensitive    schedule 14.12.2011    source источник
comment
Как упоминалось в сообщении об ошибке, MyAddIn пытается отобразить немодальную форму, что вызывает проблему. Вам нужно выяснить, что это за форма. Также было бы полезно, если бы вы могли опубликовать код.   -  person Tarik    schedule 19.07.2013


Ответы (1)


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

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

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

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

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

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

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

  3. Войдите в отладчик и проверьте стек вызовов.

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

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

person Wade Hatler    schedule 12.05.2014