Анонс и файл пример был выложен за 2 дня до выхода этой статьи на моём телеграмм-канале
Эффективное использование элемента управления ListBox в VBA
Элемент управления ListBox предоставляет пользователям интерфейса возможность выбора одного или нескольких элементов из списка. Это хороший инструмент, однако для его использования требуется знание некоторых тонкостей. В этой статье давайте более подробно рассмотрим примеры и методики работы с ListBox.
- Элементы в ListBox могут добавляться как через диапазон ячеек в Excel (свойство RowSource), так и кодом VBA с использованием методов AddItem или List.
- Свойство MultiSelect определяет, может ли пользователь выбрать один или несколько элементов в ListBox. Значение MultiSelect может быть:
- 0 (fmMultiSelectSingle): только один элемент может быть выбран.
- 1 (fmMultiSelectMulti): несколько элементов могут быть выбраны.
- 2 (fmMultiSelectExtended): позволяет выбирать элементы с использованием клавиш Shift и Ctrl.
- Если в ListBox можно выбрать, например, только один элемент, его значение можно связать с ячейкой в Excel с помощью свойства ControlSource.
- Элемент управления ListBox может отображаться без предварительно выбранных элементов, если свойство ListIndex установлено в -1. Однако, если пользователь выберет элемент, его невозможно будет отменить, если только значение свойства MultiSelect не равно True.
- ListBox может содержать несколько столбцов, что указывается в свойстве ColumnCount. Можно также добавить заголовки столбцов, используя свойство ColumnHeads.
- Свойство ListStyle определяет, как будут отображаться элементы списка: в виде флажков для множественного выбора или в виде переключателей для одиночного выбора.
- Когда вы размещаете элемент управления ListBox в пользовательском диалоговом окне (UserForm), нужно учесть, что его вертикальный размер может не совпадать с вертикальным размером самого UserForm.
📌 Скачать файл пример, можно в конце статьи.
Итак, создадим форму с ЭУ ListBox, кнопкой и простым модулем:
На листе "Лист1" введем данные
Добавление опций в элемент управления ListBox
Перед тем как показать пользовательское диалоговое окно с элементом управления ListBox, нужно наполнить его необходимыми опциями. Это можно сделать на этапе разработки проекта, выбрав диапазон ячеек с нужными данными, либо на этапе выполнения, используя VBA-код для добавления опций.
Посмотрим на это при следующих условиях:
- Диалоговое окно с именем UserForm1.
- В диалоговом окне UserForm1 есть элемент управления ListBox1.
- В рабочей книге на листе Лист1 в диапазоне A1:A7 содержатся опции для ListBox1.
Добавление опций на этапе разработки
Для того чтобы добавить опции на этапе разработки, они должны быть сохранены в диапазоне ячеек рабочей книги. Используйте свойство RowSource, чтобы указать этот диапазон. Например, свойство RowSource может быть установлено как Лист1!A1:A7.
После того как значение RowSource установлено, элемент управления ListBox1 будет автоматически содержать все значения из диапазона A1:A7 на листе Лист1.
UserForm1.ListBox1.RowSource = "Лист1!A1:A7"
Проверка корректности диапазона
Убедитесь, что вы указали имя листа в значении свойства RowSource (в нашем случае Лист1). Если это не сделать, то элемент управления ListBox будет использовать диапазон с активного листа.
А ещё лучше определить имя диапазона на уровне всей рабочей книги и использовать его в коде (я назвал Неделя).
Добавление опций на этапе выполнения
Для добавления опций на этапе выполнения нужно использовать VBA-код. Рассмотрим несколько способов.
Установка значения RowSource в коде
Добавление опций с использованием метода AddItem
Если опции не содержатся в диапазоне ячеек, можно использовать метод AddItem для добавления опций в элемент управления ListBox до отображения диалогового окна.
Или:
Хочу обратить ваше внимание, что в данном примере сначала свойству RowSource присваивается пустая строка. Это помогает избежать возможной ошибки, которая может возникнуть, если в окне свойств (Properties) у элемента управления ListBox уже задано какое-либо значение для свойства RowSource. Если попытаться добавить опции в ListBox при ненулевом значении свойства RowSource, появится сообщение об ошибке "permission denied" (отказано в доступе).
Добавление опций из диапазона с помощью цикла
Использование свойства List
Свойство List позволяет проще добавить опции в элемент управления ListBox.
Обратите внимание, что для этого используется функция Transpose (транспонирование), поскольку свойство List требует ввод массива-строки, а диапазон ячеек в Excel представляет собой массив-столбец.
Пример использования одномерного массива
Функция Array возвращает одномерные массивы. Если данные хранятся в одномерном массиве, их также можно присвоить свойству List.
То же самое можно провернуть и с функцией Split в VBA для заполнения элемента управления ListBox.
На каждый макрос в файле примере назначена кнопка:
✔ СКАЧАТЬ ФАЙЛ ПРИМЕР можно через мой одноимённый телеграмм канал по ссылке.
✔ СКАЧАТЬ ФАЙЛ ПРИМЕР с Яндекс диска