Список Vba excel с несколькими столбцами

Обновлено: 06.07.2024

Случайно размещенная информация Excel и другие материалы

В предыдущем сообщении я обсуждал заполнение элементов управления ActiveX с одним столбцом с помощью свойства RowSource и метода AddItem. В этом посте будет обсуждаться заполнение этих элементов управления, когда вам нужно более одного столбца. Вот диапазон, который я использую

Чтобы получить все три столбца в списке, я могу установить для свойства RowSource значение

и обязательно установите для свойства ColumnCount значение 3.

Чтобы заполнить элементы управления с несколькими столбцами с помощью метода AddItem, я использую следующую процедуру

Private Sub UserForm_Initialize()
Затемнить ячейку как диапазон
Затемнить Rng как диапазон

With ThisWorkbook.Sheets("Лист1")
Set Rng = .Range("A2", .Range("A2").End(xlDown))
End With

Для каждой ячейки в Rng.Cells
With Me.ListBox1
.AddItem cell.Value
.List(.ListCount - 1, 1) = cell.Offset(0, 1) .Value
.List(.ListCount - 1, 2) = cell.Offset(0, 2).Value
End With
Следующая ячейка

Эта процедура перебирает ячейки в столбце A. Она использует AddItem для добавления значения столбца A в ListBox. Затем он использует свойство List для доступа к другим столбцам. Список принимает строку и аргумент столбца. Аргумент строки вычисляется с помощью свойства ListCount. Поскольку строки и столбцы начинаются с 0, а ListCount — нет, мне нужно вычесть единицу, чтобы получить правильную строку. Также обратите внимание, что второй столбец равен 1, а третий — 2.

С элементами управления с несколькими столбцами свойство RowSource начинает выглядеть довольно красиво. Это намного проще, чем вся эта чепуха со списками и списками. Тем не менее, я по-прежнему использую исключительно AddItem даже для элементов управления с несколькими столбцами.

35 мыслей на тему «Заполнение многостолбцового ListBox/ComboBox»

Я создал список в форме и назначил источник строк (A2:C10), но я пытаюсь создать источник строк, который будет находить определенные данные из электронной таблицы. Например, если бы у меня была электронная таблица с заголовками «Имя», «Пол», «Возраст» в строке A1, в моей форме я мог бы создать список, в котором были бы показаны все имена для людей, которым было 26 лет.

Кто-нибудь может помочь?

По вашим критериям у меня была аналогичная проблема, и вот мое решение:

Для каждой ячейки в Rng.Cells
Если cell.Offset(0, 3).Value = intAge Then
С Me.ListBox1
.AddItem cell.Value
. Список(.ListCount – 1, 1) = cell.Offset(0, 1).Value
.List(.ListCount – 1, 2) = cell.Offset(0, 2).Value
End С
Конец, если
Следующая ячейка

Мне нужно получить значение массива m*n из поля со списком. Мне нужно получить конкретное значение ячейки, скажем i, и манипулировать значением i в некоторых других формулах/случаях. В этом случае, чтобы получить значение, скажем, второго столбца пятой строки, как мне это сделать. Пожалуйста, помогите

Кажется, это не работает с полем со списком…?

Я не нахожу RowSource слишком привлекательным. Чтобы заполнить свои списки и поля со списком, один или несколько столбцов, я обычно использую что-то вроде этого:

Затемнить vList как вариант

With ThisWorkbook.Sheets("Лист1?)
vList = .Range("A2?, _
.Range("A2?).End(xlDown).End(xlToRight))
Конец

Проще, чем AddItem, и я могу использовать массив VB для vList, которым я манипулировал независимо от рабочего листа.

Пожалуйста, я португальский и не очень хорошо говорю по-английски, но я хотел бы попросить у вас код, который позволяет копировать ячейки из списка в соответствии с начальной ячейкой, как здесь

если ячейка начинается с 11* в столбце списка A , скопируйте диапазон от A до C в этой области и создайте лист с именем A

Я был бы признателен, если бы услышал то же самое от вас

Я собирался написать о комбинациях из нескольких столбцов, но вижу, что это было сделано.

Вот код, который я написал:

Создайте новую пользовательскую форму и поместите в нее поле со списком и кнопку управления:

Тогда используйте этот код.

Частная подпрограмма UserForm_Initialize()
Init_ComboBox1
End Sub

Sub Init_ComboBox1()
Тусклый ряд как диапазон

С ComboBox1
. Clear
. ColumnWidths = «;0»
. ColumnCount = 2
Для каждого ряда в диапазоне («A2:A10»)
.AddItem rng.Value
.List(.ListCount – 1, 1) = rng.Offset(, 1).Value
Следующий
End With
End Sub

Private Sub CommandButton1_Click()
С ComboBox1
If .ListIndex > -1 Then
MsgBox «Вы выбрали » & .List(.ListIndex, 0) & » » & .List( .ListIndex, 1)
Конец, если
Конец
End Sub

Вместо этого:

Для каждого rng ​​In Range("A2:A10?)
.AddItem rng.Value
.List(.ListCount – 1, 1) = rng.Offset(, 1).Value
Далее

Хм, я вижу то, что я сказал несколько месяцев назад в комментарии 5.

Очень умно и элегантно — как раз то, что мне нравится :)

Сейчас это не имеет большого значения, но когда я изучал Excel VBA в Excel 97 на довольно медленном ноутбуке с Windows 95, я узнал, что зацикливание ячейки за ячейкой может серьезно повлиять на скорость процедуры; это еще более выражено при записи на лист, чем при чтении с него.Ваш фрагмент требует 18 переходов от VBA к рабочему листу для сбора данных, а мой — только один.

Мой код изначально предназначался для зацикливания набора записей. Я только что преобразовал его, чтобы использовать диапазоны, ради воспроизводимой, легкой для понимания публикации.
Мне никогда не приходило в голову, что с диапазонами может быть более элегантный способ.

Действительно, я заметил замедление «ячейка за ячейкой» при записи — иногда оно кажется медленным, даже когда для вычислений установлен ручной режим.

Спасибо! Моя проблема исправлена! Гениально!

Можете ли вы предоставить мне код, который, когда я выбираю комбинацию, в которой перечислены все листы в файле, будет давать результат, содержащий элементы в столбце a листа, выбранного в поле списка, и когда вы выбираете элемент в этом списке, он будет создавать элементы в другом списке.

Коби, совет: попробуйте прочитать свой текст перед публикацией — с точки зрения человека, который понятия не имеет, о чем вы говорите. Попробуйте это с тем, что вы только что опубликовали, и вы поймете, почему никогда не получите ответа.

Эти фрагменты кода очень полезны.
спасибо

@rest
Я ищу три столбца в списке, но, насколько я могу судить, максимум два. Это правильно? Как ввести дополнительные столбцы?

Вы можете получить любое количество столбцов в списке или поле со списком (ну, должен быть предел, но я никогда не превышал его). Проверьте свойство ColumnCount. Обратите внимание, что первый столбец — это столбец 0. Иногда я использую дополнительные столбцы для хранения дополнительной информации и задаю столбцу нулевую ширину, чтобы только я и мой код знали, что он есть.

Здравствуйте,
У меня проблема со списком и полем со списком. Я выбираю пустую ячейку в листе Excel. У меня есть форма со списком и comcobox. В другом листе у меня есть база данных — 16 колонок или 8 пар — название материала и значение для него. Заголовок в первой строке определяет тип материалов в столбце, расположенном в списке. Когда какая-то запись выбрана из списка, в соседнем поле со списком мы должны показать другие записи из выбранного столбца. Когда мы выбираем запись из списка, в выбранную ячейку нужно поместить запись из списка, а в соседнюю ячейку из выбранного мы должны поместить значение этой записи в поле со списком. Пример:

1-я строка: круг / значение / отряд / значение
2-я строка: радиус 20 / 20 / отряд 20 / 400
3-я строка: радиус 30 / 30 / прямоугольник / 30

listbox: круг, отряд
combobox1: радиус 20, радиус 30 (по сравнению с кругом)
comcobox2: отряд 20, прямоугольник (по сравнению с отрядом)

ожидаемое значение для выбранной ячейки: значение поля со списком
рядом с выбранной ячейкой: значение для выбранного поля со списком (400 для выбранного отряда 20)

Я надеюсь, что кто-нибудь напишет код, который сможет связать значение поля со списком с некоторым значением из таблицы Excel. в 10 раз

Спасибо, Джон, за приведенный ниже код:
Dim vList as Variant

With ThisWorkbook.Sheets("Лист1?)
vList = .Range("A2?, _
.Range("A2?).End(xlDown).End(xlToRight))
Конец

Это отлично сработало для моего проекта (конечно, с небольшими изменениями).

Я надеюсь, что вы можете помочь, поскольку я не могу найти нужное мне направление.
В приведенном ниже коде я не понимаю, как разделить информацию, извлекаемую из реестра, на отдельные столбцы, поэтому я получаю список, который в два раза длиннее (дубликаты). В этом случае извлекаются значения реестра «Ключ» и «Настройка», которые имеют одни и те же значения, IE, Ключ = Настройка и Настройка = Ключ.
Как сделать так, чтобы этот список состоял из двух или одного столбца без дубликатов?

'===========
С ListBox1
Dim c как вариант
Dim sCustomer как вариант, iSettings как целое число
sCustomer = GetAllSettings(appname :=”ADMCustomerList”, section:=”Клиенты”)
Для iSettings = LBound(sCustomer, 1) To UBound(sCustomer, 1)
Debug.Print sCustomer(iSettings, 0), sCustomer(iSettings , 1)
Следующие iSettings
Для каждого c In sCustomer
.AddItem c
Следующий
Конец с
'========= ====

Рик
XP Pro, XL2007

Думаю, я наткнулся, и я не зря использую это слово, на ответ.


'===========
With ListBox1
.Clear
Dim c As Variant
Dim x As String 'добавить это переменная 26.10.07

Спасибо, ребята! Отлично сработало!

Я борюсь с некоторым кодом/логикой VBA (я немного новичок), чтобы сделать следующее:

1/ Используйте значение, выбранное из одного списка, чтобы ограничить значения, отображаемые в другом списке (аналогично тому, как фильтр ограничивает отображение строк только теми, которые имеют первое выбранное значение)
2/ Второй список должен иметь элементы, добавляемые динамически на основе элемента, выбранного из 1-го списка
3/ 2-й список должен добавлять только уникальные элементы … нет дубликатов в списке элементов во 2-м списке

Мне нужно, чтобы эта логика применялась в общей сложности к 4 спискам, чтобы элементы в списке 2 ограничивались значением, выбранным в списке 1, а элементы в списке 3 ограничивались значением, выбранным в списке 2, и, наконец, элементы в списке 4 ограничены значением, выбранным в списке 3.

Все списки находятся в ячейках электронной таблицы, а не в пользовательской форме.

Любой совет/код приветствуется! Спасибо!

Я пытаюсь заполнить поле со списком из 4 столбцов большим объемом данных с отдельного листа («Портфолио»). строка), затем введите значения ячеек в поле списка соответственно.

Просто не могу понять, поэтому любая помощь будет очень признательна!!

Заранее спасибо

Я рад, что здесь есть комбинация методов, потому что я обнаружил, что мне действительно нужно больше, чем один метод. У меня была серия списков, в каждом из которых было на один элемент меньше, чем в других (процесс удаления выбранного элемента из предшествующего списка, перед помещением оставшихся элементов в следующий список и т. д.)… но к тому времени, когда я добрался до последнего списка, я не удалось добавить 2 столбца в виде массива, используя свойство списка. Я пробовал все варианты этого. в конце концов я сдался, и когда ubound(MyArray,2) = 1 (т.е. это произошло только в последнем списке, у которого был только один выбор — я знаю, глупый интерфейс), я использовал вместо этого .AddItem и свойство .List для другие столбцы. Спасибо всем здесь!

Кажется, что что-то смотрит мне в лицо, но я просто не могу заставить свою рутину работать должным образом. Если я попытаюсь добавить 11-й столбец в свой список.

Я получаю сообщение об ошибке, в котором говорится: «Ошибка 380. Не удалось установить свойство списка. Недопустимое значение свойства»
Это происходит после — ListBox1.List(0, 9) = «Value £s». Любые идеи

Существует ограничение на количество столбцов в списке. Когда я достигаю этого предела, я в конечном итоге объединяю два поля в одно или помещаю два списка рядом друг с другом. Это боль.

Я подумал, что так и должно быть, но нигде не нашел никаких ограничений, а где-то видел ссылку на «неограниченные» столбцы в списке.

На практике обычно есть достаточно простой обходной путь.

Спасибо за это,

не забудьте перед end sub

Привет
Спасибо, что поделились своими знаниями в Excel VBA, я воспользовался одним из ваших кодов, показанных выше.. Мне было интересно, не могли бы вы помочь мне еще немного, мне удалось настроить ваш код ( показано ниже), чтобы работать на меня, но я не могу получить эти коды для заполнения многостолбцового списка значениями ячеек, полученными из диапазона excel (т.е. A2: C10).. но проблема в том, что у меня есть пустые строки (т.е. A5 :C5, строка 5), и я хочу, чтобы значения списка исключали эту строку. можно ли изменить код ниже, чтобы сделать это, пожалуйста…

Private Sub UserForm_Initialize()
Затемнить ячейку как диапазон
Затемнить Rng как диапазон

With ThisWorkbook.Sheets("Лист1?)
Set Rng = .Range("A2?, .Range("A2?). End (xlDown))
End With

Для каждой ячейки в Rng.Cells
With Me.ListBox1
.AddItem cell.Value
.List(.ListCount – 1, 1) = cell.Offset(0, 1) .Value
.List(.ListCount – 1, 2) = cell.Offset(0, 2).Value
End With
Следующая ячейка

Привет
У меня небольшая проблема
1. У меня есть поле со списком и несколько меток, которые читаются в строках и столбцах листа
Мне нужно прочитать информацию, прочитанную в поле со списком, и пометить одну строку, какой элемент нравится

Привет
У меня небольшая проблема
1. У меня есть поле со списком и несколько меток, которые читаются в строках и столбцах листа.
Мне нужно прочитать информацию, прочитанную в поле со списком, и пометить одну строку, элемент которой, например,
читать информацию из другой строки
2. Если у меня есть больше полей со списком, я использую один из них и читаю информацию из разных строк, когда я изменяю элемент в поле со списком, тогда все остальные поля со списком и метки изменяют строку на эту же
Спасибо за помощь
Patryk

Я хочу добавить поле со списком в два поля со списком с условием if и примером

если вы поделитесь примером с кодированием, пожалуйста, пришлите мне, это очень поможет мне

Привет,
Я разрабатывал список с отфильтрованным диапазоном. Мое требование упоминается здесь ниже:
1. Список будет заполнен 4 столбцами и отфильтрованным диапазоном.
2. 4 столбца — это столбец A, столбец B, столбец D и столбец V на листе рабочей книги3.
3. Фильтр будет выполнен перед заполнением списка.
4. Критерием фильтрации является название ярлыка.

Список позволяет выбирать только из предварительно определенного списка. Вы не можете ввести другое значение.
Поле со списком позволяет пользователю либо выбрать элемент из раскрывающегося списка, либо ввести другое значение в текстовое поле.

Добавление в один столбец

Вы можете использовать метод "AddItem", если у вас есть список с одним столбцом.
Если вы попытаетесь добавить элементы в список с непустым свойством RowSource, вы получите сообщение об ошибке "Отказано в доступе".

Выбранный элемент

Получение выбранного в данный момент элемента в одном списке выбора

Несколько столбцов

Список может содержать несколько столбцов с помощью свойства ColumnCount.
Вы можете использовать «AddItem» в сочетании со свойством List, если у вас несколько столбцов.
Все записи списка начинаются с номера строки 0 и номер столбца 0 , т.е. List(0,0) = "text"
Если вы хотите добавить элементы в список с несколькими столбцами, вам нужно использовать "AddItem", чтобы добавить новую строку, а затем либо "Список", либо "Столбец", чтобы добавить определенные элементы после первого столбца.

И номера столбцов, и строк в списке начинаются с 0 по умолчанию, а не с 1.
Единственный способ получить выбранные элементы в списке с множественным выбором – циклически просмотреть весь список.

Добавление с использованием массива

Если ваши данные хранятся в одномерном массиве, вы можете назначить массив напрямую, используя свойство List.

Если ваши данные хранятся в двумерном массиве, вы можете назначить массив напрямую, используя свойство List.

Удаление выделенного

Это удалит текущий выбранный элемент

Более 10 столбцов

Если вы хотите иметь более 10 столбцов в своем списке, вы должны использовать свойство списка .

Текстовая колонка

Это свойство позволяет отображать один набор значений для пользователя, но возвращать другое значение после выбора.
Используйте свойство Text, чтобы вернуть столбец, указанный в столбце TextBound.
Если вы используете свойство Value, вы всегда будете получать элемент в первом столбце.

Привязка столбца

Свойство BoundColumn определяет, на какой столбец ссылаются при обращении к свойству Value записи списка.

Элементы не выбраны

Возможно отобразить список без выбранных элементов (когда listindex = -1).
Хотя после выбора элемента невозможно отменить выбор всех элементов.

Множественный выбор

По умолчанию можно выбрать только один элемент, хотя это можно изменить, изменив свойство MultiSelect.
Вы можете сделать множественный выбор только с помощью списка, а не поля со списком.

Источник строк

Элементы в списке можно получить из диапазона ячеек Excel с помощью свойства RowSource.
Убедитесь, что вы указали имя рабочего листа, иначе будет использоваться активный лист.

Если вы заполняете список с помощью метода RowSource, вы не сможете заполнить второй список с помощью метода List.
Если вы заполните список с помощью метода RowSource, вы не сможете использовать метод RemoveItem.

Добавление заголовков столбцов

Вы можете отображать заголовки столбцов только при использовании свойства RowSource, а не при использовании массива или добавлении элементов по отдельности.
Чтобы отобразить заголовки столбцов, установите для свойства ColumnHeads значение True.
Не включайте заголовки столбцов на листе в диапазоне, определенном для RowSource.
Строка непосредственно над первой строкой RowSource будет использоваться автоматически.

Добавление уникальных элементов

Вы должны добавить все элементы в коллекцию, обеспечив добавление только уникальных элементов, а затем добавить все элементы из коллекции в список.

Возможно, также стоит отсортировать коллекцию, прежде чем добавлять ее в список.

Измените Integral Height на False, и длина строки будет примерно 13,42
Arial, 10, Regular
Возможно иметь раскрывающийся список — измените свойство — не обязательно Поле со списком !!
Возможно отображать элементы, расположенные через равные промежутки в списке, используя моноширинный шрифт, такой как Courier New. Лучше использовать несколько столбцов.
Нужно ли вам заполнять список данными, чтобы можно было назначить ему массив? Я ДУМАЮ, ЧТО ВАМ НЕ НУЖНО!!
Вертикальная высота списка в режиме конструктора может не совпадать с высотой при фактическом отображении пользовательской формы.

Для некоторых это может показаться дешевым вопросом, но я совершенно не понимаю, как заполнить свой список.

форма со списком

С помощью этой строки я могу заполнить список, как показано ниже:
ListBox1.List = Sheets("Sheet1").Cells(1, 1).CurrentRegion.Value
или
< /p>

форма с выводом столбца списка 1

Data

Ниже приведены данные, которые я планирую использовать для заполнения списка, и они прогрессивны. Только столбец имеет количество исправлений.

Кто-нибудь, пожалуйста, просветите меня о том, как заполнить поле списка, адаптирующееся к нескольким столбцам и строкам, с помощью FOR LOOP, как показано в моем коде выше. Любая помощь приветствуется. Спасибо.

@SiddharthRout В этой строке указывается определенный диапазон.Можно ли использовать диапазон всех ячеек, которые не являются пустыми ячейками?

2 ответа 2

Методы

  1. Всегда лучше перебирать массив, а не диапазон, так как это намного быстрее.
  2. Еще быстрее создать вариантный массив полей данных с помощью одной строки вместо того, чтобы изменять размер предварительно объявленного массива и заполнять его в дополнительном цикле, как это предлагает Сиддхарт Раут (хотя это хороший метод :-) Примечание: Приведенный ниже код основан на его подходе, упомянутом в комментарии выше, просто чтобы продемонстрировать разницу.
  3. Заполните ListBox1.List массивом (тот же метод, но в обратном направлении).

Код

Дополнительные советы

Еще одно преимущество метода массива — он преодолевает встроенное ограничение всего в 10 столбцов при использовании метода .AddItem.

Кроме того, имейте в виду, что индексация списка отсчитывается от нуля, поэтому, например, вы получаете адрес электронной почты (столбец 3, индекс 2) первой строки элемента (индекс 0) через ListBox1. .List(0, 2) , тогда как массив полей данных автоматически становится 2-мерным массивом на основе единицы.

Вы не ограничены в использовании метода .List для получения информации из списка, вы можете изменить порядок строк и столбцов, используя ListBox1.Column" или даже создать из него новый массив, который останется 2 -dim, даже если есть только ОДИН элемент (примечание: метод Application.Transpose` преобразует двумерный массив только с одной строкой в ​​одномерный массив).

И последнее замечание: вы можете легко выгрузить весь список обратно на лист Excel с помощью rng = ListBox1.List , но позаботьтесь об определении правильного диапазона.

VBA ListBox — очень полезный элемент управления. Если вы создаете какое-либо приложение UserForm, вы, скорее всего, будете его использовать.

В этом посте я расскажу вам все, что вам нужно знать о ListBox VBA, чтобы вы могли избежать распространенных ошибок и быстро и легко приступить к работе.

VBA ListBox multi

Для чего используется ListBox в VBA?

ListBox используется для отображения списка элементов для пользователя, чтобы пользователь мог затем выбрать один или несколько элементов. ListBox может иметь несколько столбцов, поэтому он полезен для таких задач, как отображение записей.

VBA ListBox и VBA ComboBox

  1. Список позволяет выбирать несколько элементов. Поле со списком допускает только один выбор.
  2. Элементы в ListBox видны всегда. Элементы списка отображаются только при нажатии на значок «вниз».
  3. Комбобокс может фильтровать содержимое при вводе.

Краткое руководство по свойствам списка VBA

< tr >
ФункцияОперацияПример
AddItemДобавить элемент listbox.AddItem "Испания"
ОчиститьУдалить все элементы listbox.Clear
ColumnCountУстановить количество видимых столбцов ComboBox1.ColumnCount = 2
ColumnHeadsСделать строку столбца видимой ComboBox1.ColumnHeads = True
List Range to Listbox
ListBox to Range
Listbox.List = Range("A1:A4").Value
Range("A1:A4") .Value = Listbox.List
ListОбновить значение столбца Listbox.List(1,2) = "Новый value"
ListCountПолучить количество элементов cnt = listbox.ListCount
ListIndexПолучить/установить выбранный элемент Idx = listbox.ListIndex
combo.ListIndex = 0
RemoveItemУдалить элемент< /td> listbox.Remove 1
RowSourceДобавить диапазон значений из рабочего листа ComboBox1.RowSource = Sheet1.Range("A2:B3").Address
ValueПолучить значение выбранного элемента Dim sCountry Как строка
sCountry = listbox.Value

Как добавить элементы в ListBox

Есть 3 способа добавления элементов в список VBA:

  1. По одному с помощью свойства AddItem.
  2. Добавление массива/диапазона с помощью свойства List.
  3. Добавление диапазона с помощью свойства RowSource.

Наиболее часто используются свойства List и RowSource. В таблице ниже представлено быстрое сравнение этих свойств:

ЗадачаRowSourceСписок
Заголовки столбцов< /td>ДаНет
Обновить значения в ListBoxНетДа< /td>
Добавить новые элементыНетДа
Тип данныхRangeArray(включая Range.Value)
Если исходные данные изменяютсяListbox автоматически обновляется.ListBox не обновляется.

Свойство списка VBA ListBox

Свойство List позволяет добавлять содержимое массива в ListBox. Поскольку Range.Value — это массив, вы можете скопировать содержимое любого диапазона в список.

Вот несколько примеров использования свойства List:

Вы также можете использовать свойство List для записи из ListBox в массив или диапазон:

Важное примечание. Если в диапазоне есть только один элемент, VBA не преобразует его в массив. Вместо этого он преобразует диапазон в строку/двойное число/дату и т. д.

В этом случае вам нужно использовать AddItem, чтобы добавить значение в ListBox:

Свойство списка и заголовки столбцов

В ListBox отображаются только заголовки столбцов, если вы используете RowSource . В противном случае они недоступны. Лучший способ добавить заголовки столбцов (и это не лучший способ) — добавить метки над столбцами ListBox. Одним из преимуществ является то, что вы можете использовать событие щелчка метки, если хотите реализовать что-то вроде сортировки.

Обновление элементов с помощью свойства списка

Вы можете обновлять отдельные элементы в ListBox с помощью свойства списка.

Представьте, что у нас есть ListBox с такими данными:


< /p>

Если мы хотим изменить Нельсона в строке 3, столбце 2, мы делаем это следующим образом:

Результат, который мы получаем:


Строки и столбцы свойства List отсчитываются от нуля, поэтому это означает, что строка 1 равна 0, строка 2 равна 1, строка 3 равна 2 и т. д.:


Источник строки списка VBA

Свойство RowSource позволяет нам добавлять диапазон в ListBox. Это отличается от свойства List тем, что Range связан с ListBox. Если данные в диапазоне изменятся, данные в ListBox будут обновлены автоматически.

Когда мы используем RowSource, данные в ListBox доступны только для чтения. Мы можем изменить диапазон RowSource, но не можем изменить значения в ListBox.

Как использовать RowSource

Мы добавляем диапазон RowSource в виде строки следующим образом:

Если вы не укажете лист, VBA будет использовать активный лист

Если вы используете Address объекта диапазона с RowSource, важно использовать параметр External. Это гарантирует, что RowSource будет читать лист диапазона, а не активный лист:

Заголовки столбцов RowSource

Заголовки столбцов автоматически добавляются в ListBox при использовании свойства RowSource. Для свойства ColumnHeads должно быть установлено значение True, иначе заголовки не будут отображаться. Вы можете установить это свойство в коде или в окне свойств ListBox.

Заголовки столбцов берутся из строки над диапазоном, используемым для RowSource . Например, если у вас диапазон от A2 до C5, то в заголовке столбца будет использоваться диапазон от A1 до C1:

Вот пример: мы хотим добавить приведенные ниже данные в наш ListBox, и мы хотим, чтобы от A1 до C1 был заголовок.


Мы устанавливаем для свойства RowSource значение A2:C5 и устанавливаем для свойства ColumnHeads значение true:

Результат будет выглядеть так:


< /p>

Добавить элемент списка VBA

Очень редко вы будете использовать свойство AddItem для заполнения ListBox. List и RowSource намного эффективнее. AddItem обычно используется, когда в списке уже есть элементы, и вы хотите добавить новый элемент.

Свойство AddItem простое в использовании. Вы указываете элемент, который хотите добавить, в качестве параметра. ListBox автоматически добавит его последним элементом:

Если вы хотите вставить элемент в определенную позицию, вы можете использовать второй параметр. Имейте в виду, что это позиция с отсчетом от нуля, поэтому, если вы хотите, чтобы элемент находился в первой позиции, значение равно 0, в позиции 2 значение равно 1 и т. д.

Порядок будет таким:
банан
яблоко
апельсин

Если вы хотите добавить несколько столбцов с помощью AddItem, вам нужно использовать свойство List после использования AddItem:

Одна из причин использования AddItem заключается в том, что вы добавляете данные, которые не являются последовательными, поэтому вы не можете использовать свойства List или RowSource:

Важное примечание. Если вы заполните ListBox с помощью RowSource, вы не сможете использовать AddItem для добавления нового элемента. Если вы попытаетесь, вы получите «Ошибка выполнения 70 — Отказано в доступе».

Выбранные элементы списка VBA

Если выбран только один элемент, вы можете использовать ListIndex для получения выбранной строки. Помните, что он начинается с нуля, поэтому строка 1 в ListBox имеет ListIndex 0, строка 2 — ListIndex 1 и т. д.

Если ListBox имеет несколько столбцов, вы можете использовать свойства ListIndex и List вместе, чтобы вернуть значение в выбранной строке:

Если выбрано несколько элементов, вы можете использовать функцию GetSelectedRows, которая возвращает набор выбранных строк:

Чтение данных из списка VBA

Для чтения данных из ListBox мы можем использовать свойство ListBox.Value. Это работает только в том случае, если для ListBox выбран только один элемент, т. е. для параметра MultiSelect установлено значение frmMultiSelectSingle (дополнительные сведения об этом см. в разделе VBA ListBox MultiSelect ниже).

Одиночное выделение только с одним столбцом

Когда выбран только один элемент, мы можем использовать свойство Value для получения текущего выбранного элемента:

Помните, что при наличии нескольких столбцов функция "Значение" вернет значение только из первого столбца.

Одиночный выбор только с несколькими столбцами

Если в ListBox есть несколько столбцов, вы можете использовать свойство Value, чтобы получить значение в первом столбце. Вам нужно прочитать свойство List, чтобы получить значения в других столбцах. Свойство List по сути является массивом, поэтому вы можете обращаться с ним как с одним.

В приведенном ниже примере мы читаем столбцы строки 1 (индекс строки 1 равен 0):

Обычно требуется распечатать значения в выбранной строке. Вы можете использовать свойство ListIndex, чтобы получить выбранный элемент (обратите внимание, что ListIndex возвращает последние выбранные элементы, поэтому он не будет работать, если выбрано несколько элементов):

Множественный выбор

Если в ListBox есть несколько вариантов выбора и вы хотите получить все данные из каждого из них, вы можете использовать подпрограмму GetSelectedRows() из раздела VBA ListBox Selected Items. Это позволит получить коллекцию всех выбранных строк. Вы можете использовать это для печати данных из выбранных строк:

Множественный выбор окна списка VBA

Мы можем использовать свойство MultiSelect элемента управления ListBox, чтобы позволить пользователю выбирать либо один элемент, либо несколько элементов:

listbox multiselect

Есть 3 варианта:

  • 0 = frmMultiSelectSingle — [по умолчанию] множественный выбор не допускается.
  • 1 = frmMultiSelectMulti — выбор или отмена выбора нескольких элементов осуществляется путем их выбора с помощью мыши или нажатия клавиши пробела.
  • 2 = frmMultiSelectExtended — несколько элементов выбираются, удерживая нажатой клавишу Shift и выбирая их с помощью мыши, или удерживая нажатой клавишу Shift и нажимая клавишу со стрелкой, чтобы расширить выделение от ранее выбранного элемента до текущего элемента. Вы также можете выбирать элементы, перетаскивая их мышью. Удерживая нажатой клавишу Ctrl и выбирая элемент, он выбирает или отменяет выбор этого элемента.

Столбцы списка VBA

В ListBox может быть несколько столбцов. Например, вы можете загрузить Range или двумерный массив в ListBox с помощью List или RowSource.

Часто при загрузке данных с несколькими столбцами отображается только один столбец. Это может быть очень запутанным, когда вы используете Listbox. Чтобы столбцы отображались, необходимо задать для свойства ColumnCount количество столбцов.

Также следует убедиться, что свойство ColumnWidths указано правильно, иначе один из столбцов может не отображаться.

Вы можете сделать это следующим образом:

В реальном приложении вы можете установить свойства RowSource и ColumnCount следующим образом:

См. раздел AddItem, чтобы узнать, как добавлять данные в другие столбцы при использовании свойства AddItem.

Заголовки столбцов списка VBA

Заголовки столбцов — еще один запутанный элемент ListBox. Если вы используете свойство RowSource для добавления данных в ListBox, то строка над диапазоном будет автоматически использоваться в качестве заголовка.

Чтобы заголовки столбцов отображались, для свойства ColumnHeads должно быть установлено значение true. Вы можете сделать это в окне свойств ListBox или в списке кодов:

Если вы используете свойство List или AddItem для заполнения ListBox, заголовки столбцов будут недоступны. Лучшее решение, хотя и разочаровывающее, — использовать метки над ListBox. Я знаю, это звучит безумно, но, к сожалению, такова реальность. Одним из преимуществ является то, что вы можете использовать событие клика Label, которое полезно, если вы планируете сортировать данные по столбцу.

Динамическое создание ListBox

Элементы управления обычно создаются во время разработки, но вы также можете создавать их динамически во время выполнения:

Если вы хотите добавить событие в динамический элемент управления, вы можете сделать это следующим образом:

    Прежде всего создайте такой класс:

Обратите внимание, что вы можете прикреплять события к любому ListBox. Для этого его не обязательно создавать динамически.

Пройтись по спискам

Если вы хотите перебрать все ListBox в пользовательской форме, вы можете сделать это следующим образом:

Видео YouTube

Посмотрите это видео, в котором я использую ListBox. Исходный код видео доступен здесь


Что дальше?

Бесплатное руководство по VBA Если вы новичок в VBA или хотите улучшить свои навыки работы с VBA, почему бы не попробовать это бесплатное руководство по VBA.

Соответствующее обучение: получите полный доступ к обучающим веб-семинарам Excel VBA и ко всем учебным пособиям.

(ПРИМЕЧАНИЕ. Планируете создать приложение VBA или управлять им? Узнайте, как создать 10 приложений Excel VBA с нуля.)

Профессор Келли,
Спасибо за вашу щедрость и постоянную готовность поделиться своими знаниями в вашем последнем дополнении к тому, что на самом деле стало Macro University Excel. Надеюсь всегда видеть вас в лаборатории.

Спасибо, Эд, рад, что вам понравилось.

Привет. У меня вопрос по ListBox.
Я пытаюсь использовать:
но когда я использую этот «ListBox.AddItem», но я получаю сообщение об ошибке Требуется объект
Пожалуйста, помогите мне…

Вы должны использовать имя ListBox. Если вы не изменили его, то, вероятно, это ListBox1.

Кроме того, ListBox1 не поддерживается, поддерживается только ListBox, но я должен объявить, потому что, например, ListBox.MouseIcon не работает

ListBox – это тип переменной. ListBox1 — это имя по умолчанию. Возможно, вы использовали другое имя.
Затемнить As MSForms.ListBox
Установить a = [имя списка]

Я создал ListBox в своем проекте, а затем написал эти коды
Затемните a как ListBox
Установите a = MyListBox
Но я получил ошибку несоответствия типов

Затемнить как MSForms.ListBox
Установить a = MyListBox

Я хочу использовать это, но не знаю, какую переменную или lemenet поставить вместо "*"

Затемнение как ListBox
Установите a = *

Я использую Office 2016 Excel VBA.
Я заметил две вещи.
.RowSource = "CardInfo!A2:AQ5″ не работал, пока я не сделал следующее:
.RowSource ="'CardInfo'!A2:AQ5" — одинарные кавычки вокруг имени листа и
.ColumnCount = 43 Когда я не учитывал количество столбцов, мне показывался только первый столбец.
Есть мысли, почему?

Я не нашел решения своей проблемы. Как можно проще: Sheet2 содержит 31 000 строк данных. Меня интересует только отображение данных в столбце C в Textbox1.
Listbox1 Rowsource = =Sheet2!A2:D31103. и Textbox1 находятся на Userform2.
Этот код только вставляет выбранный элемент в Listbox1 формы в Textbox1.
Private Sub ListBox1_Change()
UserForm2.TextBox1 = UserForm2.ListBox1.List(UserForm2.ListBox1.ListIndex, 2)
Я хочу, чтобы он вставлял любую группу мультивыбранных элементов в Textbox1 APPENDED к уже вставил предыдущие элементы в Textbox1. Для меня, чтобы это сработало, любой отдельный элемент или группу элементов с множественным выбором необходимо скопировать и вставить в другой столбец «Пустой лист». H. Затем столбец H увеличивается по мере того, как данные вставляются ниже последней строки. Для меня это сложно. Можете ли вы помочь мне с этим ? Спасибо, cr
End Sub

У меня тоже возникли проблемы с реализацией этого. Пара вопросов…

1) это MSForms или ActiveX ListBox? Похоже, это элемент управления формы, и я реализовал его, как описано Полом в предыдущих комментариях, но у меня нет доступного метода RowSource (доступны List и AddItem).

2) Есть ли способ изменить имя ListBox на более осмысленное, чем ListBox1? Его можно изменить в определении диапазона в Excel, но это не отражается в VBA, где мне все еще нужно установить ссылку, как показано ниже, поскольку я не вижу способа получить доступ к свойствам элемента управления.

Что я здесь не понимаю? Я использую Office 365, если это проблема, или другая проблема может заключаться в том, что я пытаюсь реализовать его непосредственно на листе, а не в пользовательской форме.

Public Sub SetupListBox()
Затемнить LB_Metal как MSForms.ListBox
Задать LB_Metal = Sheet1.ListBox1
Затемнить rList как диапазон
Задать rList = wsVBA.Range("MAT1_MID" )
С LB_Metal
.RowSource = rList ' Ошибка 438: объект не поддерживает это свойство или метод
.ColumnHeads = True
End With
End Sub <р>1. Затемнить фрукты как строку
fruit = ListBox1.Value

<р>2. Затемнить фрукты как строку
fruit = ListBox1.Text

Пример 1 вернул ""
Пример 2 вернул "яблоко"

Здравствуйте, сейчас я работаю над проектом VBA, мне просто интересно, как удалить данные из двух списков. при условии, что я могу сопоставить уникальный идентификатор ключа для обоих списков

Читайте также: