Элемент управления ListView в VBA Excel: режимы отображения данных, заполнение ListView в режиме отчета, извлечение данных из выделенной строки.
Элемент управления ListView

Элемент управления ListView является мощным инструментом для форм VBA Excel (UserForm), позволяющим отображать данные в виде значков, простого списка или списка с возможностью организации данных в столбцы, аналогично таблице или проводнику Windows. Он предназначен для создания пользовательских интерфейсов в формах, где требуется удобный просмотр, сортировка и взаимодействие с данными.
Элемент управления формы ListView чаще всего используется в VBA Excel для отображения данных в виде настраиваемого списка с колонками (в виде таблицы). Он является идеальным инструментом для отображения больших объемов информации в структурированном и удобном для пользователя виде.
Элемент управления ListView входит в набор элементов управления Microsoft Windows Common Controls и чаще всего используется в приложениях, где требуется:
- выводить списки с несколькими колонками;
- сортировать данные;
- добавлять иконки и изображения к элементам;
- предоставлять пользователю удобный интерфейс для выбора и анализа информации.
Например, с помощью ListView можно создать список товаров с ценами, каталог файлов, базу клиентов или даже мини-таблицу, которая будет взаимодействовать с листами Excel. Таким образом, ListView превращает обычные формы VBA в полноценные интерфейсы для работы с данными.
Режимы отображения ListView
ListView поддерживает несколько режимов отображения (свойство View):
- Значки (lvwIcon) – по теории: заголовки элементов с крупными иконками, а по факту: небольшие значки с текстом внутри.
- Мелкие значки (lvwSmallIcon) – заголовки элементов с небольшими иконками.
- Список (lvwList) – простой список элементов в один столбец.
- Отчет (lvwReport) – таблица с колонками и строками (аналог таблицы Excel). Это наиболее детализированный вид.
На практике в VBA Excel чаще всего применяется режим Отчет, так как он позволяет создавать многостолбцовые списки (таблицы).
Основные свойства ListView
Вот ключевые свойства, которые позволяют гибко настраивать и эффективно использовать ListView:
| Свойство | Описание |
|---|---|
| View | Определяет режим отображения (0 – Icon, 1 – SmallIcon, 2 – List, 3 – Report). |
| ColumnHeaders | Коллекция заголовков столбцов в режиме lvwReport. Позволяет добавлять, удалять и изменять столбцы. |
| ListItems | Коллекция элементов списка. В режиме lvwReport каждый ListItem может иметь основной текст и набор подэлементов (SubItems), которые отображаются в соответствующих столбцах. |
| FullRowSelect | Выделение всей строки. Логическое свойство. Если True, при выборе элемента выделяется вся строка, а не только первый столбец. |
| GridLines | Отображение сетки. Логическое свойство. Если True, отображаются линии сетки между столбцами и строками в режиме lvwReport. |
| MultiSelect | Множественный выбор. Логическое свойство. Если True, пользователь может выбирать несколько элементов в списке. |
| Sorted | Сортировка элементов. Логическое свойство. Если True, элементы в списке будут автоматически отсортированы по столбцу, указанному в свойстве SortKey. |
| SortKey | Ключ сортировки. Целое число, указывающее индекс столбца (начиная с 0), по которому будет производиться сортировка, если установлено в True. |
| SortOrder | Порядок сортировки. Определяет порядок сортировки (lvwAscending — по возрастанию, lvwDescending — по убыванию). |
| LabelEdit | Возможность редактирования. Текст элемента в списке можно изменять вручную* (0 — lvwAutomatic) или только из кода (1 — lvwManual). |
| CheckBoxes | Отображение чекбоксов. Логическое свойство. Если True, рядом с элементами отображаются чекбоксы. |
| HideSelection | Скрытие выделения. Логическое свойство. Если True, выделение строк будет скрыто при потере элементом управления фокуса. |
* Это касается только элементов списка, тексты подэлементов не редактируются в обоих случаях.
Методы и события ListView
ListView предоставляет следующие методы для построения списка:
- ColumnHeaders.Add(Key, Text, Width): добавляет заголовок и задает ширину столбца.
- ListItems.Add(Key, Text): добавляет новый элемент списка.
- ListSubItems.Add(Key, Text): добавляет подэлемент к существующему элементу.
- Clear: очищает список, необходимо использовать перед каждой перезаписью ListView .
- AutoResizeColumn(ColumnIndex): автоматически подстраивает ширину столбца.
Ключевые события:
- ItemClick: срабатывает при клике на элемент.
- ItemCheck: срабатывает при клике на чекбокс.
- ColumnClick: срабатывает при клике на заголовок столбца, обычно используется для сортировки.
- BeforeLabelEdit / AfterLabelEdit: срабатывает перед / после редактирования текста элемента.
Примеры использования ListView
Добавление ListView на UserForm
Выполните следующие шаги для добавления элемента управления ListView на пользовательскую форму:
- Откройте редактор VBA (Alt + F11).
- В редакторе VBA выберите Tools → References.
- Найдите и активируйте библиотеку Microsoft Windows Common Controls, если она ещё не активирована.
- Создайте новую форму (Insert → UserForm).
- Если панели элементов управления не видно, откройте ее (View → Toolbox).
- Щелкните правой кнопкой мыши на панели элементов управления и выберите «Additional Controls…» (Дополнительные элементы управления…).
- Найдите «Microsoft ListView Control» и добавьте его на панель.
- Перетащите элемент ListView с панели элементов на вашу UserForm.
Заполнение ListView в режиме отчета
Пример использования ListView для отображения списка сотрудников с их ФИО, должностью и отделом. Добавьте следующий код в модуль UserForm:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Private Sub UserForm_Initialize() ' Настройка формы With Me .Caption = "Список сотрудников" .Width = 300 .Height = 160 End With With Me.ListView1 ' Настройка режима отображения .View = lvwReport .Gridlines = True .FullRowSelect = True .Left = Me.Left .Top = Me.Top .Width = Me.Width ' По ширине разворачиваем на всю форму .Height = Me.Height - 70 ' Внизу оставляем место для кнопок ' Добавляем колонки с заголовками и задаем ширину .ColumnHeaders.Add , , "ID", 30 ' Заголовок 1, но столбец 0 .ColumnHeaders.Add , , "ФИО", 80 ' Заголовок 2, но столбец 1 .ColumnHeaders.Add , , "Должность", 80 ' Заголовок 3, но столбец 2 .ColumnHeaders.Add , , "Отдел", 105 ' Заголовок 4, но столбец 3 ' Добавляем строки Dim itm As ListItem Set itm = .ListItems.Add(, , "1") ' Элемент 1-й строки (0 столбец) itm.SubItems(1) = "Иванов И.И." ' Подэлемент 1-й строки (1 столбец) itm.SubItems(2) = "Менеджер" ' Подэлемент 1-й строки (2 столбец) itm.SubItems(3) = "Отдел продаж" ' Подэлемент 1-й строки (3 столбец) Set itm = .ListItems.Add(, , "2") itm.SubItems(1) = "Петров П.П." itm.SubItems(2) = "Аналитик" itm.SubItems(3) = "Финансовый отдел" Set itm = .ListItems.Add(, , "3") itm.SubItems(1) = "Сидоров С.С." itm.SubItems(2) = "Программист" itm.SubItems(3) = "ИТ-отдел" End With End Sub |
Результат работы кода:

В первом столбце идут элементы (ListItems), а в столбцах справа от элементов — подэлементы (SubItems).
Сортировка данных в ListView-отчетах
Добавьте в модуль формы следующую процедуру:
|
1 2 3 4 5 6 7 |
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) With Me.ListView1 .Sorted = True .SortKey = ColumnHeader.SubItemIndex ' Сортировка по выбранному столбцу .SortOrder = IIf(.SortOrder = 1, 0, 1) ' Переключение порядка сортировки End With End Sub |
Теперь при клике по заголовку любого столбца произойдет сортировка строк по данным этого столбца. При первом клике будет порядок сортировки — по убыванию, при втором — по возрастанию, при третьем — снова по убыванию и так далее.
Небольшое пояснение:
ColumnHeader.SubItemIndex— номер столбца, нумерация начинается с 0;ColumnHeader.Index— номер заголовка, нумерация начинается с 1.
Добавление чекбоксов к элементам
Добавить чекбоксы к элементам ListView очень просто. Вставьте в код инициализации формы, размещенный выше, в раздел «Настройка режима отображения» еще одну строку:
|
1 |
.CheckBoxes = True ' Отображаем чекбоксы перед элементами |
Результат будет следующий:

Пример взаимодействия с чекбоксами с помощью кода VBA Excel:
|
1 2 3 4 5 6 7 8 |
Private Sub ListView1_ItemCheck(ByVal Item As MSComctlLib.ListItem) ' Проверяем состояние флажка If Item.Checked Then MsgBox "Флажок элемента '" & Item.Text & "' установлен." Else MsgBox "Флажок элемента '" & Item.Text & "' снят." End If End Sub |
Вставьте эту процедуру в модуль формы, и, при клике по чекбоксу, вы будете узнавать о состоянии его флажка.
Вывод данных из выделенной строки
Добавьте на форму элемент управления CommandButton1 (кнопка) и в модуль формы вставьте следующий код:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Sub CommandButton1_Click() Dim sItem As ListItem Set sItem = ListView1.selectedItem If Not sItem Is Nothing Then MsgBox "Выбрана строка:" & vbNewLine & _ "ID = " & sItem.Text & vbNewLine & _ "ФИО = " & sItem.ListSubItems(1).Text & vbNewLine & _ "Должность = " & sItem.ListSubItems(2).Text & vbNewLine & _ "Отдел = " & sItem.ListSubItems(3).Text Else MsgBox "Строка не выбрана!" End If End Sub |
Клик по кнопке будет выводить информацию из выбранной строки.
Заключение
ListView в VBA Excel — это универсальный элемент для создания интерактивных форм, превосходящий ListBox по функциональности. Он значительно расширяет возможности стандартных пользовательских форм и превращает их в полноценные интерфейсы для работы с данными.
Об использовании элемента управления ListView в режиме значков смотрите в продолжении этой статьи.