Анонс и файл-пример был выставлен на моём телеграмм-канале пару дней назад. Приятно, что читатели уже заранее скачивают пример.
Иногда при работе с данными нам нужно отобразить в элементе управления ListBox только уникальные значения из существующего списка. Например, у нас есть столбец с данными в котором указаны имена людей, и они повторяются. Нам нужно заполнить ListBox уникальными именами, исключив повторы.
Использование коллекции для удаления дубликатов
Для этой задачи отлично подходит объект Collection. Коллекция позволяет хранить уникальные элементы и предотвращает добавление дубликатов. В этой статье мы попробуем разобраться, как реализовать это на VBA.
📌 Скачать файл пример, можно в конце статьи.
Что такое Collection?
Коллекция — это структура данных, которая позволяет хранить набор элементов и получать к ним доступ с использованием уникальных ключей. Элементы в объект Collection добавляются с помощью следующей инструкции:
объект.Add элемент, ключ, до, после
где:
- элемент — добавляемый объект.
- ключ — уникальная текстовая строка для доступа к элементам коллекции (может быть пропущен).
- до и после — параметры, определяющие позицию вставки элемента (не обязательны).
Если при добавлении элемента в коллекцию указать неуникальный ключ, произойдет ошибка, и элемент не будет добавлен. Именно этим поведением мы и воспользуемся для создания коллекции с уникальными элементами.
Процедура начинается с создания нового объекта Collection, который называется УникальныеЭлементы. Диапазон (созданный мной «A2: A655») под названием ИМЕНА содержит список элементов, среди которых есть повторяющиеся (создание именованных диапазонов в более ранних статьях).
Код проходит по ячейкам диапазона в цикле, добавляя в коллекцию УникальныеЭлементы только уникальные значения. Значение каждой ячейки (преобразованное в строку) используется в качестве ключа. Оператор On Error Resume Next позволяет VBA игнорировать ошибки, возникающие при попытке добавить в коллекцию дублирующийся ключ. Если возникает ошибка, элемент не добавляется, что соответствует нашей цели. Затем процедура передает уникальные элементы из коллекции в элемент управления ListBox. В форме UserForm1 также содержатся две надписи, указывающие количество уникальных элементов в коллекции и общее количество элементов.
Макрос выглядит следующим образом (в коде есть пояснения):
В модуле формы на кнопе «Ок» пропишем следующий код:
При выборе элемента ListBox и нажатии Ок выходит сообщение:
Когда писал статью, все имена в диапазоне были по алфавиту. Чтобы перемешать значения есть макрос ПеремешатьИмена, который бонусом находится в файл-примере в модуле1. Можете его подстроить под свои нужды.
✔ На моём телеграмм-канале можно СКАЧАТЬ ФАЙЛ ПРИМЕР
✔ СКАЧАТЬ ФАЙЛ ПРИМЕР с Яндекс Диска