我應該用什麼樣的標準來決定是否我編寫VBA代碼:在Excel VBA中使用New關鍵字和調用CreateObject有什麼區別?
Set xmlDocument = New MSXML2.DOMDocument
或像這樣:
Set xmlDocument = CreateObject("MSXML2.DOMDocument")
?
我應該用什麼樣的標準來決定是否我編寫VBA代碼:在Excel VBA中使用New關鍵字和調用CreateObject有什麼區別?
Set xmlDocument = New MSXML2.DOMDocument
或像這樣:
Set xmlDocument = CreateObject("MSXML2.DOMDocument")
?
只要變量沒有類型爲對象
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運算符,聲明變量As New和使用CreateObject函數沒有區別。
新要求引用類型庫。而CreateObject使用註冊表。
CreateObject可用於在遠程機器上創建對象。
對於前者,您需要在應用程序中引用類型庫。它通常會使用早期綁定(假設你將變量聲明爲MSXML2.DOMDocument而不是Object,你可能會這麼做),所以通常會更快,並且會給你提供intellisense支持。
後者可用於使用其ProgId創建對象的實例,而不需要類型庫。通常你會使用後期綁定。
如果您有類型庫,並且從早期綁定中受益,通常最好使用「新建」。
喬提到一個重要的VB/VBA功能的功能,我想強調。對於缺乏經驗的VB/VBA程序員來說,這種缺席可能會造成混淆:Intellisense。僅供參考 - 這是幫助自動完成代碼輸入的下拉列表。有一個相關的功能,它的根源在同一個系統中:對象資源管理器。 FYI-在視圖菜單上,在VBA中可通過F2按鍵進行訪問。如果沒有早期綁定(使用'New'關鍵字),則Intellisense和Object Explorer都不會起作用。 – spinjector 2017-07-24 13:26:39
你應該總是使用
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
然後當你切換到後期綁定,你必須改變都行。
另請參見[答案早/晚綁定問題(http://stackoverflow.com/questions/10580/what-are-early-and-late-binding#10581)。 – 2008-10-04 10:13:06