代码之家  ›  专栏  ›  技术社区  ›  Ashley Davis

当ActiveX控件被实例化时,是什么导致了Excel中的Visual Basic运行时错误-2147319765(8002802b)?

  •  4
  • Ashley Davis  · 技术社区  · 15 年前

    我用C++创建了一个ActiveX控件。我使用VisualBasic代码在Excel工作表中实例化控件。我只能运行一次vb脚本,后续运行在尝试访问“activesheet”变量时会导致以下运行时错误:

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

    我正在努力找出导致这个错误的原因,以及如何修复它?

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

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

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

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

    有人能回答我这个问题吗?或者,任何对资源有帮助的建议都将受到赞赏。

    谢谢

    5 回复  |  直到 15 年前
        1
  •  3
  •   Mike Rosenblum    15 年前

    您已经创建了一个对Excel应用程序的“非限定”引用,该引用不能通过使用VB 6.0中不应使用的用于VBA的全局变量来释放。

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

    在您的案例中,问题源于使用“activesheet”全局变量。当使用vba时,这是可以的,但当使用vb 6.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
    

    有关如何一般处理此问题的详细讨论,请参见:

    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 Automation出现错误或意外行为(MSKB 319832) ( http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q319832& )

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

        2
  •  2
  •   Ashley Davis    15 年前

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

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

    这样做的失败意味着您不能通过VisualBasic多次将ActiveX控件插入Excel文档。第二次执行脚本时,将开始获取“自动化错误”。

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

        3
  •  0
  •   Community c0D3l0g1c    7 年前

    我收到了一个不同的信息,但是行为很奇怪,就像这个问题。看看我的问题 here . 在我的例子中,vba codecleaner完成了这个技巧。

        4
  •  0
  •   Toby Allen mercator    15 年前

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

    • 确保可以在其他地方实例化ActiveX控件而不会出现问题。这可能只是ActiveX实例化的问题,而不是Excel问题。

    同样,现在,您应该使用一般的“test.test_control”而不是“test.test_control.1”,但这不是您的问题。

        5
  •  0
  •   Ant    14 年前

    我在手动实现接口但没有事件的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
    }