Vba excel listbox multiselect - прив'язка діапазону даних до listbox; додавання, видалення пунктів

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

ListBox або «вікно зі списком» - це один з елементів управління, який може бути розташований на формі для надання користувачеві можливості вибору одного або декількох елементів (пунктів) з наданого безлічі (списку) варіантів ...
    VBA надає дві можливості заповнення списку ListBox ...
  • Через властивість RowSource (джерело рядків) в список завантажується певний діапазон (колонка осередків). В цьому випадку додавання нових пунктів в список або видалення існуючих зі списку в процесі виконання макросів VBA неможливо ... (по крайней мере, до моменту присвоєння властивості RowSource значення порожнього рядка).
  • Через методи AddItem і RemoteItem (додавання або видалення пунктів списку) ... Повторю, що для такої можливості, властивість RowSource повинно мати пусте значення.
  • Розмістити на формі кілька радіокнопок, що дозволяють завантажувати в елемент ListBox1 списки з різних колонок листа Excel.
    Забезпечити можливість сортування завантажених списків в ListBox1.
    Забезпечити можливість множинного вибору елементів зі списку і висновок результату вибору в вікно повідомлень MsgBox.

    Vba excel listbox multiselect - прив'язка діапазону даних до listbox; додавання, видалення пунктів

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

    Якщо на цій сторінці не знайшлося того, що Ви так шукали.