【问题标题】:Excel Error 406 when using both VBA and ActiveX addins.同时使用 VBA 和 ActiveX 插件时出现 Excel 错误 406。
【发布时间】:2012-01-20 16:01:06
【问题描述】:

我的Excel 插件(XLL 插件,叫它MyAddIn)是用 C#、ExcelDNA、NetOffice、VS2010 构建的。客户端有另一个插件(我们称之为B),我猜它是用VBA编写的。 客户说B 没有MyAddIn 可以正常工作。一旦安装了MyAddInB 就会失败并出现错误:

错误代码:406 错误消息:无法通过 ActiveX DLL、ActiveX 控件或属性页在此宿主应用程序中显示非模态表单。

我确实看到了this Microsoft resource,但我不想只是告诉客户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 之前打开。
    • 这可行,但这是 Microsoft Excel 的全局更改,这意味着 B 插件将始终打开,即使我们仅启动 Excel。这是不希望的,因为B 插件不能让用户使用静态数据,因为B 插件会不断刷新实时。这就是B 插件不在注册表设置中创建条目的原因。因此,注册表更改不是一种选择。当Excel 打开时,我们不能总是打开B 插件。

【问题讨论】:

  • 如错误消息中所述,MyAddIn 试图显示非模态表单,从而导致问题。你需要弄清楚它是什么形式。如果您可以发布一些代码也会有所帮助。

标签: c# excel excel-addins activex-exe vba


【解决方案1】:

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

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

如果事件在您加载 Addin B 时立即发生,这可能意味着您正在调用它所声明的非模态对话框,但还有一些其他事情可能会给您带来类似的错误。

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

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

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

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

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

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

如果我不得不猜测,我会说您的加载项中可能有一些导致问题的事件处理程序,并且您可能需要执行一些操作,例如将 .Show 更改为 `.ShowDialog',或推迟表单的处理直到事件处理程序之外,但这只是一个猜测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多