2013-08-20 35 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