【问题标题】:Error message "ActiveX component can't create object" appears for all objects所有对象都出现错误消息“ActiveX 组件无法创建对象”
【发布时间】:2019-09-06 18:57:00
【问题描述】:

我无法在我尝试编写的 Excel 宏中创建任何对象。最初我尝试使用 MSXML2.DOMDocument60,但是,我意识到我无法让 ActiveX 创建任何对象。例如,对于这行代码,我得到了相同的错误(Run-time 429 'ActiveX component can't create object'):

Dim ExcelSheet As Object
Set ExcelSheet = CreateObject("Excel.Sheet")

显然,因为我在 excel 中,程序安装正确,它应该可以访问它。我已经为此检查了其他几个 Stackoverflow 页面。引用似乎不是问题,我无法想象上面的简单代码由于缺少 dll 而无法工作,因为我又已经在 Excel 中了。

我的计算机上是否有可能阻止此操作的安全功能?

同样,我的问题不在于上面的代码。这只是表明 Create 对象不起作用的一种简单方法。

我的主要目标是让以下工作: 将 objXML 调暗为 MSXML2.DOMDocument60 设置 objXML = CreateObject("MSXML2.DOMDocument60")

我已经确认我有正确的参考并重新注册了 Dll。

【问题讨论】:

  • Excel 工作表对象要求您“附加”到现有工作表,无论它是工作簿中已经存在的工作表还是您新创建的工作表。所以使用类似Dim thisWS as Worksheet; Set thisWS = ThisWorkbook.Sheets("Sheet1")
  • 嗨,彼得。谢谢您的答复。不幸的是,这并没有解决我的问题。上面的代码只是一个例子。真正的问题是,每当我使用“CreateObject”时,我似乎都会被阻止,我不知道为什么。我在尝试为 word 文档创建对象时遇到了同样的问题: Dim oWordApp As Word.Application Set oWordApp = CreateObject("Word.Application")
  • 您使用的是 Mac 吗?
  • 嗨蒂姆。不,我使用的是 64 位操作系统的 Windows 10 机器。我使用的 excel 版本是 Microsoft 2016,它是 32 位的。
  • 如果您在 Excel 中,为什么要后期绑定 ExcelSheet?类型库已经被引用了,你有没有试过看看当你做Set ExcelSheet = New Excel.Worksheet时会发生什么?

标签: excel vba


【解决方案1】:

我找到了我正在寻找的答案。我的公司锁定了 C 驱动器和另一个网络驱动器,当 Excel 工作表保存到这些位置中的任何一个时,这会阻止 CreateObject 工作。通过将 Excel 表保存到我的桌面,我可以让它工作。

【讨论】:

    【解决方案2】:

    Excel 对象模型中没有具有Excel.Sheet progID 的类。您的意思可能是Excel.Worksheet,但这也不起作用,也不是因为CreateObject 或任何一种晦涩难懂的安全功能。

    简单地说,并不是所有的类/类型都是可创建的:在 Excel 类型库中 Application 是,仅此而已:需要在对象模型中使用工厂创建其他所有内容该 API 提供的方法。

    换句话说,您创建Excel.Worksheet 的唯一方法是 Excel 为您创建它。

    Set excelSheet = Excel.Application.ActiveWorkbook.Worksheets.Add
    

    Excel.Workbook 相同:

    Set excelBook = Excel.Application.Workbooks.Add
    

    还有其他方法(例如,复制现有的 Worksheet 而不指定 Target 参数将创建一个新的 Workbook,其中包含该源 Worksheet 的副本),但规则如果您不能 New 在引用的类型库中创建一个类,那么根据经验,CreateObject 几乎没有机会做得更好(除非类型注册明确阻止了早期绑定的使用)。


    问题已被编辑,但答案是:不要使用 CreateObject 创建已解决且随时可用的类的实例。

    Set objXml = New MSXML2.DOMDocument60 'works fine
    

    如果您真的想要使用CreateObject,那么您需要使用注册表中存在的 progID 字符串。

    Set objXml = CreateObject("MSXML2.DOMDocument60") ' blows up on my machine as well
    Set objXml = CreateObject("MSXML2.DOMDocument") ' works fine
    

    但是使用CreateObject 创建一个编译器已经知道的类的实例是一种非常非常迂回的方法。

    【讨论】:

    • 嗨,Mathieu,“新”关键字方法确实对我有用。不过,CreateObject 的两个例子都不适合我。我知道我已经让它在其他计算机上工作,并且基于其他示例,该方法确实适用于其他人。我真的很想知道为什么它不适用于我当前的机器,但现在我将继续使用“新建”方法。感谢您的帮助。
    • CreateObject 的工作原理是,它采用提供的字符串 ProgID(或类 GUID),在注册表中找到 ProgID/GUID,在磁盘上找到类型库,找到类型,在里面库,创建它的一个实例,并将其生成给调用者。如果它在其他地方工作但不在您的机器上,您可能需要修复/重新安装您正在使用的任何已安装的库。早期绑定会在编译时加载类型库并绑定类型和成员调用(因此是“eary”) - 尽可能选择早期绑定。
    猜你喜欢
    • 2014-06-09
    • 2011-07-24
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多