为什么嵌套字典会追溯更新?

时间:2015-09-08 15:09:56

标签: vba

如果您有一个普通的字典键,并且您设置的变量等于该键的定义,然后更改该变量的值,则除非您重新保存,否则字典中的定义不会发生变化在字典里。但是,正如您通过运行下面的子项所看到的,如果您有嵌套字典并更改其中的任何内容,则无需在原始字典中重新保存它以使更改生效。您添加或更改的任何内容仍将反映在原始字典中。唯一的例外是当您将字典设置为Nothing时。在这种情况下,嵌套字典仍将存在于原始字典中。对此有一个很好的解释吗?

"13:00:23"     "0 13:00:23" 

"09:15:16"     "0 09:15:16"

1 个答案:

答案 0 :(得分:4)

我认为你所描述的是对象和非对象变量之间的区别,而不是字典对象本身的任何特性。

对象变量
据我所知,当VBA创建一个对象的实例时,你创建的每个变量和“set”等于该对象实际上并不等于它,而是对该对象的引用。这意味着共享对象可以存在多个变量(引用)。如果将一个变量设置为空,则不需要将所有引用设置为空。但是,如果通过一个引用更改其中一个对象的属性,您将在所有引用中看到此更改(并且您可以将字典中的项目视为一种属性)。

非对象变量
如果将非对象变量分配给字典,则不会为任何内容分配引用,而是在字典中创建一个给定已分配变量值的新变量。由于这些变量带有自己的值并且不是引用,因此在创建相应的字典变量并给定赋值变量的值之后,它们会以不同的方式保持不连接。

以下是您发布的类似示例,该示例还显示与工作表对象类似的行为。注意,使用Debug.Print将输出发送到即时窗口。

Sub example()
Dim d1 As Dictionary
Dim d2 As Dictionary

Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")

d1.Add 1, d2
d1(1).Add "a", 1
d1(1).Add "b", 2
Debug.Print d2.Count

Set d2 = Nothing
Debug.Print d1(1).Count

d1.Add 2, CreateObject("Scripting.Dictionary")
Set d2 = d1(2)
Debug.Print d2.Count

Set d1(2) = Nothing
Debug.Print d2.Count


Dim ws, ws2 As Worksheet
Set ws = Sheets(1)
d1.Add 3, ws
d1(3).Name = "ABC"
Debug.Print ws.Name
Set ws2 = ws
Debug.Print ws.Name & ws2.Name & d1(3).Name
Set ws = Sheets(2)
Debug.Print ws.Name & ws2.Name & d1(3).Name
End Sub