수색…


비고

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 : "아래 첨자가 범위를 벗어남"이됩니다.

노트:

  • .ItemCollection 의 기본 멤버입니다. 이렇게하면 아래의 샘플 사용법에 설명 된대로 구문에 유연성을 부여 할 수 있습니다.
  • 숫자 인덱스는 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 에서 모든 항목을 지우는 가장 쉬운 방법은 이전 CollectionCollection 바꾸고 이전 항목을 범위에서 제외시키는 것입니다.

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow