在ActiveX控件已经实例化的情况下,Excel中导致Visual Basic运行时错误-2147319765(8002802b)的原因是什么?

我用C ++创build了一个ActiveX控件。 我使用Visual Basic代码来实例化Excel工作表中的控件。 我只能运行一次VB脚本,当尝试访问“ActiveSheet”variables时,后续运行会导致以下运行时错误:

Microsoft Visual Basic Run-time error '-2147319765 (8002802b)': Automation error Element not found 

我正在努力解决是什么原因导致这个错误,我该如何解决它?

作为一个实验,我尝试创build一个由Visual Studio向导生成的简单ActiveX控件(在VS 2005&2008中)。 我没有在这个testing用例中添加或修改任何代码。 简单的testing用例仍然会导致这个错误。

系统中的其他ActiveX控件不会导致此错误(例如,我尝试从VB代码中实例化“位图图像”)。

这是VB代码(我logging的一个macros,但手动编码的VB有相同的问题):

 Sub Macro1() ActiveSheet.OLEObjects.Add(ClassType:="test.test_control.1" _ , Link:=False, DisplayAsIcon:=False).Select End Sub 

任何人都可以给我一个答案吗? 或者任何指向可能有帮助的资源指针将不胜感激。

谢谢

您已经创build了一个“不合格”的Excel应用程序的引用,通过利用VBA中不应该在VB 6.0中使用的全局variables不能释放。

这是使用VB 6.0的一个不幸的副作用,但这是我知道使用VB6的唯一问题,并且很容易修复。

你的情况的问题源于使用“ActiveSheet”全局variables。 使用VBA时,这很好,但使用VB 6.0时,必须避免这种情况,否则您将创build一个无法释放的Excel应用程序。 这种方法在第一次运行的时候会运行良好,但是第二次运行时会导致各种未定义的行为。

在你的例子中,代码应该这样做:

 Sub Macro1() Dim xlApp As Excel.Application Set xlApp = New Excel.Application xlApp.ActiveSheet.OLEObjects.Add(ClassType:="test.test_control.1" _ , Link:=False, DisplayAsIcon:=False).Select ' Then when done: xlApp.Quit() xlApp = Nothing End Sub 

有关如何处理这个问题的详细讨论,请参阅:

VB 6.0教程 – 查找和修复不合格的参考文献( http://www.xtremevbtalk.com/showthread.php?p=900556#post900556

有关此问题的Microsoft文档,请参阅:

Excel自动化失败第二次代码运行(MSKB 178510)( http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q178/5/ 10.asp )

在Visual Basic中使用早期绑定时,Office自动出现错误或意外的行为(MSKB 319832)( http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q319832& )

编辑请注意,使用html'a'标签由于某些原因不能使用这些链接。 有人可能需要查看parsing器?

在与微软交谈之后,我发现了我遇到的问题的原因。

使用VS 2005/2008向导创buildActiveX控件时,需要在“选项”页面中勾选“连接点”checkbox。 除此之外,还增加了IConnectionPointContainerImpl作为ATL类的基类,后者又实现了IConnectionPointContainer。

不这样做意味着您不能通过Visual Basic多次将ActiveX控件插入Excel文档。 第二次执行该脚本时,您将开始出现“自动化错误”。

这个问题的答案很简单,而且很有效,尽pipe我仍然不确定它是如何与“自动化错误”相关联的,并且让我想知道为什么错误信息没有更多的信息。

我得到了一个不同的信息,但行为很奇怪,就像这个问题一样。 看看我的问题在这里 。 在我的情况下,VBA CodeCleaner的伎俩。

从错误的描述和猜测有点我build议你尝试以下。

  • 确保你可以在别处实例化你的ActiveX控件。 这可能只是实例化ActiveX而不是Excel问题的一个问题。

另外在现在相关,你应该使用通用的“test.test_control”而不是“test.test_control.1”,但这不是你的问题在这里。

我有这个UserControl类手动实现接口,但没有事件的错误。 在这种情况下,解决scheme是为ComSourceInterfaces属性声明一个空接口:

 [ComVisible( true )] [Guid( "your-guid-here" )] [ProgId( "progid-here" )] [ComDefaultInterface( typeof( IMyClass ) )] [ComSourceInterfaces( typeof( IMyClassEvents ) )] [ClassInterface( ClassInterfaceType.None )] public partial class ExcelMap : UserControl, IMyClass { //implementation here } [ComVisible( true )] [Guid( "your-2nd-guid" )] [InterfaceType( ComInterfaceType.InterfaceIsDual )] public interface IMyClass { //whatever things you need to define here } [ComVisible( true )] [Guid( "your-3rd-guid" )] [InterfaceType( ComInterfaceType.InterfaceIsDual )] public interface IMyClassEvents { //empty interface to avoid Automation errors //you can define events here in the normal way, but it's not necessary }