Vba excel multiselect listbox заполнить столбец выделенными элементами
Отображает список значений и позволяет выбирать одно или несколько значений.
Комментарии
Если ListBox привязан к источнику данных, ListBox сохраняет выбранное значение в этом источнике данных.
ListBox может отображаться как список, так и как группа элементов управления OptionButton или CheckBox.
Свойство по умолчанию для ListBox — это свойство Value .
Событие по умолчанию для ListBox — событие Click .
В раскрывающийся элемент ListBox невозможно поместить текст.
Стили элемента ListBox
Вы можете выбрать любой из двух стилей представления элемента ListBox. Это выражается свойством ListStyle . Каждый из них реализует собственный способ выбора элементов в списке.
Если стиль 0, каждый элемент находится в отдельной строке; пользователь выбирает элемент, выделяя одну или несколько строк.
Если стиль 1, в начале каждой строки появляется OptionButton или CheckBox . В этом случае для выбора элемента пользователь нажимает кнопку или устанавливает флажок. Флажки отображаются только тогда, когда свойство MultiSelect является true.
События
Имя | Описание |
---|---|
Click | Возникает, когда пользователь окончательно выбирает значение для управления, которое имеет несколько возможных значений. |
Методы
Имя | Описание |
---|---|
AddItem | Для одного столбца ListBox метод AddItem добавляет элемент в список. Для многоуровневого ListBox этот метод добавляет строку в список. |
Clear | Удаляет все записи в списке в ListBox. |
RemoveItem | Удаляет строку из списка в ListBox. |
Свойства
Имя | Описание |
---|---|
BackColor | Возвращает или задает длинный, который указывает фоновый цвет объекта. Для чтения и записи. |
BorderColor | Возвращает или задает long , который указывает пограничный цвет объекта. Для чтения и записи. |
BorderStyle | Возвращает или задает набор integer , который указывает тип границы управления. Для чтения и записи. |
BoundColumn | Возвращает или задает вариант, определяя источник данных в многослойном ListBox. Для чтения и записи. |
Столбец | Возвращает или задает вариант, представляющие одно значение, столбец значений или двухмерный массив для загрузки в ListBox. Для чтения и записи. |
ColumnCount | Возвращает или задает long , представляют число столбцов, отображаемого в поле списка. Для чтения и записи. |
ColumnHeads | Возвращает или задает boolean , который указывает, отображается ли одна строка заголовков столбцов. Для чтения и записи. |
ColumnWidths | Возвращает или задает строку, которая указывает ширину каждого столбца в многослойном ListBox. Для чтения и записи. |
Enabled | Возвращает или задает boolean , который указывает, может ли управление получать фокус и реагировать на события, созданные пользователем. Для чтения и записи. |
ForeColor | Возвращает или задает длинный, который указывает цвет переднего плана объекта. Для чтения и записи. |
IMEMode | Возвращает или задает integer , который указывает режим времени работы по умолчанию редактора метода ввода (IME) для управления. Для чтения и записи. |
IntegralHeight | Возвращает или задает boolean , который указывает, отображает ли ListBox полные строки текста в списке или частичные строки. Для чтения и записи. |
Перечисление | Возвращает или задает вариант, представляющие указанную запись в ListBox. Для чтения и записи. |
ListCount | Возвращает длинный , который представляет количество записей списка в области управления. Только для чтения. |
ListIndex | Возвращает или задает вариант, представляющие выбранный в настоящее время элемент в ListBox. Для чтения и записи. |
ListStyle | Возвращает или задает набор integer , который указывает визуальное появление списка в ListBox. Для чтения и записи. |
Locked | Возвращает или задает boolean , который указывает, можно ли изменить управление. Для чтения и записи. |
MatchEntry | Возвращает или задает набор integer , который указывает, как ListBox выполняет поиск своего списка в качестве типов пользователей. Для чтения и записи. |
MouseIcon | Возвращает строку, которая представляет полное имя пути настраиваемого значка, назначенного для управления. Только для чтения. |
MousePointer | Возвращает или задает набор integer , который указывает тип указателя, отображаемого при позиционировании пользователя мыши над определенным объектом. Для чтения и записи. |
MultiSelect | Возвращает или задает набор integer , который указывает, разрешает ли объект несколько выборов. Для чтения и записи. |
Selected | Возвращает или задает boolean , который указывает состояние выбора элементов в ListBox. Для чтения и записи. |
SpecialEffect | Возвращает или задает набор integer , который указывает внешний вид объекта. Для чтения и записи. |
Text | Возвращает или задает строку, которая указывает текст в ListBox, изменяя выбранную строку в диспетчере. Для чтения и записи. |
TextAlign | Возвращает или задает набор integer , который указывает, как текст выравнивается в области управления. Для чтения и записи. |
TextColumn | Возвращает или задает вариант, который идентифицирует столбец в ListBox для отображения пользователю. Для чтения и записи. |
TopIndex | Возвращает или задает длинный , представляютельный индекс элемента списка, отображаемого в верхней позиции в списке. Для чтения и записи. |
Value (Значение) | Возвращает или задает вариант, который указывает значение в BoundColumn выбранных в настоящее время строк. Для чтения и записи. |
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
UserForm.ListBox – это элемент управления пользовательской формы, предназначенный для передачи в код VBA информации, выбранной пользователем из одностолбцового или многостолбцового списка.
Список используется в тех случаях, когда необходимо добавить в форму информацию, которая заранее известна, а ее отдельные позиции можно сгруппировать в список. Элемент управления ListBox оправдывает себя при небольших списках, так как большой список будет занимать много места на форме.
Использование полос прокрутки уменьшает преимущество ListBox перед элементом управления ComboBox, которое заключается в том, что при открытии формы все позиции для выбора на виду без дополнительных действий со стороны пользователя. При выборе информации из большого списка удобнее использовать ComboBox.
Элемент управления ListBox позволяет выбрать несколько позиций из списка, но эта возможность не имеет практического смысла. Ввести информацию в ListBox с помощью клавиатуры или вставить из буфера обмена невозможно.
Свойства списка
Свойство | Описание |
---|---|
ColumnCount | Указывает количество столбцов в списке. Значение по умолчанию = 1. |
ColumnHeads | Добавляет строку заголовков в ListBox. True – заголовки столбцов включены, False – заголовки столбцов выключены. Значение по умолчанию = False. |
ColumnWidths | Ширина столбцов. Значения для нескольких столбцов указываются в одну строку через точку с запятой (;). |
ControlSource | Ссылка на ячейку для ее привязки к элементу управления ListBox. |
ControlTipText | Текст всплывающей подсказки при наведении курсора на ListBox. |
Enabled | Возможность выбора элементов списка. True – выбор включен, False – выключен*. Значение по умолчанию = True. |
Font | Шрифт, начертание и размер текста в списке. |
Height | Высота элемента управления ListBox. |
Left | Расстояние от левого края внутренней границы пользовательской формы до левого края элемента управления ListBox. |
List | Позволяет заполнить список данными из одномерного или двухмерного массива, а также обращаться к отдельным элементам списка по индексам для записи и чтения. |
ListIndex | Номер выбранной пользователем строки. Нумерация начинается с нуля. Если ничего не выбрано, ListIndex = -1. |
Locked | Запрет возможности выбора элементов списка. True – выбор запрещен**, False – выбор разрешен. Значение по умолчанию = False. |
MultiSelect*** | Определяет возможность однострочного или многострочного выбора. 0 (fmMultiSelectSingle) – однострочный выбор, 1 (fmMultiSelectMulti) и 2 (fmMultiSelectExtended) – многострочный выбор. |
RowSource | Источник строк для элемента управления ListBox (адрес диапазона на рабочем листе Excel). |
TabIndex | Целое число, определяющее позицию элемента управления в очереди на получение фокуса при табуляции. Отсчет начинается с 0. |
Text | Текстовое содержимое выбранной строки списка (из первого столбца при ColumnCount > 1). Тип данных String, значение по умолчанию = пустая строка. |
TextAlign | Выравнивание текста: 1 (fmTextAlignLeft) – по левому краю, 2 (fmTextAlignCenter) – по центру, 3 (fmTextAlignRight) – по правому краю. |
Top | Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края элемента управления ListBox. |
Value | Значение выбранной строки списка (из первого столбца при ColumnCount > 1). Value – свойство списка по умолчанию. Тип данных Variant, значение по умолчанию = Null. |
Visible | Видимость списка. True – ListBox отображается на пользовательской форме, False – ListBox скрыт. |
Width | Ширина элемента управления. |
* При Enabled в значении False возможен только вывод информации в список для просмотра.
** Для элемента управления ListBox действие свойства Locked в значении True аналогично действию свойства Enabled в значении False.
*** Если включен многострочный выбор, свойства Text и Value всегда возвращают значения по умолчанию (пустая строка и Null).
В таблице перечислены только основные, часто используемые свойства списка. Еще больше доступных свойств отображено в окне Properties элемента управления ListBox, а все методы, события и свойства – в окне Object Browser.
Вызывается Object Browser нажатием клавиши «F2». Слева выберите объект ListBox, а справа смотрите его методы, события и свойства.
Свойства BackColor, BorderColor, BorderStyle отвечают за внешнее оформление списка и его границ. Попробуйте выбирать доступные значения этих свойств в окне Properties, наблюдая за изменениями внешнего вида элемента управления ListBox на проекте пользовательской формы.
Способы заполнения ListBox
Используйте метод AddItem для загрузки элементов в список по одному:
Ранее я рассмотрел методы создания пользовательских форм и основы работы с ними (если вы никогда не работали с пользовательскими формами, рекомендую для начала прочитать указанную заметку). Далее привел целый ряд практически полезных примеров пользовательских диалоговых окон. В настоящей заметке подробнее рассказывается об использовании элемента управления ListBox.[1]
Рис. 1. Установка свойства RowSource на этапе разработки
Элемент управления ListBox довольно гибкий в использовании, но работа с ним может оказаться достаточно сложной. В большинстве случаев методы, описанные здесь, могут применяться и для работы с элементом управления ComboBox.
При работе с элементом управления ListBox следует учитывать, что:
- Опции списка элемента управления ListBox могут извлекаться из диапазона ячеек (определяемого свойством RowSource) или добавляться с помощью VBA (для этого используется метод Addltem).
- Элемент управления ListBox может быть применен для выделения одной или нескольких опций. Соответствующее поведение определяется значением свойства MultiSelect.
- Если элемент управления ListBox не настроен на выделение нескольких опций, то значение элемента управления ListBox может связываться с ячейкой листа с помощью свойства ControlSource.
- Элемент управления ListBox может отображаться без предварительно выбранной опции (для этого необходимо установить свойство Listlndex равным –1). Но как только пользователь выделит одну из опций списка, отменить выделение будет невозможно. Исключение из этого правила— значение свойства MultiSelect равно True.
- Элемент управления ListBox может содержать несколько столбцов (что указывается в свойстве ColumnCount) и даже описательные заголовки (для этого используется свойство ColumnHeads).
- Вертикальный размер элемента управления ListBox, помещенного в пользовательское диалоговое окно, не всегда совпадает с вертикальным размером объекта UserForm на экране.
- Опции списка элемента управления ListBox могут отображаться в виде флажков, если разрешено выделение нескольких элементов, или в виде переключателей, если поддерживается только единичное выделение. Это поведение определяется значением свойства ListStyle.
Добавление опций в элемент управления ListBox
Перед отображением пользовательского диалогового окна, которое содержит элемент управления ListBox, следует заполнить элемент управления ListBox необходимыми опциями. Элемент управления ListBox заполняется на этапе разработки проекта посредством указания диапазона ячеек, которые содержат необходимые данные. Его также можно заполнить на этапе выполнения, воспользовавшись кодом VBA для добавления всех опций списка.
В двух примерах этого раздела предполагается следующее:
- используется диалоговое окно UserForm с именем UserForm1;
- диалоговое окно UserForm1 содержит элемент управления ListBox, который называется ListBox1;
- рабочая книга содержит лист Лист1, в диапазоне А1:А12 которого определены опции, отображаемые в элементе управления ListBox.
Добавление опций в элемент управления ListBox на этапе разработки
Для добавления опций в элемент управления ListBox на этапе разработки необходимо, чтобы они хранились в диапазоне ячеек рабочей книги. Воспользуйтесь свойством RowSource для указания диапазона, который содержит опции элемента управления ListBox. На рис. 1 показано окно Properties для элемента управления ListBox (см. также файл listbox fill.xlsm) Свойство RowSource установлено равным Лист1!А1: А12. Когда диалоговое окно UserForm отображается на экране, элемент управления ListBox содержит двенадцать опций из этого диапазона. Опции добавляются в элемент управления ListBox на этапе разработки, сразу после того, как диапазон определяется в качестве значения свойства RowSource.
Удостоверьтесь, что в значении свойства RowSource присутствует имя листа. В противном случае элемент управления ListBox будет применять указанный диапазон в активном рабочем листе. Иногда следует идентифицировать диапазон максимально точно, указав даже имя рабочей книги. Лучше всего сначала определить имя для диапазона, а затем включить его в состав разработанного кода. Это гарантирует использование требуемого диапазона, даже если были добавлены или удалены строки, не входящие в диапазон.
Добавление опций в элемент управления ListBox на этапе выполнения
Чтобы добавить опции элемента управления ListBox на этапе выполнения, необходимо:
- с помощью кода определить значение свойства RowSource, чтобы указать диапазон, хранящий необходимые данные;
- создать код, использующий метод Addltem для добавления опций в элемент управления ListBox.
Следующая процедура устанавливает значения свойства RowSource элемента управления ListBox перед тем, как отображается диалоговое окно UserForm. В этом случае опции состоят из значений в ячейках диапазона Categories рабочего листа Budget:
UserForml.ListBoxl.RowSource = " Budget!Categories "
UserForml.Show
Если опции элемента управления ListBox не содержатся в диапазоне ячеек листа, то можно создать специальный код VBA для заполнения элемента управления ListBox перед кодом отображения диалогового окна. Следующая процедура заполняет окно списка элемента управления ListBox названиями месяцев года с помощью метода Addltem:
«VBA Excel ListBox Multiselect»
Привязка диапазона данных к ListBox.
Добавление, удаление пунктов списка.
Сортировка списка и множественный выбор элементов.
ListBox или «окно со списком» – это один из элементов управления, который может быть расположен на форме для предоставления пользователю возможности выбора одного или нескольких элементов (пунктов) из предоставленного множества (списка) вариантов …
- Через свойство RowSource (источник строк) в список загружается определенный диапазон (колонка ячеек). В этом случае добавление новых пунктов в список или удаление существующих из списка в процессе выполнения макросов VBA не возможно… (по крайней мере, до момента присвоения свойству RowSource значения пустой строки).
- Через методы AddItem и RemoteItem (добавление или удаление пунктов списка)… Повторю, что для такой возможности, свойство RowSource должно иметь пустое значение.
Привязка к списку диапазона значений через свойство RowSource
Считаю, что для удобства реальной работы со списками на листах Excel (добавление новых значений в ячейки соответствующих колонок или удаление существующих) необходимо использовать функцию для автоматического определения номера последней заполненной строки в указанном столбце…
Метод Find объектов класса Range (рекомендую заглянуть в его справку) очень помогает в этом вопросе….
И так, функция может выглядеть, например, следующим образом….
Function GetLastRowFromColumn(numColumn As Integer) As Integer
GetLastRowFromColumn = Columns(numColumn).Cells.Find("*", , , , xlByRows, xlPrevious).Row
End Function
Как видите, единственным параметром она получает номер колонки (правда, для простоты я оставил всего один лист в книге, а иначе бы лист тоже пришлось бы указать как параметр), а возвращает номер строки той ячейки, которую вернул метод Find…
Тогда обработчики событий щелчков мышью по радиокнопкам будут выглядеть так…
Private Sub OptionButton1_Click()
lastrow = GetLastRowFromColumn(1)
If OptionButton1 Then Me.ListBox1.RowSource = "=A1:A" & lastrow
End Sub
Private Sub OptionButton2_Click()
lastrow = GetLastRowFromColumn(2)
If OptionButton2 Then Me.ListBox1.RowSource = "=B1:B" & lastrow
End Sub
Private Sub OptionButton3_Click()
lastrow = GetLastRowFromColumn(3)
If OptionButton3 Then Me.ListBox1.RowSource = "=C1:C" & lastrow
End Sub
Можно было бы и еще упростить (до одной строки в процедуре),
Me.ListBox1.RowSource = "=A1:A" & GetLastRowFromColumn(1)
но считаю, что наличие переменной lastrow помогает просматривать ее значение при отладке, а это сэкономленное время…. которое дороже, чем уменьшение объема кода…
В общем, первая радиокнопка помещает в список диапазон из колонки А (используя свойство RowSource), а вторая и третья, соответственно, из колонок В и С…
Множественный выбор
Основное свойство элемента ListBox – это List… индексированный список значений… (As Variant) Поэтому к любому элементу списка можно обратиться по индексу… ,например List(idx)…
И так же важно второе индексированное свойство Selected(idx), которое представляет собой массив логических величин, показывающий, выделен ли конкретный элемент списка пользователем или нет…
Private Sub CommandButton1_Click()
Dim n As Integer, s As String
s = ""
For n = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(n) Then
s = s & Me.ListBox1.List(n) & vbLf
End If
Next n
If s = "" Then
MsgBox "Нет выбранных пунктов", 0, "Выбранные пункты списка"
Else
MsgBox s, 0, "Выбранные пункты списка"
End If
Сортировка списка
А вот для сортировки списка нам придется отказаться от свойства RowSource , т.к. изменение порядка элементов списка будет противоречить привязанному диапазону. VBA справедливо заругается…
Вот процедура сортировки объекта ListBox (который передается в виде параметра As Object)
Sub mySort(aL As Object)
Dim locList() As Variant, siz As Long
'Сортирует список ListBox (свойство .List - как массив Variant)
Dim j As Long
siz = UBound(aL.List)
ReDim locList(UBound(aL.List))
For j = 0 To siz
locList(j) = .List(j)
Next j
.RowSource = ""
.Clear
mySortArray locList
For j = 0 To siz
.AddItem (locList(j))
Next j
End With
End Sub
Как видите, сначала создаем массив locList() нужной размерности и заполняем его элементами списка…
Затем отвязываем список от диапазона (aL.RowSource = "") и очищаем его (aL.Clear) …
А полученный массив сортируем обычным образом (любым из алгоритмов сортировки).
Все. Осталось загрузить отсортированный массив в список, используя метод AddItem, конечно же, в цикле…
Для возможности множественного выбора элементов списка, не забудьте задать свойство
ListBox1.MultiSelect = fmMultiSelectMulti
…
…
Все…
Используйте свойство MultiSelect , чтобы указать, может ли пользователь сделать несколько выборов в поле списка в форме и как можно сделать несколько выборов. Чтение и написание Byte.
Синтаксис
выражения. MultiSelect
выражение Переменная, представляющие объект ListBox .
Примечания
Свойство MultiSelect использует следующие параметры.
Setting | Visual Basic | Описание |
---|---|---|
Нет | 0 | (По умолчанию) Несколько вариантов не разрешены. |
Простой | 1 | Несколько элементов выбираются или отбираются, выбрав их с помощью мыши или нажав пробел. |
Долго | 2 | Несколько элементов выбираются, удерживая Shift и выбирая их с помощью мыши, или удерживая Shift и нажимая клавишу стрелки, чтобы расширить выбор от ранее выбранного элемента до текущего элемента. Вы также можете выбрать элементы, перетаскив с помощью мыши. Удержание Ctrl и выбор элемента выбирает или отбирает этот элемент. |
Это свойство может быть заданной только в представлении Design form.
Чтобы вернуть номер индекса для выбранного элемента, используйте свойство ListIndex . Если свойство MultiSelect настроено на Расширенное или Простое, для определения выбранных элементов можно использовать выбранное свойство поле списка или коллекцию ItemsSelected. Кроме того, если свойство MultiSelect настроено на Extended или Simple, значение управления полем списка всегда будет null.
Если свойство MultiSelect настроено на Extended, повторное выделение списка очищает все выборы, сделанные пользователем.
Пример
Чтобы вернуть значение свойства MultiSelect для окна списка с именем Страна в форме входа заказа, можно использовать следующее.
Чтобы установить свойство MultiSelect , можно использовать следующее.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Читайте также: