«VBA Excel ListBox Multiselect»
Прив'язка діапазону даних до ListBox.
Додавання, видалення елементів списку.
Сортування списку і множинний вибір елементів.
ListBox або «вікно зі списком» - це один з елементів управління, який може бути розташований на формі для надання користувачеві можливості вибору одного або декількох елементів (пунктів) з наданого безлічі (списку) варіантів ...
-
VBA надає дві можливості заповнення списку ListBox ...
Розмістити на формі кілька радіокнопок, що дозволяють завантажувати в елемент ListBox1 списки з різних колонок листа Excel.
Забезпечити можливість сортування завантажених списків в ListBox1.
Забезпечити можливість множинного вибору елементів зі списку і висновок результату вибору в вікно повідомлень MsgBox.
Прив'язка до списку діапазону значень через властивість 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
Він формує рядок s. тільки з виділених пунктів списку і виводить відповідне повідомлення ... Вбудована константа vbLf означає перехід на новий рядок ...
Сортування списку
А ось для сортування списку нам доведеться відмовитися від властивості 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
...
...
Усе…
Завантажити файл для тестування
Умови отримання коду? Показати?
Інші приклади на тему «Автоматизація документів Microsoft Office Excel, Word, Access»
Інші приклади на мові «Visual Basic»
Інші приклади на мові «Visual Basic for application - VBA»