Множественный выбор элементов списка ListBox с сортировкой

«VBA Excel ListBox Multiselect»
Привязка диапазона данных к ListBox.
Добавление, удаление пунктов списка.
Сортировка списка и множественный выбор элементов.

ListBox или «окно со списком» – это один из элементов управления, который может быть расположен на форме для предоставления пользователю возможности выбора одного или нескольких элементов (пунктов) из предоставленного множества (списка) вариантов …

VBA предоставляет две возможности заполнения списка ListBox

  • Через свойство RowSource (источник строк) в список загружается определенный диапазон (колонка ячеек). В этом случае добавление новых пунктов в список или удаление существующих из списка в процессе выполнения макросов VBA не возможно… (по крайней мере, до момента присвоения свойству RowSource значения пустой строки).
  • Через методы AddItem и RemoteItem (добавление или удаление пунктов списка)… Повторю, что для такой возможности, свойство RowSource должно иметь пустое значение.

Задание:

Разместить на форме несколько радиокнопок, позволяющих загружать в элемент ListBox1 списки из разных колонок листа Excel.
Обеспечить возможность сортировки загруженных списков в ListBox1.
Обеспечить возможность множественного выбора элементов из списка и вывод результата выбора в окно сообщений MsgBox.

Решение:

VBA Excel с помощью макросов ListBox Multiselect

Привязка к списку диапазона значений через свойство 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

End Sub

Он формирует строку 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))

     With aL

         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»


Поделиться в соц сетях:




Если на этой странице не нашлось того, что Вы так искали...

         Не расстраивайтесь, не все потеряно... Смело щелкайте...

исходный код на заказ. orenstudent.ru Автоматизация документов MS Office. orenstudent.ru исходный код на заказ. orenstudent.ru Помогите найти и устранить ошибку в исходном коде программы. orenstudent.ru Skype-консультирование по программированию
Скайп-консультации

Акция !!!
исходный код комментарии цена минимальная


требуются
школьники!


и СТУДЕНТЫ!
Кому не плевать
на деньги!
Сайт помощи студентам по программированию и информатике

Program code