Ассоциативные массивы

Ассоциативный массив (или словарь) — это набор элементов, доступ к которым осуществляется не по индексу (как это было в обычном массиве), а по ключу. В качестве ключа можно указать число или строку. Элементы словаря могут содержать данные произвольного типа. Чтобы получить элемент, необходимо указать ключ, который использовался при сохранении значения.

В языке VBA нет встроенной поддержки ассоциативных массивов, однако можно получить доступ к ним через объект Scripting.Dictionary. Создать объект позволяет следующий код:

Dim Dict As Variant
Set Dict = CreateObject("Scripting.Dictionary")

Объект Scripting.Dictionary поддерживает следующие методы:

Add <Ключ>, <Значение>

Пример:

Dim Dict As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Add "b", 2
Dim Dict As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Add "b", 2
Dict.Item("b") = 3
Debug.Print Dict.Item("b") ' 3
Dict.Item("c") = 4
Debug.Print Dict.Item("c") ' 4
Dim Dict As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Add "b", 2
Debug.Print Dict.Exists("b") ' True
Dict.Remove ("b")            ' Удаляем элемент
Debug.Print Dict.Exists("b") ' False
Dim Dict As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Add "b", 2
Debug.Print Dict.Exists("b") ' True
Dict.RemoveAll               ' Удаляем все элементы
Debug.Print Dict.Exists("b") ' False
Dim Dict As Variant, Item As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Add "b", 2
For Each Item In Dict.Keys()   ' Все ключи
   Debug.Print Item            ' Ключ
   Debug.Print Dict.Item(Item) ' Значение
Next
For Each Item In Dict.Items()  ' Все значения
   Debug.Print Item
Next
Key(<Ключ>) = <Новый ключ>

Пример:

Dim Dict As Variant, Item As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Key("a") = "b"
Debug.Print Dict.Item("b") ' 1

Объект Scripting.Dictionary содержит следующие свойства:

Dim Dict As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Add "b", 2
Dict.Add "c", 3
Debug.Print Dict.Count ' 3

Пример использования текстового сравнения:

Dim Dict As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.CompareMode = vbTextCompare
Dict.Add "a", 1
Debug.Print Dict.Item("A") ' 1

Перебрать все элементы ассоциативного массива можно с помощью цикла For Each...Next. В качестве примера выведем элементы словаря двумя способами. Первый способ использует метод Key(), возвращающий массив с ключами ассоциативного массива. Во втором случае мы просто указываем ассоциативный массив в качестве параметра. На каждой итерации цикла будет возвращаться ключ, с помощью которого внутри цикла можно получить значение, соответствующее этому ключу (листинг 2.7).

Листинг 2.7. Перебор элементов ассоциативного массива

Dim Dict As Variant, Item As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Add "b", 2
' Способ 1
For Each Item In Dict.Keys()   ' Все ключи
   Debug.Print Item            ' Ключ
   Debug.Print Dict.Item(Item) ' Значение
Next
' Способ 2
For Each Item In Dict          ' Все ключи
   Debug.Print Item            ' Ключ
   Debug.Print Dict.Item(Item) ' Значение
Next
Предыдущая статья Все статьи Следующая статья