수색…


비고

Scripting Dictionary 개체의 초기 바인딩을 구현하려면 VBE의 Tools → References 명령을 통해 Microsoft Scripting Runtime을 VBA 프로젝트에 추가해야합니다. 이 라이브러리 참조는 프로젝트와 함께 전달됩니다. VBA 프로젝트가 배포되어 다른 컴퓨터에서 실행될 때 다시 참조 할 필요가 없습니다.

속성 및 메서드

Scripting Dictionary 개체 는 키 / 항목 쌍에 정보를 저장합니다. 키는 배열이 아닌 고유해야하지만 연관된 항목은 반복 될 수 있으며 (고유성은 컴패니언 키에 의해 유지됨) 모든 유형의 변형 또는 객체 일 수 있습니다.

사전은 첫 번째 '필드'( )에 기본 고유 색인이있는 두 개의 필드 내 메모리 데이터베이스로 생각할 수 있습니다. Key 속성의이 고유 인덱스는 매우 빠른 '조회'가 키의 관련 Item 값을 검색 할 수있게합니다.


속성

이름 읽기 / 쓰기 유형 기술
비교 모드 읽기 / 쓰기 CompareMode 상수 CompareMode 설정은 빈 사전에서만 수행 할 수 있습니다. 허용되는 값은 0 (vbBinaryCompare), 1 (vbTextCompare), 2 (vbDatabaseCompare)입니다.
카운트 읽기 전용 부호없는 긴 정수 스크립팅 사전 객체의 키 / 항목 쌍의 1 기반 카운트입니다.
읽기 / 쓰기 배열이 아닌 변형 사전의 각 개별 고유 키.
항목 ( ) 읽기 / 쓰기 모든 변종 기본 속성. 각 개별 항목은 사전의 키와 연관됩니다. 사전에없는 키가있는 항목을 검색하려고하면 암시 적 으로 전달 된 키가 추가 됩니다.

행동 양식

이름 기술
추가 ( , 아이템 ) 새 키 및 항목을 사전에 추가합니다. 새로운 키는 사전의 현재 Keys 컬렉션에 존재해서는 안되지만 여러 유니크 키 중에서 항목을 반복 할 수 있습니다.
존재 ( 핵심 ) Key가 사전에 이미 있는지 여부를 확인하는 부울 테스트입니다.
열쇠 고유 키 배열 또는 컬렉션을 반환합니다.
항목 연결된 항목의 배열 또는 컬렉션을 반환합니다.
제거 ( ) 개별 사전 키와 연관된 항목을 제거합니다.
모두 제거 사전 개체의 키와 항목을 모두 지 웁니다.

샘플 코드

'Populate, enumerate, locate and remove entries in a dictionary that was created
'with late binding
Sub iterateDictionaryLate()
    Dim k As Variant, dict As Object
    
    Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = vbTextCompare          'non-case sensitive compare model
    
    'populate the dictionary
    dict.Add Key:="Red", Item:="Balloon"
    dict.Add Key:="Green", Item:="Balloon"
    dict.Add Key:="Blue", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
        Debug.Print k & " - " & dict.Item(k)
    Next k

    'locate the Item for Green
    Debug.Print dict.Item("Green")
    
    'remove key/item pairs from the dictionary
    dict.Remove "blue"      'remove individual key/item pair by key
    dict.RemoveAll          'remove all remaining key/item pairs

End Sub

'Populate, enumerate, locate and remove entries in a dictionary that was created
'with early binding (see Remarks)
Sub iterateDictionaryEarly()
    Dim d As Long, k As Variant
    Dim dict As New Scripting.Dictionary
    
    dict.CompareMode = vbTextCompare          'non-case sensitive compare model
    
    'populate the dictionary
    dict.Add Key:="Red", Item:="Balloon"
    dict.Add Key:="Green", Item:="Balloon"
    dict.Add Key:="Blue", Item:="Balloon"
    dict.Add Key:="White", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
        Debug.Print k & " - " & dict.Item(k)
    Next k

    'iterate through the keys by the count
    For d = 0 To dict.Count - 1
        Debug.Print dict.Keys(d) & " - " & dict.Items(d)
    Next d
    
    'iterate through the keys by the boundaries of the keys collection
    For d = LBound(dict.Keys) To UBound(dict.Keys)
        Debug.Print dict.Keys(d) & " - " & dict.Items(d)
    Next d
    
    'locate the Item for Green
    Debug.Print dict.Item("Green")
    'locate the Item for the first key
    Debug.Print dict.Item(dict.Keys(0))
    'locate the Item for the last key
    Debug.Print dict.Item(dict.Keys(UBound(dict.Keys)))
    
    'remove key/item pairs from the dictionary
    dict.Remove "blue"                         'remove individual key/item pair by key
    dict.Remove dict.Keys(0)                   'remove first key/item by index position
    dict.Remove dict.Keys(UBound(dict.Keys))   'remove last key/item by index position
    dict.RemoveAll                             'remove all remaining key/item pairs

End Sub

Scripting.Dictionary (최대, 개수)로 데이터 집계

사전은 여러 항목이있는 정보를 관리하는 데 적합하지만 첫 항목 또는 마지막 값, 최소값 또는 최대 값, 평균, 합계 등 모든 항목 집합에 대해 단일 값에만 관심이 있습니다.

누군가가 통합 문서를 편집 할 때마다 사용자 이름 및 편집 날짜를 삽입하는 스크립트를 사용하여 사용자 활동 로그를 보관하는 통합 문서를 고려하십시오.

Log 워크 시트

에이
단발 10/12/1216 9:00
앨리스 10/13/2016 13:00
단발 10/13/2016 13:30
앨리스 10/13/2016 14:00
앨리스 10/14/2016 13:00

Summary 라는 워크 시트에 각 사용자의 마지막 편집 시간을 출력한다고 가정 해 봅시다.

노트:
1. 데이터는 ActiveWorkbook 있다고 가정합니다.
2. 배열을 사용하여 워크 시트에서 값을 가져옵니다. 이것은 각 셀을 반복하는 것보다 효율적입니다.
3. Dictionary 은 초기 바인딩을 사용하여 작성됩니다.

Sub LastEdit()
Dim vLog as Variant, vKey as Variant
Dim dict as New Scripting.Dictionary
Dim lastRow As Integer, lastColumn As Integer
Dim i as Long
Dim anchor As Range

With ActiveWorkbook
    With .Sheets("Log")
        'Pull entries in "log" into a variant array
        lastRow = .Range("a" & .Rows.Count).End(xlUp).Row
        vlog = .Range("a1", .Cells(lastRow, 2)).Value2

        'Loop through array
        For i = 1 to lastRow
            Dim username As String
            username = vlog(i, 1)
            Dim editDate As Date
            editDate = vlog(i, 2)

            'If the username is not yet in the dictionary:
            If Not dict.Exists(username) Then
                dict(username) = editDate
            ElseIf dict(username) < editDate Then
                dict(username) = editDate
            End If
        Next
    End With

    With .Sheets("Summary")
        'Loop through keys
        For Each vKey in dict.Keys
            'Add the key and value at the next available row
            Anchor = .Range("A" & .Rows.Count).End(xlUp).Offset(1,0)
            Anchor = vKey
            Anchor.Offset(0,1) = dict(vKey)
        Next vKey
    End With
End With
End Sub

출력은 다음과 같습니다.

Summary 워크 시트

에이
단발 10/13/2016 13:30
앨리스 10/14/2016 13:00

반면에 각 사용자가 통합 문서를 편집 한 횟수를 출력하려면 For 루프의 본문이 다음과 같이 표시되어야합니다.

        'Loop through array
        For i = 1 to lastRow
            Dim username As String
            username = vlog(i, 1)

            'If the username is not yet in the dictionary:
            If Not dict.Exists(username) Then
                dict(username) = 1
            Else
                dict(username) = dict(username) + 1
            End If
        Next

출력은 다음과 같습니다.

Summary 워크 시트

에이
단발 2
앨리스

Scripting.Dictionary를 사용하여 고유 한 값 얻기

Dictionary 사용하면 고유 한 값 집합을 매우 간단하게 얻을 수 있습니다. 다음 기능을 고려하십시오.

Function Unique(values As Variant) As Variant()
    'Put all the values as keys into a dictionary
    Dim dict As New Scripting.Dictionary
    Dim val As Variant
    For Each val In values
        dict(val) = 1 'The value doesn't matter here
    Next
    Unique = dict.Keys
End Function

그러면 다음과 같이 호출 할 수 있습니다.

Dim duplicates() As Variant
duplicates = Array(1, 2, 3, 1, 2, 3)
Dim uniqueVals() As Variant
uniqueVals = Unique(duplicates)

uniqueVals 에는 {1,2,3} 만 포함됩니다.

참고 :이 함수는 모든 열거 가능 객체와 함께 사용할 수 있습니다.



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