2011-04-18 62 views
6
Dim dFeat As Collection 
Set dFeat = New Collection 

Dim cObj As Collection 
Set cObj = New Collection 
cObj.Add 3, "PASSED" 
cObj.Add 4, "TOTAL" 
dFeat.Add cObj, "M1" 

Set cObj = New Collection 
cObj.Add 5, "PASSED" 
cObj.Add 6, "TOTAL" 
dFeat.Add cObj, "M2" 

dFeat("M1")("TOTAL") = 88 ' Error here 
Debug.Print dFeat("M1")("TOTAL") 

如何使用鍵修改內部集合的值?按鍵修改數值

回答

7

Alex K.關於使用Dictionary的建議是正確的,但我認爲這裏的問題比他的答案更普遍。密鑰(或索引位置)僅適用於閱讀,不適用於書寫。

因此,在這一行:

dFeat("M1")("TOTAL") = 88 ' Error here 

dFeat("M1")是罰款。它返回您添加了密鑰「M1」的Collection。發生此錯誤的原因是您嘗試直接分配給的那個元素,即集合。一般來說,如果cCollection,c("TOTAL")(或c(2))不能是左值。

正如Alek K.所說,最好的解決方法是使用Dictionary作爲內部「集合」,或者內部和外部。下面是如何使用一個內部看起來:

Dim d As Dictionary 
Set d = New Dictionary 

d("PASSED") = 3 
d("TOTAL") = 4 

dFeat.Add d, "M1" 

然後行:

dFeat("M1")("TOTAL") = 88 

會工作,因爲dFeat("M1")("TOTAL")一個有效的左值。

如果由於某種原因,你不能或不想包括MS腳本運行時,你就會有類似替換故障線路:

Dim c As Collection 
Set c = dFeat("M1") 

Call c.Remove("TOTAL") 
Call c.Add(88, "TOTAL") 

或更簡潔:

Call dFeat("M1").Remove("TOTAL") 
Call dFeat("M1").Add(88, "TOTAL") 

然後,您可以閱讀dFeat("M1")("TOTAL")價值,但你仍然不能分配給它。

+1

+1對於'集合鍵(或索引位置)只適用於閱讀,而不是寫作'。爲一個項目刷掉一些非常生鏽的VBA,這是關鍵(哈!) - 用一個新對象替換整個項目的伎倆。在我的情況下,這意味着一個新陣列充滿了現有陣列+變化的值。對於大型對象來說,這可能是一個更高效的方式,但我只處理幾個數組,每個數組有兩個值。 – brichins 2015-03-12 17:50:18

3

您無法更新集合中的值類型;

Dim c as new Collection 
c.add 42, "wth" 
c("wth") = 88 //will error also 

添加一個參考Microsoft腳本運行時,與Dictionary &它應該工作更換Collection