当ActiveX控件已实例化时,是什么导致Excel中的Visual Basic运行时错误2147319765(8002802b)? < >我用C++创建了一个ActiveX控件。我使用Visual Basic代码在Excel工作表中引用该控件。我只能运行VB脚本一次,在尝试访问“ActiveSheet”变量时,后续运行会导致以下运行时错误: Microsoft Visual Basic Run-time error '-2147319765 (8002802b)': Automation error Element not found

当ActiveX控件已实例化时,是什么导致Excel中的Visual Basic运行时错误2147319765(8002802b)? < >我用C++创建了一个ActiveX控件。我使用Visual Basic代码在Excel工作表中引用该控件。我只能运行VB脚本一次,在尝试访问“ActiveSheet”变量时,后续运行会导致以下运行时错误: Microsoft Visual Basic Run-time error '-2147319765 (8002802b)': Automation error Element not found,c++,vba,activex,excel,C++,Vba,Activex,Excel,我正在尝试找出导致此错误的原因以及如何修复它 作为一个实验,我尝试创建一个由VisualStudio向导生成的简单ActiveX控件(VS2005和2008)。我没有在这个测试用例中添加或修改任何代码。这个简单的测试用例仍然会导致这个错误 系统中的其他ActiveX控件不会从VB代码中导致此错误(例如,我尝试实例化“位图图像”) 这是VB代码(我录制的宏,但手工编码的VB也有相同的问题): 有人能给我一个答案吗?或者,任何指向可能有帮助的资源的指针都将不胜感激 谢谢我收到了一条不同的消息,但行为

我正在尝试找出导致此错误的原因以及如何修复它

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

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

这是VB代码(我录制的宏,但手工编码的VB也有相同的问题):

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


谢谢

我收到了一条不同的消息,但行为很奇怪,就像这个问题一样。看看我的问题。在我的例子中,VBA CodeCleaner成功了。

根据错误描述和猜测,我建议您尝试以下方法

  • 确保您可以在其他地方实例化ActiveX控件而不会出现问题。这可能只是ActiveX实例化的问题,而不是Excel问题
另外,在一个相关的应用程序上,您应该使用常规的“test.test\u control”而不是“test.test\u control.1”,但这不是您的问题。

您创建了一个对Excel应用程序的“非限定”引用,您不能使用VBA的全局变量来发布该引用,而VB6.0中不应使用该变量

这是使用VB6.0的一个不幸的副作用,但这是我所知道的使用VB6的唯一问题,而且很容易解决

本例中的问题源于使用“ActiveSheet”全局变量。在使用VBA时,这是可以的,但在使用VB6.0时,必须避免这种情况,否则将创建无法发布的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
有关如何处理此问题的详细讨论,请参阅:

VB6.0教程-查找和修复不合格的引用 ()

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

Excel自动化第二次代码运行失败(MSKB 178510) ()

在Visual Basic(MSKB 319832)中使用早期绑定时,Office Automation出现错误或意外行为 ()


编辑:请注意,由于某些原因,使用html“a”标记无法处理这些链接。有人可能需要检查解析器?

与Microsoft交谈后,我找到了问题的原因

使用VS 2005/2008向导创建ActiveX控件时,需要选中“选项”页面中的“连接点”复选框。这将添加IConnectionPointContainerMPL作为ATL类的基类,ATL类反过来实现IConnectionPointContainer

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


这个问题的答案很简单,而且很有效,尽管我仍然不确定它实际上与“自动化错误”有什么关系,并且让我想知道为什么错误消息没有更多的信息。

我在手动实现接口但没有事件的UserControl类中遇到了这个错误。本例中的解决方案是为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
}

嗨,迈克,谢谢你的回复。尽管它非常有用,而且您提供的链接信息也非常丰富,但我仍然会遇到同样的错误。请注意,我不能完全使用您的代码示例,因为它创建了一个新的Excel应用程序对象,并且我希望重用当前的应用程序对象。下面是我的新测试代码。Option Explicit Sub Macro1()Dim xlApp As Excel。应用程序集xlApp=GetObject(,“Excel.Application”)xlApp.ActiveSheet.OLEObjects.Add(类类型:=“test.test\u control.1”\,链接:=False,显示图标:=False)。选择Set xlApp=Nothing End SubOk,这种格式不太好。我正在做的是抓取现有的excel对象并使用它访问“ActiveSheet”。然而,我仍然遇到同样的问题。我只能在第一次成功运行脚本。每隔一段时间就会产生一次自动错误。我从未见过在纠正到位后这种错误会持续存在-(这是您代码中控制Excel的唯一点吗?如果不是,那么您应该创建一个新的“Automation Preventics”模块,如下所述:通过插入“Automation Preventics”模块,您将能够在代码中找到任何其他不合格的引用,以便更正它们。(但请阅读这篇文章,文章对此进行了解释。)
[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
}