Создание объекта Dictionary с помощью кода VBA Excel. Раннее и позднее связывание. Методы и свойства словаря и синтаксис выражений с ними. Примеры кода.
Создание объекта Dictionary
Раннее связывание:
1 2 |
Dim myDict As Dictionary Set myDict = New Dictionary |
или
1 |
Dim myDict As New Dictionary |
Позднее связывание:
1 2 |
Dim myDict As Object Set myDict = CreateObject("Scripting.Dictionary") |
Чтобы использовать раннее связывание, необходимо подключить в редакторе VBA ссылку на библиотеку Microsoft Scripting Runtime, если она еще не подключена (в меню Tools–>References…):
Раннее связывание позволяет использовать при написании кода VBA Excel лист выбора и вставки свойств и методов объекта Dictionary (лист подсказок):
Лист подсказок отображается автоматически после ввода точки или, в иных случаях, вызывается сочетанием клавиш «Ctrl+Пробел».
Методы и свойства словаря
Методы объекта Dictionary
Метод Add
Метод Add добавляет в словарь новую пару ключ–элемент.
1 |
Dictionary.Add Ключ, Элемент |
- Ключ – обязательный аргумент, представляющий ключ добавляемой пары.
- Элемент – обязательный аргумент, представляющий элемент добавляемой пары.
Если добавляемый ключ в словаре уже есть, VBA Excel сгенерирует ошибку.
Метод Exists
Метод Exists возвращает логическое значение, указывающее, существует ли в словаре указанный ключ. True – указанный ключ существует, False – указанный ключ не существует.
1 |
Dictionary.Exists(Ключ) |
Метод Items
Метод Items возвращает массив всех элементов в словаре.
1 |
Dictionary.Items |
Метод Keys
Метод Keys возвращает массив всех ключей в словаре.
1 |
Dictionary.Keys |
Метод Remove
Метод Remove удаляет из словаря одну пару ключ–элемент.
1 |
Dictionary.Remove(Ключ) |
Если указанный ключ не существует, произойдет ошибка.
Метод RemoveAll
Метод RemoveAll удаляет из словаря все пары ключей и элементов.
1 |
Dictionary.RemoveAll |
Свойства объекта Dictionary
Свойство CompareMode
Свойство CompareMode задает или возвращает режим сравнения ключей в словаре. Используется для чтения и записи.
1 |
Dictionary.CompareMode [Сравнение] |
Необязательный аргумент Сравнение используется только при записи и может принимать следующие значения:
- –1 (vbUseCompareOption) – выполняется сравнение, заданное оператором Option Compare.
- 0 (vbBinaryCompare) – выполняется двоичное сравнение.
- 1 (vbTextCompare) – выполняется текстовое сравнение.
По умолчанию выполняется двоичное сравнение, при котором значение свойства CompareMode равно 0 (vbBinaryCompare).
Свойство Count
Свойство Count возвращает количество элементов в словаре. Только для чтения.
1 |
Dictionary.Count |
Свойство Item
Свойство Item задает или возвращает элемент для указанного ключа в словаре. Используется для чтения и записи.
1 |
Dictionary.Item(Ключ) [= Элемент] |
- Ключ – обязательный аргумент, представляющий из себя существующий ключ для чтения или изменения существующего элемента, или новый ключ для создания новой пары ключ–элемент.
- Элемент – необязательный аргумент, представляющий выражение, которое заменяет существующий элемент с существующим ключом или добавляет новый элемент в пару ключ–элемент с новым ключом.
Если при создании с новым ключом новой пары ключ–элемент аргумент Элемент не указан, значение элемента будет пустым (Empty).
Свойство Key
Свойство Key задает новое значение ключа для существующего ключа в словаре.
1 |
Dictionary.Key(Ключ) = НовыйКлюч |
- Ключ – обязательный аргумент, представляющий из себя существующий ключ.
- НовыйКлюч – обязательный аргумент, представляющий выражение, значение которого заменяет существующий ключ.
Если указанный ключ отсутствует в словаре, произойдет ошибка.
Примеры кода с Dictionary
Пример 1
Заполнение словаря парами ключ-элемент и извлечение элементов с помощью свойства Item:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Primer1() Dim myDict As New Dictionary 'Добавляем три пары ключ-элемент myDict.Add "№1", "Ананас" myDict.Add 2, "Апельсин" myDict.Add "Три", "Мандарин" 'Смотрим количество записей в словаре MsgBox myDict.Count 'Извлекаем элементы по ключам MsgBox myDict.Item("№1") MsgBox myDict.Item(2) MsgBox myDict.Item("Три") End Sub |
Пример 2
Замена элемента в существующей паре ключ-элемент, добавление новой пары ключ-элемент и добавление нового ключа без указания элемента с помощью свойства Item:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub Primer2() Dim myDict As New Dictionary, _ i As Integer 'Добавляем три пары ключ-элемент myDict.Add 1, "Январь" myDict.Add 2, "Вторник" myDict.Add 3, "Среда" 'Меняем элемент в паре с ключом 1 myDict.Item(1) = "Понедельник" 'Добавляем новую пару ключ-элемент myDict.Item(4) = "Четверг" 'Извлекаем элементы по ключам For i = 1 To 4 MsgBox myDict.Item(i) Next 'Добавляем новый ключ без элемента, 'MsgBox покажет пустую строку MsgBox myDict.Item(5) 'Убеждаемся, что теперь в словаре 'не 4, а 5 записей MsgBox myDict.Count End Sub |
Обратите внимание, добавить новый ключ без указания элемента можно только путем присвоения значения выражения переменной или, как во втором примере, функции MsgBox:
1 2 3 4 5 6 |
'Так работает: a = myDict.Item(НовыйКлюч) 'Так работает: MsgBox myDict.Item(НовыйКлюч) 'Так не работает, вызывает ошибку: myDict.Item(НовыйКлюч) |
Пример 3
Извлечение ключей и элементов в массив:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Sub Primer3() Dim myDict As New Dictionary, _ a As Variant, b As String, _ i As Integer myDict.Add "з", "Зима" myDict.Add "в", "Весна" myDict.Add "л", "Лето" myDict.Add "о", "Осень" 'Извлекаем ключи в массив a a = myDict.Keys 'Записываем извлеченные ключи 'в переменную b b = "Ключи:" & vbNewLine For i = 1 To myDict.Count b = b & vbNewLine & a(i - 1) Next 'Смотрим список ключей MsgBox b 'Извлекаем элементы в массив a a = myDict.Items 'Записываем извлеченные 'элементы в переменную b b = "Элементы:" & vbNewLine For i = 1 To myDict.Count b = b & vbNewLine & a(i - 1) Next 'Смотрим список элементов MsgBox b End Sub |
Отличная статья.
Евгений, а словари могут быть вложенными? например, значением может являться другая структура данных, например, другой словарь или коллекция?
Привет, Фарин!
Словарь поддерживает любые типы данных. Причем не только в значениях, но и в ключах. Есть одно исключение: ключи не могут быть массивами. Пример с вложенным словарем:
Заполнение и изменение словаря возможно без использования ключевого слова Item
Вместо
'Меняем элемент в паре с ключом 1
myDict.Item(1) = "Понедельник"
'Добавляем новую пару ключ-элемент
myDict.Item(4) = "Четверг"
Можно и использовать
myDict(1) = "Понедельник"
'Добавляем новую пару ключ-элемент
myDict(4) = "Четверг"
Здравствуйте!
Озадачил дурацкий вопрос:
Возможно ли сохранение значений переменных в самой пользовательской книге, а не отдельном файле без использования скрытия листов/ячеек, и имён Names?
Да. Можно.
Копать в сторону ThisWorkbook.CustomDocumentProperties
Обсуждение закрыто.