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

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

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

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

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

  • Add() — добавляет новый элемент по ключу. В качестве ключа можно использовать число или строку. Если элемент с указанным ключом уже существует, то возникнет ошибка и программа будет остановлена. Формат метода:
Add <Ключ>, <Значение>

Пример:

Dim Dict As Variant
Set Dict = CreateObject("Scripting.Dictionary")
Dict.Add "a", 1
Dict.Add "b", 2
  • Item(<Ключ>) — возвращает элемент по указанному ключу. Можно как получить значение по ключу, так и присвоить значение. Если элемент с указанным ключом отсутствует, то он будет добавлен. Пример:
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
  • Exists(<Ключ>) — возвращает значение True, если элемент с указанным ключом существует, и False — в противном случае;
  • Remove(<Ключ>) — удаляет элемент с указанным ключом. Если ключ не существует, то возникнет ошибка и программа будет остановлена. Пример:
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
  • RemoveAll() — удаляет все элементы:
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
  • Keys() — возвращает массив со всеми ключами;
  • Items() — возвращает массив со всеми значениями. Пример:
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() — позволяет изменить название ключа. Имеет следующий формат:
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 содержит следующие свойства:

  • Count — количество элементов:
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
  • CompareMode — задает режим сравнения ключей. Обратите внимание на то, что установка нового значения возможна только для пустого объекта. Можно указать следующие значения:
  • vbBinaryCompare — 0 — двоичное сравнение (значение по умолчанию). Сравнение зависит от регистра символов;
  • vbTextCompare — 1 — текстовое сравнение. Регистр символов при сравнении не учитывается.

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

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

Visual Basic for Applications (VBA)
Самоучитель по VBA

Помощь сайту

Yandex-деньги: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

Поиск по сайту в Яндексе