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

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

05.02.2019, 14:34. Показов 2936. Ответов 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
IT_Exp
Эксперт
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
Блог
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
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
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
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru