使用VBA和ActiveX插件时,Excel错误406

本文关键字:Excel 错误 插件 VBA ActiveX 使用 | 更新日期: 2023-09-27 18:17:57

我的Excel插件(XLL插件,称为MyAddIn)是用c#, ExcelDNA, netooffice, VS2010构建的。客户端有另一个插件(让我们称之为B),我猜它是用VBA写的。客户说没有MyAddIn B工作正常。一旦MyAddIn安装,B失败,错误:

错误码:406错误消息:无法从ActiveX DLL、ActiveX控件或属性页在此主机应用程序中显示非模态窗体。

我确实看到了这个Microsoft资源,但我不想只是告诉客户端B插件需要更改。我想做点什么来避免这种情况的发生。

下面是报告的查看问题的步骤:

  1. 当安装B插件时,它不会为Microsoft Excel做任何注册表项。
  2. MyAddin安装时,它为Microsoft Excel创建一个注册表项。
  3. 这里的注册表项基本上告诉插件应该在Excel启动时打开,所以B插件没有启动,Excel正常,MyAddIn正常。
  4. 现在当B插件启动时,它给出如上所示的406错误。
  5. 我们可以忽略这个错误,继续使用B插件;禁用MyAddIn是一种解决方法。
  6. 当启动B插件时,我们看到MyAddInB插件之前先加载,然后得到406错误。
  7. 当我们卸载MyAddIn,这个错误不再遇到,一切工作正常。
  8. 为了消除这个错误,我们尝试改变注册表顺序,使B插件总是在MyAddin之前打开。
    • 这个工作,但这是微软Excel的一个全局变化,这意味着B插件将始终打开,即使我们只启动Excel。这是不希望的,因为B插件不能让用户使用静态数据,因为B插件会实时刷新。这就是B插件没有在注册表设置中创建条目的原因。所以注册表更改不是一个选项。当Excel打开时,我们不能总是打开B插件。

使用VBA和ActiveX插件时,Excel错误406

我没有答案,但这里有一些你可以尝试的方法。

您可以通过执行File | Options并选择Addins选项卡来判断您正在处理的插件类型。

如果事件发生一旦你加载Addin B,这可能意味着你正在调用一个非模态对话框,因为它的状态,但也有一些其他的事情可能会给你类似的错误。

根据您的描述,听起来错误可能是您的插件中的一个对话框,也可能是在其他插件中,它被调用作为插件的一些状态更改的副作用。

要深入了解它,您需要附加一个调试器。你可以将Excel作为你的启动项目,或者稍后附加。在这种情况下,前者可能更容易。

  1. 在Visual Studio中,使用Project | Properties | Debug,选择Start external program,并在Excel中输入完全限定的路径名

  2. 手动加载Addin B给自己错误

  3. 进入调试器,检查调用栈

这通常会(但并不总是)给你很好的线索,让你知道问题在哪里,但这总是第一步。如果它不能提供有用的信息(堆栈信息经常在添加之间的转换中完全丢失),您可能希望在您处理的任何事件中在项目中放置一些断点。即使这样也不是一直有效,但值得一试。

如果我不得不猜测,我会说可能有一些事件处理程序在您的外接程序导致的问题,你可能要做的事情,如改变一个.Show到a '。或者将表单的处理延迟到事件处理程序之外,但这只是一个猜测。