2013-08-20 71 views
2

我有一個字典問題。如果我將一個對象添加到字典中,它會用添加的項目覆蓋整個包含的項目。VBA詞典 - 添加項目會覆蓋所有項目

添加完所有元素後,Dictionary包含正確數量的項目,但項目都是最後添加的項目。

For Each shp In pg.Shapes 

    Dim tmp As New cls_dtyp_link 
    //Filling tmp with Variables - not Displayed - tmp.link_obj is the Key 

    If link_dic.Exists(tmp.link_obj) Then 
     Debug.Print "not added:" & tmp.link_obj 
    Else 
     link_dic.Add tmp.link_obj, tmp 

    End If 
Next 

的cls_dtyp_link類:

Public link_ne As String 
Public link_obj As String 
Public link_ref As Visio.Shape 
Public obj_left As String 
Public obj_right As String 
Public ref_left As Visio.Shape 
Public ref_right As Visio.Shape 
Public basekey_left As String 
Public basekey_right As String 
Public root_site_ne_left As String 
Public root_site_ne_right As String 
Public root_obj_left As String 
Public root_obj_right As String 
Public ref_root_left As Visio.Shape 
Public ref_root_right As Visio.Shape 
Public hops As Integer 
Public geht_zu_konzentrator As Boolean 

謝謝您的幫助!

回答

3

問題來自Dim tmp As New cls_dtyp_link聲明:增加對現有對象的引用,它沒有實例化一個新的對象,就像您期望的那樣。如果要創建一個新對象,請在循環結束時明確地刪除現有對象:Set cls_dtyp_link = Nothing。然後每次您重新進入循環時都會創建一個新實例。

一般來說,一次性聲明和實例化在VBA中被認爲是不好的做法,因爲遇到了類似的問題。我建議Dim - 在循環外部的對象,和Set - 在循環內部。

而且,看看這裏: VBA: Difference in two ways of declaring a new object? (Trying to understand why my solution works)

我希望幫助!

+1

或者,應該使用'Dim tmp As cls_dtyp_link'後跟'set tmp = new cls_dtyp_link'來代替'Dim tmp As New cls_dtyp_link'。 – shahkalpesh

+0

@shahkalpesh是的,第二段建議這(我會聲明對象的循環外)。 – Ioannis

+0

@shahkalpesh&@loannis感謝它的工作! 我不得不在循環之外將Dim tmp as cls_dtyp_link'和循環開始處的Set tmp = New cls_dtyp_link'。在循環結束'Set cls_dtyp_link = Nothing' – Axel