2011-04-18 5 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

Dictionary을 사용하는 것에 대한 Alex K.의 조언은 정확하지만, 여기에있는 문제는 그의 답변보다 더 일반적이라고 생각합니다. Collection 키 (또는 해당 위치에 대한 색인 위치)는 쓰기가 아닌 읽기에만 유용합니다. 그래서이 줄

:

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") 유효한 좌변 때문에

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

가 작동합니다. 더 간결

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

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

나 : 어떤 이유로 당신이 또는 MS 스크립팅 런타임을 포함하지 않을 수없는 경우

, 당신은 같은과 실패 라인을 교체해야합니다

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

그런 다음 에게 dFeat("M1")("TOTAL")의 값을 읽을 수 있습니다,하지만 당신은 여전히 ​​여기에 할당 할 수 없습니다.

+1

+1 'Collection key (또는 그 문제에 대한 색인 위치)는 읽기 전용, 쓰기가 아님'입니다. 프로젝트를 위해 매우 녹슬었던 VBA를 닦아내는 것이 핵심이었습니다 (하!) - 새로운 아이템으로 전체 아이템을 대체하는 것이 트릭입니다. 필자의 경우 이것은 기존 어레이의 값으로 채워진 새로운 배열을 의미합니다. 아마도 대형 객체의 경우보다 성능이 좋은 방법이지만, 각 값이 2 개인 수십 개의 배열 만 처리 할 것입니다. – brichins

3

컬렉션의 값 형식을 업데이트 할 수 없습니다.

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

은 Microsoft 스크립팅 런타임에 대한 참조를 추가 작동한다 Dictionary &와 Collection를 교체합니다.