使用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
插件需要更改。我想做点什么来避免这种情况的发生。
下面是报告的查看问题的步骤:
- 当安装B插件时,它不会为Microsoft
Excel
做任何注册表项。 - 当
MyAddin
安装时,它为MicrosoftExcel
创建一个注册表项。 - 这里的注册表项基本上告诉插件应该在
Excel
启动时打开,所以B
插件没有启动,Excel
正常,MyAddIn
正常。 - 现在当
B
插件启动时,它给出如上所示的406错误。 - 我们可以忽略这个错误,继续使用
B
插件;禁用MyAddIn
是一种解决方法。 - 当启动
B
插件时,我们看到MyAddIn
在B
插件之前先加载,然后得到406错误。 - 当我们卸载
MyAddIn
,这个错误不再遇到,一切工作正常。 为了消除这个错误,我们尝试改变注册表顺序,使 - 这个工作,但这是微软
Excel
的一个全局变化,这意味着B
插件将始终打开,即使我们只启动Excel
。这是不希望的,因为B
插件不能让用户使用静态数据,因为B
插件会实时刷新。这就是B
插件没有在注册表设置中创建条目的原因。所以注册表更改不是一个选项。当Excel
打开时,我们不能总是打开B
插件。
B
插件总是在MyAddin
之前打开。我没有答案,但这里有一些你可以尝试的方法。
您可以通过执行File | Options并选择Addins选项卡来判断您正在处理的插件类型。
如果事件发生一旦你加载Addin B
,这可能意味着你正在调用一个非模态对话框,因为它的状态,但也有一些其他的事情可能会给你类似的错误。
根据您的描述,听起来错误可能是您的插件中的一个对话框,也可能是在其他插件中,它被调用作为插件的一些状态更改的副作用。
要深入了解它,您需要附加一个调试器。你可以将Excel作为你的启动项目,或者稍后附加。在这种情况下,前者可能更容易。
-
在Visual Studio中,使用Project | Properties | Debug,选择Start external program,并在Excel中输入完全限定的路径名
-
手动加载
Addin B
给自己错误 -
进入调试器,检查调用栈
这通常会(但并不总是)给你很好的线索,让你知道问题在哪里,但这总是第一步。如果它不能提供有用的信息(堆栈信息经常在添加之间的转换中完全丢失),您可能希望在您处理的任何事件中在项目中放置一些断点。即使这样也不是一直有效,但值得一试。
如果我不得不猜测,我会说可能有一些事件处理程序在您的外接程序导致的问题,你可能要做的事情,如改变一个.Show
到a '。或者将表单的处理延迟到事件处理程序之外,但这只是一个猜测。