Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Отбор уникальных значений с помощью Dictionary

    Отбор уникальных значений из списка в VBA Excel с помощью объекта Dictionary. Выгрузка уникальных элементов в ячейки рабочего листа. Два способа отбора.


    Также как и объект Collection, объект Dictionary не допускает добавления двух одинаковых ключей. Эту особенность словаря будем использовать для отбора уникальных значений из списка. Преимущество словаря перед коллекцией заключается в возможности извлечь из него и ключи, и элементы одним массивом.

    Традиционный способ отбора

    Переменные:

    • myDictionary – словарь (объект Dictionary);
    • myCell – ячейка диапазона, к которой обращается цикл For Each… Next при очередной итерации;
    • myElement – элемент словаря, к которому обращается цикл For Each… Next при выгрузке уникальных значений;
    • n – номер очередной строки при выгрузке уникальных значений на рабочий лист.

    Нетрадиционный способ отбора

    В этом примере используется нетрадиционный способ заполнения словаря. Он заключается в следующем: при присвоении переменной элемента словаря с несуществующим ключом, этот ключ добавляется в словарь со значением элемента Empty.

    Самое интересное заключается в том, что при попытке добавить неуникальный ключ, он просто не добавится, а ошибка сгенерирована не будет. Поэтому блоки операторов On Error Resume Next и On Error GoTo 0 не нужны.

    При традиционном способе также можно обойтись без строк On Error Resume Next и On Error GoTo 0, если использовать для отбора свойство Exists объекта Dictionary.

    Выгрузка уникальных значений

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

    В коде первого примера уникальные значения записываются и как элементы и как ключи, поэтому строку
    For Each myElement In myDictionary.Items
    можно заменить на
    For Each myElement In myDictionary.Keys.

    Если в коде второго примера необходимо уникальные значения записать не в столбец, а в строку, следует
    Range("B1").Resize(myDictionary.Count) = Application.Transpose(myDictionary.Keys)
    заменить на
    Range("B1").Resize(, myDictionary.Count) = myDictionary.Keys.

    Уникальные элементы из словаря можно выгрузить не только на рабочий лист, но и в динамический массив:

    Используя массив ключей или элементов словаря, очень просто заполнить уникальными элементами ComboBox:


    Смотрите, как удалить повторяющиеся значения из диапазона ячеек в VBA Excel с помощью метода Range.RemoveDuplicates и отобрать уникальные значения из списка с помощью объекта Collection.

    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.