我正在尝试使用旧密钥在旧版集合之上构建一个集合。我看过其他类似的话题但是他们都遇到了我无法与之相关的特殊问题。我的收集问题要求我从较旧的集合( Col_0 )中取出一个对象,将其拆分为具有略微不同属性值的双对象,然后将它们放入一个新集合中,其中一个键基于一个改变的属性。我的问题是改变后的双胞胎会覆盖新系列中的原件。这是一个简短的例子:
Public Sub FillOutput(ID As String, Col_0 As Collection)
'---Obj is a class scope object not defined here.
'---ID is the item key for items in Col_0 collection
Dim Col_1 As Collection
Set Obj_0 = Col_0.Item(ID)
'---Now I have the right item from the collection
Loop_Count = 0
Set Col_1 = New Collection
While Loop_Count < 2
If Loop_Count = 0 Then
Obj_0.Color = "Red"
Col_1.Add Obj_0, CStr(Obj_0.Color)
ElseIf Loop_Count = 1 Then
Obj_0.Color = "Blue"
Col_1.Add Obj_0, CStr(Obj_0.Color)
End If
Loop_Count = Loop_Count + 1
Wend 'Loop_count
End If
End Sub
我尝试了很多东西,例如创建一个初始化的临时对象,并在循环内设置为空。如下:
ElseIf Loop_Count = 1 Then
Set pObj = New clsObjTable
pObj = Obj_0
pObj.Color = "Blue"
Col_1.Add pObj, CStr(pObj.Color)
Set pObj = Nothing
End If
仍然无效。我的最终收藏品一直被覆盖,因此这两个项目都是“蓝色”。我怀疑它是关于键被转移和搞砸但我在这里不够了解。任何帮助或指导将非常感谢!
答案 0 :(得分:1)
集合实际上不包含对象的副本,它们只包含对它们的引用。如果在将对象添加到集合后更改对象,则集合中引用的对象也会有更改。
更改此行为的唯一方法是手动复制对象。但这并不是一件容易的事。阅读有关克隆对象的this question,但请注意,您无法克隆内置对象。
您可以尝试创建一个辅助函数,将所有相关属性从您的对象移动到同一对象类型的对象的新副本,然后在与内置Access对象挣扎时返回该副本。但是有些对象具有只读或私有属性,因此是不可克隆的。