Заполнение ListBox данными с помощью кода VBA Excel. Добавление значений в список методом AddItem, с помощью свойств List и RowSource. Примеры.
В примерах используется событие пользовательской формы UserForm_Initialize, реализуемое в модуле формы. Это очень удобно при тестировании, когда запуск формы или кода приводит к одному результату. Кроме того, из модуля формы обращаться к форме можно с помощью ключевого слова «Me».
Создайте в редакторе VBA Excel пользовательскую форму с любым именем и разместите на ней список с именем ListBox1. Вставляйте в модуль формы код примера, запускайте код или форму и смотрите результат.
Чтобы запустить форму, фокус должен быть на ее проекте или на одном из ее элементов управления. Чтобы запустить код, курсор должен быть в одной из его строк. Запускается код или форма нажатием клавиши «F5» или треугольной кнопки «Run Sub/UserForm»:
Заполнение ListBox методом AddItem
Метод AddItem используется для загрузки отдельного элемента в ListBox. Он создает в списке новую строку и записывает в нее значение. Используя цикл, можно загрузить в ListBox одномерный массив.
Пример 1
Загрузка элементов в ListBox по отдельности:
1 2 3 4 5 6 7 8 |
Private Sub UserForm_Initialize() With Me.ListBox1 .AddItem "Зима" .AddItem "Весна" .AddItem "Лето" .AddItem "Осень" End With End Sub |
Результат работы кода:
Пример 2
Загрузка данных в ListBox из одномерного массива при помощи цикла VBA Excel:
1 2 3 4 5 6 7 8 9 |
Private Sub UserForm_Initialize() Dim myArray() As Variant, myElement As Variant myArray = Array("Зима", "Весна", "Лето", "Осень") With Me.ListBox1 For Each myElement In myArray .AddItem myElement Next End With End Sub |
Заполнение ListBox с помощью свойства List
Свойство List позволяет в коде VBA Excel скопировать целиком одномерный или двухмерный массив значений в элемент управления ListBox. А также добавлять данные в элементы двухмерного списка по их индексам в строки, созданные методом AddItem.
Пример 3
Заполнение списка данными из одномерного массива.
Загрузка значений, возвращенных функцией Array:
1 2 3 |
Private Sub UserForm_Initialize() Me.ListBox1.List = Array("Зима", "Весна", "Лето", "Осень") End Sub |
Загрузка значений из переменной одномерного массива:
1 2 3 4 5 |
Private Sub UserForm_Initialize() Dim myArray() As Variant myArray = Array("Январь", "Февраль", "Март", "Апрель", "Май") Me.ListBox1.List = myArray End Sub |
Пример 4
Заполнение списка данными из двухмерного массива.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Private Sub UserForm_Initialize() 'Объявляем переменную массива 3×3 Dim myArray(2, 2) As Variant myArray(0, 0) = "Зима" myArray(0, 1) = "Январь" myArray(0, 2) = "Мороз" myArray(1, 0) = "Весна" myArray(1, 1) = "Апрель" myArray(1, 2) = "Теплеет" myArray(2, 0) = "Лето" myArray(2, 1) = "Июль" myArray(2, 2) = "Жара" With Me.ListBox1 'Указываем, что у нас 3 столбца .ColumnCount = 3 'Задаем ширину столбцов, если надо .ColumnWidths = "50;50;50" .List = myArray End With End Sub |
Результат получается следующий:
Пример 5
Заполнение списка с тремя столбцами по каждому элементу отдельно. Создаем строку и записываем значение в первый столбец методом AddItem. Значения во второй и третий столбцы записываем с помощью свойства List по индексам:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Private Sub UserForm_Initialize() With Me.ListBox1 'Указываем, что у нас 3 столбца .ColumnCount = 3 'Задаем ширину столбцов, если надо .ColumnWidths = "50;50;50" .AddItem "Зима" .List(0, 1) = "Январь" .List(0, 2) = "Мороз" .AddItem "Весна" .List(1, 1) = "Апрель" .List(1, 2) = "Теплеет" .AddItem "Лето" .List(2, 1) = "Июль" .List(2, 2) = "Жара" End With End Sub |
Результат работы кода будет таким же, как в Примере 4.
Заполнение ListBox с помощью свойства RowSource
Свойство RowSource позволяет загрузить в элемент управления ListBox значения из диапазона ячеек на рабочем листе Excel. Задать адрес диапазона свойству RowSource можно как в ходе выполнения кода VBA, так и в окне Properties элемента управления ListBox.
Адрес диапазона ячеек для свойства RowSource указывается по следующей формуле: "Имя_листа!Адрес_диапазона"
. Имя_листа соответствует имени листа по ярлыку. Адрес в окне Properties вводится без парных кавычек.
Если адрес диапазона указать без имени рабочего листа, то данные будут загружаться в список из соответствующего диапазона активного листа. Если имя рабочего листа содержит пробелы, то его следует заключить в одинарные кавычки: "'Данные для списка'!A1:A10"
.
Пример 6
Импорт данных в одностолбцовый список из диапазона «A1:A7» рабочего листа «Лист1»:
1 2 3 |
Private Sub UserForm_Initialize() Me.ListBox1.RowSource = "Лист1!A1:A7" End Sub |
Пример 7
Импорт данных в четырехстолбцовый список с заголовками из диапазона «A2:D4» рабочего листа «Лист1» (заголовки импортируются автоматически из диапазона «A1:D1»):
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub UserForm_Initialize() With Me.ListBox1 'Указываем, что у нас 4 столбца .ColumnCount = 4 'Задаем размеры столбцов .ColumnWidths = "50;50;50;50" 'Указываем, что нужна строка заголовков .ColumnHeads = True 'Импортируем данные .RowSource = "Лист1!A2:D4" End With End Sub |
Другая информация об элементе управления ListBox представлена в отдельной статье.
А есть возможность заполнить список используя запрос через REST API?
Данные получаем в json формате
Добавляем в проект модули https://github.com/VBA-tools/VBA-JSON и https://github.com/VBA-tools/VBA-Dictionary
Здравствуйте! Подскажите, пожалуйста, есть ли способ заполнить ListBox больше, чем 10 столбцов? У меня 15 столбцов, которые считываются из таблицы, в которой количество строк меняется. Привожу свой код, который при открытии формы заполняет ListBox автоматически.
Здравствуйте, Дарья!
Заполняйте ListBox1 сразу из массива без цикла:
спасибо большое!
Обсуждение закрыто.