Dim d as Dictionary
Set d = New Dictionary
表示聲明了壹個Dictionary類型的對象型變量,並且創建了壹個Dictionary對象的實例,可以通過d這個變量來操控。
Set d = CreateObject("Scripting.Dictionary"),如果這句話出現在Dim d as New Dictionary後面,那麽其實做了兩件事。
首先,在Dim d as New Dictionary這句話裏面創建的Dictionary對象不再指派到變量d上,至於這個對象現在處境如何,我們完全交給VBA來安排,不管。
其次,通過CreateObject函數創建了壹個Scripting類型庫下的Dictionary類,然後讓d來操控這個類。
需要指出的是,這段代碼寫的是有問題的。因為在執行了CreateObject函數後,第壹句話中創建的Dictionary類完全失去了作用,變成了壹個遊蕩者的幽靈,妳沒辦法重新讓這個類綁定到變量上,又沒辦法完全消除這個類,只能指望著VBA本身來接受這個爛攤子。也就是說,這兩句代碼導致了多余對象實例的創建。
不過,更復雜的是,妳現在有兩個版本的Office,就有兩個版本的VBA,他們對於這種不符合規範的代碼如何處理,我沒有了解過,顯然,他們的處理方式不壹樣。
在VBA中,(VB6壹樣),通常都不建議采用Dim var as New Class的方式,因為很難調試、控制。正規路子是:
Dim var as Class
Set var = New Class
最後那句 Set d = Nothing,表明在內存中釋放這個類的實例,這樣的話這個被創建並且綁定到d上的類實例就完全清除了,這是寫代碼的好習慣,甚至說是壹種必須,壹般不要刪除。否則這個實例就又變成了幽靈,只能指望著VBA自己來處理了。
我建議妳作如下嘗試:
先嘗試如下方法:
Dim d as Dictionary
Set d = New Dictionary
如果不行,嘗試:
Dim d as Dictionary
Set d= CreateObject("Scripting.Dictionary")
還是不行,嘗試:
Dim d as Object
Set d= CreateObject("Scripting.Dictionary")
其中最後壹種方法在調試上很麻煩,尤其是當Dictionary出現錯誤時,不知道具體是什麽錯誤,因此盡量不要使用。