2016-11-08 54 views
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對象投入第二收集。就像這樣:

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

根據您正試圖在這裏實現什麼,你可能會發現,類是與這些類型的任務

相關問題