수색…
비고
Collection
은 VBA 런타임에 포함 된 컨테이너 개체입니다. 그것을 사용하기 위해 추가적인 참조가 필요하지 않습니다. Collection
은 모든 데이터 유형의 항목을 저장하는 데 사용할 수 있으며 항목의 서수 색인 또는 선택적 고유 키를 사용하여 검색 할 수 있습니다.
배열 및 사전과의 기능 비교
수집 | 정렬 | 사전 | |
---|---|---|---|
크기를 조정할 수 있습니다. | 예 | 때로는 1 | 예 |
항목 주문 됨 | 예 | 예 | 예 2 |
항목은 강하게 입력됩니다. | 아니 | 예 | 아니 |
서문으로 항목을 검색 할 수 있습니다. | 예 | 예 | 아니 |
서수에 새 항목을 삽입 할 수 있습니다. | 예 | 아니 | 아니 |
항목이 있는지 판별하는 방법 | 모든 항목 반복 | 모든 항목 반복 | 모든 항목 반복 |
항목은 키로 검색 할 수 있습니다. | 예 | 아니 | 예 |
키는 대소 문자를 구분합니다. | 아니 | N / A | 옵션 3 |
키가 있는지 판별하는 방법 | 오류 처리기 | N / A | .Exists 함수 |
모든 항목 삭제 | 반복 처리 및 .Remove | Erase , ReDim | .RemoveAll 함수 |
1 동적 배열 만 크기를 조정할 수 있으며 다차원 배열의 마지막 차원 만 크기를 조정할 수 있습니다.
2 기본. .Keys
및. .Items
이 정렬됩니다.
3 .CompareMode
속성에 의해 결정됩니다.
컬렉션에 항목 추가하기
Items는 .Add
메서드를 호출하여 Collection
에 추가됩니다.
통사론:
.Add(item, [key], [before, after])
매개 변수 | 기술 |
---|---|
목 | Collection 에 저장할 항목입니다. 변수는 기본 유형, 배열, 객체 및 Nothing 포함하여 변수에 지정할 수있는 모든 값일 수 있습니다. |
키 | 선택 과목. Collection 에서 항목을 검색하기위한 고유 식별자로 사용되는 String 입니다. 지정한 키가 Collection 이미 있으면 런타임 오류 457이 발생합니다. "이 키는 이미이 컬렉션의 요소와 연결되어 있습니다." |
전에 | 선택 과목. Collection 항목을 삽입하기위한 기존 키 ( String 값) 또는 인덱스 (숫자 값)입니다. 값이 주어지면 after 매개 변수 는 비어 있거나 런타임 오류 5입니다. "잘못된 프로 시저 호출 또는 인수가 발생합니다"가 발생합니다. Collection 존재하지 않는 String 키가 전달되면 런타임 오류 5 : "잘못된 프로 시저 호출 또는 인수가 발생합니다"가 발생합니다. Collection 존재하지 않는 숫자 인덱스가 전달되면 런타임 오류 9 : "아래 첨자가 범위를 벗어남"이됩니다. |
후 | 선택 과목. Collection 항목을 삽입 할 기존 키 ( String 값) 또는 인덱스 (숫자 값)입니다. 값이 주어지면 before 매개 변수 는 비어 있어야 합니다. 발생한 오류는 before 매개 변수와 동일합니다. |
노트:
키는 대소 문자를 구분 하지 않습니다 .
.Add "Bar", "Foo"
및..Add "Baz", "foo"
는 키 충돌을 초래합니다.선택적 before 또는 after 매개 변수를 지정하지 않으면 항목이
Collection
의 마지막 항목 뒤에 추가됩니다.before 또는 after 매개 변수를 지정하여 삽입하면 기존 멤버의 숫자 인덱스가 새 위치와 일치하도록 변경됩니다. 즉, 숫자 인덱스를 사용하여 루프에 삽입 할 때주의를 기울여야합니다.
샘플 사용법 :
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One" 'No key. This item can only be retrieved by index.
.Add "Two", "Second" 'Key given. Can be retrieved by key or index.
.Add "Three", , 1 'Inserted at the start of the collection.
.Add "Four", , , 1 'Inserted at index 2.
End With
Dim member As Variant
For Each member In foo
Debug.Print member 'Prints "Three, Four, One, Two"
Next
End Sub
컬렉션에서 항목 제거
항목은 .Remove
메소드를 호출하여 Collection
에서 제거됩니다.
통사론:
.Remove(index)
매개 변수 | 기술 |
---|---|
색인 | Collection 에서 제거 할 항목입니다. 전달 된 값이 숫자 형식이거나 숫자 하위 형식이있는 Variant 이면 숫자 인덱스로 해석됩니다. 전달 된 값이 문자열을 포함하는 String 또는 Variant 이면 a 키로 해석됩니다. Collection 존재하지 않는 String 키가 전달되면 런타임 오류 5 : "잘못된 프로 시저 호출 또는 인수가 발생합니다"가 발생합니다. Collection 존재하지 않는 숫자 인덱스가 전달되면 런타임 오류 9 : "아래 첨자가 범위를 벗어남"이됩니다. |
노트:
- A로부터 항목을 제거
Collection
에서 그 후 모든 항목의 숫자 인덱스 변경됩니다Collection
.For
숫자 인덱스를 사용하고 뒤쪽으로 실행해야합니다 항목을 제거 루프 (Step -1
) 첨자 예외를 방지하고 항목을 생략 할 수 있습니다. - 예상치 못한 결과가 발생할 수 있으므로 일반적으로
For Each
루프 내부에서 항목을Collection
에서 제거 하지 않아야합니다.
샘플 사용법 :
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One"
.Add "Two", "Second"
.Add "Three"
.Add "Four"
End With
foo.Remove 1 'Removes the first item.
foo.Remove "Second" 'Removes the item with key "Second".
foo.Remove foo.Count 'Removes the last item.
Dim member As Variant
For Each member In foo
Debug.Print member 'Prints "Three"
Next
End Sub
컬렉션의 항목 수 얻기
Collection
의 항목 수는 .Count
함수를 호출하여 얻을 수 있습니다.
통사론:
.Count()
샘플 사용법 :
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One"
.Add "Two"
.Add "Three"
.Add "Four"
End With
Debug.Print foo.Count 'Prints 4
End Sub
컬렉션에서 항목 가져 오기
항목은 .Item
함수를 호출하여 Collection
에서 검색 할 수 있습니다.
통사론:
.Item(index)
매개 변수 | 기술 |
---|---|
색인 | Collection 에서 가져올 항목입니다. 전달 된 값이 숫자 형식이거나 숫자 하위 형식이있는 Variant 이면 숫자 인덱스로 해석됩니다. 전달 된 값이 문자열을 포함하는 String 또는 Variant 이면 a 키로 해석됩니다. Collection 존재하지 않는 String 키가 전달되면 런타임 오류 5 : "잘못된 프로 시저 호출 또는 인수가 발생합니다"가 발생합니다. Collection 존재하지 않는 숫자 인덱스가 전달되면 런타임 오류 9 : "아래 첨자가 범위를 벗어남"이됩니다. |
노트:
-
.Item
은Collection
의 기본 멤버입니다. 이렇게하면 아래의 샘플 사용법에 설명 된대로 구문에 유연성을 부여 할 수 있습니다. - 숫자 인덱스는 1부터 시작합니다.
- 키는 대소 문자를 구분 하지 않습니다 .
.Item("Foo")
및.Item("foo")
은 동일한 키를 나타냅니다. - index 매개 변수는
String
에서 숫자로, 또는 그 반대로 함축적으로 캐스트 되지 않습니다 ..Item(1)
및.Item("1")
은Collection
다른 항목을 참조 할 수 있습니다.
샘플 사용법 (색인) :
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One"
.Add "Two"
.Add "Three"
.Add "Four"
End With
Dim index As Long
For index = 1 To foo.Count
Debug.Print foo.Item(index) 'Prints One, Two, Three, Four
Next
End Sub
샘플 사용 (키) :
Public Sub Example()
Dim keys() As String
keys = Split("Foo,Bar,Baz", ",")
Dim values() As String
values = Split("One,Two,Three", ",")
Dim foo As New Collection
Dim index As Long
For index = LBound(values) To UBound(values)
foo.Add values(index), keys(index)
Next
Debug.Print foo.Item("Bar") 'Prints "Two"
End Sub
샘플 사용 (대체 구문) :
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One", "Foo"
.Add "Two", "Bar"
.Add "Three", "Baz"
End With
'All lines below print "Two"
Debug.Print foo.Item("Bar") 'Explicit call syntax.
Debug.Print foo("Bar") 'Default member call syntax.
Debug.Print foo!Bar 'Bang syntax.
End Sub
.Item
은 기본 멤버이며 단일 String
인수를 취할 수 있기 때문에 bang ( !
) 구문을 사용할 수 있습니다. 이 구문의 유용성은 의심 스럽다.
컬렉션에 키 또는 항목이 있는지 결정
열쇠
Scripting.Dictionary 와 달리 Collection
에는 지정된 키가 있는지 또는 Collection
에있는 키를 검색 할 수있는 방법을 결정하는 메서드가 없습니다. 키가 있는지 판별하는 유일한 방법은 오류 핸들러를 사용하는 것입니다.
Public Function KeyExistsInCollection(ByVal key As String, _
ByRef container As Collection) As Boolean
With Err
If container Is Nothing Then .Raise 91
On Error Resume Next
Dim temp As Variant
temp = container.Item(key)
On Error GoTo 0
If .Number = 0 Then
KeyExistsInCollection = True
ElseIf .Number <> 5 Then
.Raise .Number
End If
End With
End Function
항목
항목이 Collection
포함되어 있는지 확인하는 유일한 방법은 항목이있을 때까지 Collection
을 반복하는 것입니다. Collection
에는 프리미티브 또는 객체가 포함될 수 있으므로 비교 중에 런타임 오류를 피하기 위해 추가 처리가 필요합니다.
Public Function ItemExistsInCollection(ByRef target As Variant, _
ByRef container As Collection) As Boolean
Dim candidate As Variant
Dim found As Boolean
For Each candidate In container
Select Case True
Case IsObject(candidate) And IsObject(target)
found = candidate Is target
Case IsObject(candidate), IsObject(target)
found = False
Case Else
found = (candidate = target)
End Select
If found Then
ItemExistsInCollection = True
Exit Function
End If
Next
End Function
콜렉션의 모든 항목 지우기
Collection
에서 모든 항목을 지우는 가장 쉬운 방법은 이전 Collection
새 Collection
바꾸고 이전 항목을 범위에서 제외시키는 것입니다.
Public Sub Example()
Dim foo As New Collection
With foo
.Add "One"
.Add "Two"
.Add "Three"
End With
Debug.Print foo.Count 'Prints 3
Set foo = New Collection
Debug.Print foo.Count 'Prints 0
End Sub
그러나 Collection
대한 참조가 여러 개있는 경우이 메서드 는 할당 된 변수에 대한 빈 Collection
만 제공합니다.
Public Sub Example()
Dim foo As New Collection
Dim bar As Collection
With foo
.Add "One"
.Add "Two"
.Add "Three"
End With
Set bar = foo
Set foo = New Collection
Debug.Print foo.Count 'Prints 0
Debug.Print bar.Count 'Prints 3
End Sub
이 경우 내용을 지우는 가장 쉬운 방법은 Collection
의 항목 수를 반복하고 가장 낮은 항목을 반복적으로 제거하는 것입니다.
Public Sub ClearCollection(ByRef container As Collection)
Dim index As Long
For index = 1 To container.Count
container.Remove 1
Next
End Sub