Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
3 / 2 / 1
Регистрация: 05.02.2019
Сообщений: 27
1
Excel

Заполнить несколько ListBox

05.02.2019, 14:34. Показов 2913. Ответов 12

Author24 — интернет-сервис помощи студентам
Всем добрый день!
При создании UserForm возникла острая необходимость сделать множество ListBox (на данный момент их 15).
Заполнить методом additem сложности не возникает, если данный метод применять к каждому ListBox.
Все ListBox имеют одинаковый набор данных. Т.е. наполнение идентично.
Собственно, вопрос заключается в том, как бы цыклом заполнить их все? Отдельно наполнять каждый - не вариант. Код получится слишком массивным.

Пробовал следующий вариант:

Visual Basic
1
2
3
4
5
6
7
8
Dim lb As ListBox
 
For Each lb In UserForm
    lb.AddItem "A"
    lb.AddItem "B"
    lb.AddItem "C"
    lb.AddItem "D"
Next lb
Возникает ошибка. Что делаю не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2019, 14:34
Ответы с готовыми решениями:

Как заполнить ListBox
Создаю форму, запускаю Run, возникает ошибка как на скриншоте. Как проверить результат заполнения...

Организовать вывод на форму поля со списком (ListBox) и заполнить несколько его строк.
Организовать вывод на форму поля со списком (ListBox) и заполнить несколько его строк. Организовать...

Организовать вывод на форму поля со списком (ListBox) и заполнить несколько его строк. Организовать по выбору (отметке) некоторых действий, например д
Организовать вывод на форму поля со списком (ListBox) и заполнить несколько его строк. Организовать...

Csv заполнить listbox
Скажите, каким образом можно заполнить из csv файла listbox. Есть файл, без разделителей, просто...

12
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
05.02.2019, 14:47 2
Visual Basic
1
2
3
4
5
6
7
8
Private Sub CommandButton1_Click()
   Dim L
   For Each L In Me.Controls
      If TypeName(L) ="ListBox" Then
         L.AddItem "0"
      End If
   Next
End Sub
Этот цикл пройдётся по всем контролам формы и если контрол является "ListBox", то в него добавляется один item.
Этот цикл можете вложить в другой цикл или напротив - в этот цикл вставляете другой цикл( вместо L.AddItem "0" ставляете ваш цикл, который должен наполнить листбокс.)

Добавлено через 3 минуты
По такому же принципу можно циклом обойти например все текстбоксы. В одной моей программке по таймеру на полсекунды подсвечиваются все текстбоксы, меняя фон на розовый и обратно, если в этом текстовом поле только что изменилось значение.
1
3 / 2 / 1
Регистрация: 05.02.2019
Сообщений: 27
05.02.2019, 14:47  [ТС] 3
Огромное спасибо!
Завелось!

Могли бы подсказать в чем была ошибка, очень не хотелось бы допускать ее впредь.
0
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
05.02.2019, 15:00 4
Visual Basic
1
2
3
4
5
6
7
8
   Dim lb As Control
 
   For Each lb In UserForm1.Controls
      lb.AddItem "A"
      lb.AddItem "B"
      lb.AddItem "C"
      lb.AddItem "D"
   Next lb
Можно так.
Объявляя Dim lb As ListBox

For Each lb In UserForm
вы говорите бейсику, что надо пройтись по всем listbox'ам в форме, но для работы такого цикла необходимо, чтобы существовала коллекция листбоксов, либо массив листбоксов! А у вас такой коллекции нет, так как изначально на форме есть просто коллекция контролов, а самостоятельно коллекцию листбоксов вы не создавали.

Впредь можно делать так: создаёте коллекцию, наполняете её необходимыми вам листбоксами, в дальнейшем можно организовывать цикл по этой коллекции через For Each.

Добавлено через 3 минуты
Visual Basic
1
2
3
4
5
6
   Dim lb As New Collection, l
   lb.Add UserForm1.Controls("ListBox1")
   lb.Add UserForm1.Controls("ListBox2")
   For Each l In lb
      Debug.Print l.Name, TypeName(l), l.ListCount
   Next
Добавлено через 1 минуту
Вот пример кода, здесь создаётся коллекция, добавляются в неё два листбокса, а потом организовывается цикл, успешно "добирающийся" до каждого контрола коллекции.
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
05.02.2019, 15:00 5
saray, Если имена созданных ListBox не менялись, то заполнить их можно ещё и таким способом :

Visual Basic
1
2
3
4
5
6
7
Private Sub UserForm_Initialize()
    Dim i&, a 'As Variant
    a = Array("Иванов", "Петров", "Сидоров")
    For i = 1 To 15
        Me("ListBox" & i).List = a
    Next
End Sub
0
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
05.02.2019, 15:02 6
Наполнять коллекцию можно также циклом, что всё упрощает (например, можно сделать цикл, который добавит в коллекцию только те листбоксы, имена которых соответствуют какому-то критерию).
А ещё для 15 листбоксов можно организовать одинаковое поведение, но это уже другая широкая тема классов...
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
05.02.2019, 15:03 7
А если использование метода .AddItem необходимо, то :

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub UserForm_Initialize()
    ListBox1.AddItem "Иванов"
    ListBox1.AddItem "Петров"
    ListBox1.AddItem "Сидоров"
    
    Dim i&
    For i = 2 To 15
        Me("ListBox" & i).List = ListBox1.List
    Next
End Sub
2
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
05.02.2019, 15:08 8
pashulka, Так будет сильно быстрее, если речь идёт о тысячах строк!
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
05.02.2019, 15:22 9
Святой НякаЛайк, Вы о чём ? Наши сообщения появились одновременно, видел только сообщение#2 и никакого проигрыша по отношению к этому варианту у меня нет.
0
3 / 2 / 1
Регистрация: 05.02.2019
Сообщений: 27
05.02.2019, 15:31  [ТС] 10
Вот спасибо!
Вариант от господина pashulka реально быстрее! Огромное спасибо!!!
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
05.02.2019, 15:37 11
saray, Если Ваши листбоксы содержат только один столбец, то в применении метода additem нет особой необходимости и можно обратить более пристальное внимание на пост#5
0
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
05.02.2019, 16:11 12
Цитата Сообщение от pashulka Посмотреть сообщение
никакого проигрыша по отношению к этому варианту у меня нет.
Так я именно о выигрыше в вашем варианте! Так как затестив ваш код, обнаружил, что он быстрее наполняет листбокс, чем вариант с наполнением в цикле.
0
4135 / 2239 / 940
Регистрация: 01.12.2010
Сообщений: 4,624
05.02.2019, 16:21 13
Святой НякаЛайк, Чё то я сомневаюсь, что тысячу строк кто-то будет заполнять с помощью метода additem да и компьютеры сейчас помощнее, чем раньше. Но если мой вариант пригодится, то хорошо, но пусть у людей будет выбор.
0
05.02.2019, 16:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2019, 16:21
Помогаю со студенческими работами здесь

ListBox заполнить картинками
как заполнить ListBox картинками? Есть ListBox картинок, как заполнить лист бокс именем файлов +...

Как заполнить ListBox
мне нужно сделать список в ListBox в гугле пишет что это свойство list. но я не могу его найти.

Заполнить ListBox данными из FDQuery
procedure TForm1.Button1Click(Sender: TObject); var i: integer; s: string; begin ...

Не могу заполнить ListBox из StringList
имеется текстовый файл base.pk, в котором количество строк кратно 4. мне нужно вывести в листбокс...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru