在 Excel VBA 中使用 New 关键字和调用 CreateObject 有啥区别?

Posted

技术标签:

【中文标题】在 Excel VBA 中使用 New 关键字和调用 CreateObject 有啥区别?【英文标题】:What are the differences between using the New keyword and calling CreateObject in Excel VBA?在 Excel VBA 中使用 New 关键字和调用 CreateObject 有什么区别? 【发布时间】:2010-09-15 06:22:45 【问题描述】:

我应该使用什么标准来决定是否编写这样的 VBA 代码:

Set xmlDocument = New MSXML2.DOMDocument

或者像这样:

Set xmlDocument = CreateObject("MSXML2.DOMDocument")

?

【问题讨论】:

另见answer to the early/late binding question。 【参考方案1】:

只要变量不是对象类型

Dim xmlDocument as MSXML2.DOMDocument
Set xmlDocument = CreateObject("MSXML2.DOMDocument")

相同
Dim xmlDocument as MSXML2.DOMDocument
Set xmlDocument = New MSXML2.DOMDocument

两者都使用早期绑定。而

Dim xmlDocument as Object
Set xmlDocument = CreateObject("MSXML2.DOMDocument")

使用后期绑定。请参阅 MSDN here。

当您创建外部提供的对象时,New 运算符、将变量声明为 New 和使用 CreateObject 函数之间没有区别。

New 要求引用类型库。而 CreateObject 使用注册表。

CreateObject 可用于在远程机器上创建对象。

【讨论】:

【参考方案2】:

你应该总是使用

Set xmlDocument = CreateObject("MSXML2.DOMDocument")

这与绑定问题无关。只有声明决定了绑定。

仅使用CreateObject 可以更轻松地在早期绑定和后期绑定之间切换,因为您只需更改声明行。

换句话说,如果你这样写:

Dim xmlDocument As MSXML2.DOMDocument Set xmlDocument = CreateObject("MSXML2.DOMDocument")

然后,要切换到后期绑定,您只需将第一行更改为As Object

如果你这样写:

Dim xmlDocument As MSXML2.DOMDocument Set xmlDocument = New MSXML2.DOMDocument

那么当你切换到后期绑定时,你必须改变这两行。

【讨论】:

【参考方案3】:

对于前者,您需要在应用程序中引用类型库。它通常会使用早期绑定(假设您将变量声明为 MSXML2.DOMDocument 而不是 Object,您可能会这样做),因此通常会更快并为您提供智能感知支持。

后者可用于使用其 ProgId 创建对象的实例,而无需类型库。通常你会使用后期绑定。

如果您有类型库,通常最好使用“As New”,并从早期绑定中受益。

【讨论】:

Joe 提到了我想强调的一个重要的 VB/VBA 特性。对于经验不足的 VB/VBA 程序员来说,它的缺席可能会造成混淆:Intellisense。仅供参考 - 这是帮助在键入代码时自动完成代码的下拉列表。有一个相关功能源于同一系统:对象资源管理器。仅供参考 - 在视图菜单和 VBA 中可以通过 F2 按键访问。如果没有早期绑定(使用“New”关键字),Intellisense 和对象资源管理器都不会工作。

以上是关于在 Excel VBA 中使用 New 关键字和调用 CreateObject 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL VBA 事件的问题。

在excel中如何使用vba实现将sql的数据快速写入excel

Excel vba 多个条件查询应该怎么做,可以用find方法吗?

如何用excel vba按关键字选择性的遍历文件夹搜索文件?

VBA 收集 Word关键字批量处理-Excel版

2.Excel VBA术语