2016-11-08 2 views
1

ネストされた辞書を作成して変数に割り当て、内側の値の1つを上書きして元の変数の値を変更せずに別の変数に割り当てることはできませんほしくない。これは次の出力が生成さExcel VBA:ネストされた辞書の問題

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の正確なコピーである新しい辞書を作成する必要がありますか?もしそうなら、簡単な方法がありますか?

+0

これらの種類とより柔軟であることを見つけるかもしれません: 'd_inner .Item( "key")= "bar" '最初の試行を' bar'に変更します – CallumDA

+0

はい、私はそれを知っています。しかし、元の(正しい)値を持つ「最初の試行」キーの前の行で既にAdd()メソッドを呼び出しているので、そのキーに関係なく、 – MrSnrub

+0

私の答えで説明します。希望が役立つ – CallumDA

答えて

0

最初のコレクションでは、値をオブジェクトに配置するのではなく、オブジェクトへの参照を作成しています(たとえば)。したがって、内部コレクションを変更すると、最初の外部コレクションで更新されます。

Newオブジェクトを作成して2番目のコレクションに入れる必要があります。このように:

' 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' 

をあなたはここで達成しようとしている内容に応じて、あなたはクラスがこのラインタスク