使用VBA和ActiveX插件时出现Excel错误406.

too*_*ive 12 c# vba excel-vba activex-exe excel-addins

我的Excel插件(XLL AddIn,称之为MyAddIn)是使用C#,ExcelDNA,NetOffice,VS2010构建的.客户端有另一个插件(我们称之为B),我想它是用VBA编写的.客户说B没有工作正常MyAddIn.一旦MyAddIn安装,B失败并出现错误:

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

我确实看到了这个Microsoft资源,但我不想告诉客户端Baddin需要改变.我想做点什么来避免这种情况发生在我身边.

以下是报告此问题的步骤:

  1. 安装B addin时,它不会为Microsoft创建任何注册表项Excel.
  2. MyAddin安装时,它使微软的一个注册表项Excel.
  3. 这里的注册表项基本上告诉addin应该在启动时打开Excel,所以Baddin没有启动,Excel工作正常,MyAddIn工作正常.
  4. 现在,当Baddin启动时,它会显示上面显示的406错误.
  5. 我们可以忽略错误并继续使用B插件; 禁用MyAddIn是解决方法.
  6. Baddin启动时,我们看到MyAddInBaddin 之前首先加载,然后得到406错误.
  7. 卸载时MyAddIn,不再遇到此错误,一切正常.
  8. 要删除此错误,我们尝试更改注册表顺序以使Baddin始终打开MyAddin.
    • 这是有效的,但这对微软Excel来说是一个全球变化,这意味着B即使我们只推出,插件也会一直打开Excel.这是B不可取的,因为addin然后不能让用户使用静态数据,因为Baddin保持实时刷新.这就是Baddin不在注册表设置中输入的原因.因此,注册表更改不是一种选择.B无论何时Excel打开,我们都无法打开插件.

Wad*_*ler 1

我没有答案,但您可以尝试以下几件事。

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

如果该事件在您加载后立即发生Addin B,则可能意味着您正在调用一个非模式对话框,但还有一些其他情况可能会给您带来类似的错误。

根据您的描述,听起来错误可能是您的插件中的对话框,也可能是其他插件中的,并且它被称为您的插件所做的某些状态更改的副作用。

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

  1. 在 Visual Studio 中,使用项目 | 属性 | 调试,选择启动外部程序并输入 Excel 的完全限定路径名。

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

  3. 进入调试器并检查调用堆栈。

这通常会但并不总是为您提供有关问题所在的良好线索,但这始终是第一步。如果它没有为您提供有用的信息(堆栈信息经常在插件之间的转换中完全丢失),您可能需要在项目中处理的任何事件中放置一些断点。即使这并不总是可靠地工作,但值得一试。

如果我不得不猜测,我会说您的外接程序中可能有一些事件处理程序导致了问题,并且您可能必须执行一些操作,例如将 a 更改.Show为“.ShowDialog”,或者推迟表单的处理,直到在事件处理程序之外,但这只是一个猜测。