Найти тему
VBA Excel с нуля

VBA Excel № 165. Изучаем элемент управления ListBox

Оглавление
Скриншот с моего ноутбука
Скриншот с моего ноутбука

Анонс и файл пример был выложен за 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-код для добавления опций.

Посмотрим на это при следующих условиях:

  1. Диалоговое окно с именем UserForm1.
  2. В диалоговом окне UserForm1 есть элемент управления ListBox1.
  3. В рабочей книге на листе Лист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.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

На каждый макрос в файле примере назначена кнопка:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

✔ СКАЧАТЬ ФАЙЛ ПРИМЕР можно через мой одноимённый телеграмм канал по ссылке.

СКАЧАТЬ ФАЙЛ ПРИМЕР с Яндекс диска

Наука
7 млн интересуются