VBA
Scripting.Dictionary 객체
수색…
비고
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}
만 포함됩니다.
참고 :이 함수는 모든 열거 가능 객체와 함께 사용할 수 있습니다.