답변:
예.
MS 스크립팅 런타임 ( 'Microsoft 스크립팅 런타임')에 대한 참조를 설정하십시오. @regjo의 의견에 따라 도구-> 참조로 이동하여 'Microsoft Scripting Runtime'상자를 선택하십시오.
아래 코드를 사용하여 사전 인스턴스를 만듭니다.
Set dict = CreateObject("Scripting.Dictionary")
또는
Dim dict As New Scripting.Dictionary
사용 예 :
If Not dict.Exists(key) Then
dict.Add key, value
End If
사전 Nothing
사용을 마치면 사전을 설정하는 것을 잊지 마십시오 .
Set dict = Nothing
keyed
.
Dim dict As New Scripting.Dictionary
참조 없이는 사용할 수 없습니다 . 참조가 없으면 CreateObject
이 객체를 인스턴스화 하는 후기 바인딩 방법 을 사용해야 합니다.
VBA에는 콜렉션 오브젝트가 있습니다.
Dim c As Collection
Set c = New Collection
c.Add "Data1", "Key1"
c.Add "Data2", "Key2"
c.Add "Data3", "Key3"
'Insert data via key into cell A1
Range("A1").Value = c.Item("Key2")
Collection
객체가 수행하는이 빠른 그래서 해시를 사용하여 키 기반 조회.
Contains()
함수를 사용하여 특정 컬렉션에 키가 포함되어 있는지 확인할 수 있습니다 .
Public Function Contains(col As Collection, key As Variant) As Boolean
On Error Resume Next
col(key) ' Just try it. If it fails, Err.Number will be nonzero.
Contains = (Err.Number = 0)
Err.Clear
End Function
Contains()
@TWiStErRob 덕분에 2015 년 6 월 24 일 수정 : 더 짧 습니다.
2015 년 9 월 25 일 수정 : Err.Clear()
@scipilot 덕분에 추가되었습니다 .
ContainsKey
. 호출 만 읽는 사람은 특정 값이 포함되어 있는지 확인하기 위해 혼동을 줄 수 있습니다.
발생 빈도를 포함하는 데 유용한 추가 사전 예입니다.
루프 외부 :
Dim dict As New Scripting.dictionary
Dim MyVar as String
루프 내에서 :
'dictionary
If dict.Exists(MyVar) Then
dict.Item(MyVar) = dict.Item(MyVar) + 1 'increment
Else
dict.Item(MyVar) = 1 'set as 1st occurence
End If
빈도를 확인하려면 다음을 수행하십시오.
Dim i As Integer
For i = 0 To dict.Count - 1 ' lower index 0 (instead of 1)
Debug.Print dict.Items(i) & " " & dict.Keys(i)
Next i
오프 구축 cjrh의 대답 , 우리는 (내가 레이블을 사용 좋아하지 않는다)를 더 레이블을 필요로하지 않는 기능을 포함 구축 할 수 있습니다.
Public Function Contains(Col As Collection, Key As String) As Boolean
Contains = True
On Error Resume Next
err.Clear
Col (Key)
If err.Number <> 0 Then
Contains = False
err.Clear
End If
On Error GoTo 0
End Function
내 프로젝트의 경우, 나는 Collection
행동을 더 비슷하게 만들기 위해 일련의 도우미 함수를 작성 했습니다 Dictionary
. 여전히 재귀 컬렉션을 허용합니다. Key는 항상 필수이며 내 구현에 더 합리적이기 때문에 항상 먼저 나옵니다. 또한 String
키만 사용했습니다. 원하는 경우 다시 변경할 수 있습니다.
이전 값을 덮어 쓰므로 설정하도록 이름을 변경했습니다.
Private Sub cSet(ByRef Col As Collection, Key As String, Item As Variant)
If (cHas(Col, Key)) Then Col.Remove Key
Col.Add Array(Key, Item), Key
End Sub
err
사용 개체를 통과 할 것이기 때문에 물건 객체입니다 set
없이 변수를. 나는 그것이 객체인지 확인할 수 있다고 생각하지만 시간이 지났습니다.
Private Function cGet(ByRef Col As Collection, Key As String) As Variant
If Not cHas(Col, Key) Then Exit Function
On Error Resume Next
err.Clear
Set cGet = Col(Key)(1)
If err.Number = 13 Then
err.Clear
cGet = Col(Key)(1)
End If
On Error GoTo 0
If err.Number <> 0 Then Call err.raise(err.Number, err.Source, err.Description, err.HelpFile, err.HelpContext)
End Function
이 게시물의 이유는 ...
Public Function cHas(Col As Collection, Key As String) As Boolean
cHas = True
On Error Resume Next
err.Clear
Col (Key)
If err.Number <> 0 Then
cHas = False
err.Clear
End If
On Error GoTo 0
End Function
존재하지 않으면 던지지 않습니다. 제거되었는지 확인하십시오.
Private Sub cRemove(ByRef Col As Collection, Key As String)
If cHas(Col, Key) Then Col.Remove Key
End Sub
키 배열을 가져옵니다.
Private Function cKeys(ByRef Col As Collection) As String()
Dim Initialized As Boolean
Dim Keys() As String
For Each Item In Col
If Not Initialized Then
ReDim Preserve Keys(0)
Keys(UBound(Keys)) = Item(0)
Initialized = True
Else
ReDim Preserve Keys(UBound(Keys) + 1)
Keys(UBound(Keys)) = Item(0)
End If
Next Item
cKeys = Keys
End Function
어떤 이유로 든 Excel에 추가 기능을 설치할 수 없거나 원하지 않는 경우 최소한 간단한 문제에 대해서도 배열을 사용할 수 있습니다. WhatIsCapital로 국가 이름을 입력하면 함수가 자본을 반환합니다.
Sub arrays()
Dim WhatIsCapital As String, Country As Array, Capital As Array, Answer As String
WhatIsCapital = "Sweden"
Country = Array("UK", "Sweden", "Germany", "France")
Capital = Array("London", "Stockholm", "Berlin", "Paris")
For i = 0 To 10
If WhatIsCapital = Country(i) Then Answer = Capital(i)
Next i
Debug.Print Answer
End Sub
Dim
키워드를, Country
그리고 Capital
필요 변형으로 인해 사용에 선언 할 수는 Array()
, i
선언되어야한다 (그리고 경우에해야 Option Explicit
집합입니다), 루프 카운터 바운드 부족 오류를 던질 것입니다 -에 안전 가치를 UBound(Country)
위해 사용 하십시오 To
. 또한 Array()
함수가 유용한 지름길이지만 VBA에서 배열을 선언하는 표준 방법은 아닙니다.
다른 모든 사람들은 scripting.runtime 버전의 Dictionary 클래스 사용을 이미 언급했습니다. 이 DLL을 사용할 수 없으면이 버전을 사용할 수도 있습니다. 간단히 코드에 추가하십시오.
https://github.com/VBA-tools/VBA-Dictionary/blob/master/Dictionary.cls
Microsoft 버전과 동일합니다.