Vba excel multiselect listbox заполнить столбец выделенными элементами
Добрый день программисты.
Как мне проделать, довольно простую манипуляцию, из ListBox1 выделить один или несколько элементов и занести их в ячейки?
Добрый день программисты.
Как мне проделать, довольно простую манипуляцию, из ListBox1 выделить один или несколько элементов и занести их в ячейки?
Как мне проделать, довольно простую манипуляцию, из ListBox1 выделить один или несколько элементов и занести их в ячейки?
Спасибо Автор - lopuxi
Дата добавления - 02.06.2015 в 15:24
если листбокс с мультивыбором то надо циклом пройтись по всем элементам списка [/vba]
если листбокс с мультивыбором то надо циклом пройтись по всем элементам списка wild_pig [/vba]
если листбокс с мультивыбором то надо циклом пройтись по всем элементам списка Автор - wild_pig
Дата добавления - 02.06.2015 в 15:44
Да, как вот несколько элементов выбрать?
Как правильно использовать ListBox1.MultiSelect?
У меня выбор остается None, я могу выбрать лишь один элемент.
Я прикреплю код. У меня уже в других операциях заполняется listbox1 и потом я должен выбрать в нем нужные мне элементы и по нажатию кнопки, они будут добавлять к списку.
Мне вот нужно
1. Это сделать MultiSelect
2. Получить числовое значение(кол-во) выбранных элементов
Да, как вот несколько элементов выбрать?
Как правильно использовать ListBox1.MultiSelect?
У меня выбор остается None, я могу выбрать лишь один элемент.
Я прикреплю код. У меня уже в других операциях заполняется listbox1 и потом я должен выбрать в нем нужные мне элементы и по нажатию кнопки, они будут добавлять к списку.
Мне вот нужно
1. Это сделать MultiSelect
2. Получить числовое значение(кол-во) выбранных элементов
У меня выбор остается None, я могу выбрать лишь один элемент.
Я прикреплю код. У меня уже в других операциях заполняется listbox1 и потом я должен выбрать в нем нужные мне элементы и по нажатию кнопки, они будут добавлять к списку.
Мне вот нужно
1. Это сделать MultiSelect
2. Получить числовое значение(кол-во) выбранных элементов
Список используется в тех случаях, когда необходимо добавить в форму информацию, которая заранее известна, а ее отдельные позиции можно сгруппировать в список. Элемент управления 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 для загрузки элементов в список по одному:
Вы можете использовать свойство 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 и обратная связь.
Ранее я рассмотрел методы создания пользовательских форм и основы работы с ними (если вы никогда не работали с пользовательскими формами, рекомендую для начала прочитать указанную заметку). Далее привел целый ряд практически полезных примеров пользовательских диалоговых окон. В настоящей заметке подробнее рассказывается об использовании элемента управления 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:
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
…
…
Все…
Читайте также: