Excel VBA:嵌套字典问题

时间:2016-11-08 14:18:12

标签: excel-vba vba excel

我无法创建嵌套字典,将其分配给变量,覆盖其中一个内部值,然后将其分配给另一个变量而不更改原始变量的值,这是我不想要的。例如,请参阅以下代码:

Option Explicit

Sub Button1_Click()

  Dim d_outer As Scripting.Dictionary
  Set d_outer = New Scripting.Dictionary

  Dim d_inner As Scripting.Dictionary
  Set d_inner = New Scripting.Dictionary

  Call d_inner.Add("key", "foo")

  Call d_outer.Add("first attempt", d_inner)

  ' Cannot use "Add", since key already exists, must use Item()
  d_inner.Item("key") = "bar"

  Call d_outer.Add("second attempt", d_inner)

  ' Print all values.
  Dim v_outer As Variant
  Dim v_inner As Variant
  For Each v_outer In d_outer.Keys()
    For Each v_inner In d_outer(v_outer).Keys()
      Debug.Print "(" & v_outer & ", " & v_inner & "): '" & d_outer(v_outer)(v_inner) & "'"
    Next v_inner
  Next v_outer
End Sub

这会产生以下输出:

(first attempt, key): 'bar'
(second attempt, key): 'bar'

第一次尝试的值应为foo。为什么会更改为bar?我该如何解决?每次我只想更改其中一个值时,是否需要创建一个新的字典,它是d_inner的精确副本?如果是这样,有没有一种简单的方法呢?

1 个答案:

答案 0 :(得分:0)

在第一个集合中,您创建了对象的引用,而不是在其中放置值(例如)。因此,当您更改内部集合时,它将在初始外部集合中更新。

您需要创建一个New对象以放入第二个集合。像这样:

  ' Cannot use "Add", since key already exists, must use Item()      
   Set d_inner = New Scripting.Dictionary
   Call d_inner.Add("key", "bar")

给出:

(first attempt, key): 'foo'
(second attempt, key): 'bar'

根据您在此处尝试实现的目标,您可能会发现这些类的任务更灵活