将Excel工作表或图表嵌入到Word或Powerpoint中时,这是一个非常常见的问题。我在Word和Powerpoint中都看到了这个问题,而且看起来是COM附加到Excel的原因。 COM插件是用C#(.NET)编写的。有关错误对话框,请参阅附加的图像。
我调试了插件并发现了一种非常奇怪的行为。 COM插件中的OnConnection(...),OnDisConnection(...)等方法正常工作,直到我向代码添加事件处理程序。即处理Worksheet_SheetChange,SelectionChange或Excel中可用的任何类似事件。只要我添加一个事件处理程序(虽然我的代码有几个),Word和Powerpoint开始抱怨并且不激活嵌入对象。
在互联网上的一些帖子中,人们被要求删除办公室的防病毒插件(在我的情况下没有),所以这让我相信这个问题与COM插件有些相关主机应用程序激活该对象。
有没有人知道这里发生了什么?PowerPoint Error http://www.freeimagehosting.net/uploads/d687736c66.png
Word Error http://www.freeimagehosting.net/uploads/f72b99bc25.png
2010年6月21日更新
<小时/> 发现当激活嵌入对象时,事件和对ComAddIns集合的更改都会产生问题。我现在使用Excel :: Application :: UserControl属性来检查Excel是否处于嵌入状态,然后跳过任何OnConnection(...)和OnDisconnection(...)代码。
事件问题的一个解决方案是将所有应用程序级事件移动到VBA代码并调用.NET。从而从.NET代码中删除所有事件处理程序。
可能有更多场景,嵌入对象可能无法初始化,因此我选择禁用COM插件,即完全跳过OnConnection(...)和OnDisconnection(...)方法中的代码。
答案 0 :(得分:0)
以下是我为解决这个令人讨厌的问题所做的工作:
删除.NET代码中的所有事件处理程序并依赖于VBA应用程序事件,即不处理Excel :: Application :: Worksheet_Activate(...)事件,而是在VBA模块中处理它们并调用收到活动时加入。 .NET事件处理程序似乎以某种方式破坏了状态。
使用自定义参数中的标志禁用与OnConnection(...)中的插件交互的任何代码。有关标志的详细信息,请参阅以下链接: COM AddIns in Detail
我提到了Excel :: Application :: UserControl属性,但在某些情况下它不可靠。我们需要考虑以下情况,自定义数组参数是OnConnection(...)是最可靠的:
我首选在Excel处于嵌入模式时完全禁用插件。它取决于您在OnConnection(...)中执行的代码以及其他应用程序在执行时如何响应它。必须实施第1点才能解决这个问题。
如果有人对此有更好的解决方案,请告诉我们:)