【问题标题】:VBA CreateObject("MSXML2.DOMDocument60") throws an Error 429VBA CreateObject("MSXML2.DOMDocument60") 抛出错误 429
【发布时间】:2016-05-05 09:00:05
【问题描述】:

我在使用 CreateObject() 声明新对象时遇到问题

Sub A()
    Dim x

    'This works
    Set x = CreateObject("Scripting.FileSystemObject")
    Set x = Nothing

    'This throws an error 429 "Active component cannot create object."
    Set x = CreateObject("MSXML2.DOMDocument60")
    Set x = Nothing

    'The only way I can create object is to add the reference using GUID
    Dim y As MSXML2.DOMDocument60
    Set y = New MSXML2.DOMDocument60
    Set y = Nothing
    'This works like a charm

End Sub

我不明白为什么“脚本”有效而“MSXML2”无效。

我在 Windows 7 64 位上使用 MS Access 2010 32 位。

【问题讨论】:

    标签: ms-access vba ms-access-2010 msxml


    【解决方案1】:

    在使用后期绑定时,您并不总是使用相同的名称。 ActiveX 对象需要使用OLE Programmatic Identifier。

    改成这样:

    Set x = CreateObject("MSXML2.DOMDocument.6.0")
    

    来自MSDN文章Building MSXML Applications:

    当您使用脚本语言时,您可以通过其 ProgID 来识别控件,这是一种更易于人类阅读的表单。 ProgID 的一个示例是Msxml2.DOMDocument.6.0。


    【讨论】:

    • 应该指出的是,您应该尽可能使用早期绑定:Set x = New MSXML2.DOMDocument60 -- 这样潜在的错误将在编译时而不是在运行时发生。为此,您必须添加对 Microsoft XML, v6.0 的引用(工具 --> 引用)
    • 我根据 MacroMan 的回答做了一些研究,发现一篇很棒的文章进一步解释了我的问题。 msdn.microsoft.com/en-us/library/ms753804%28v=vs.85%29.aspx
    • @Combinatix 很好的发现 - 我已更新我的答案以包含该文章中的信息。
    • @Leviathan 在大多数情况下(例如这个)是正确的 - 但是使用后期绑定是有正当理由的,例如当您不知道哪个版本时为另一个办公应用程序编写代码最终用户将使用。这适用于任何已安装的版本,而不是设置为特定版本的引用。
    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多