|
Igrek
|
|
Помогите как сократить код16.11.2011, 17:10. Показов 2561. Ответов 18
Метки нет (Все метки)
В пользовательской форме 60 комбобоксов. В процедуре UserForm_Activate()написал:
ComboBox1.RowSource = "Предметы":ComboBox1.ListIndex = -1:ComboBox2.RowSource = "Предметы":ComboBox2.ListIndex = -1 и т.д. Никаких других способов(типа For Each) не нашел, а есть возможность применить цикл? Аналогично при получении результатов работы пользователя написал 60 раз примерно такое: предмет(1)= ComboBox1.Value. Должен же быть способ сократить текст процедур!? Помогите, кто знает, пожалуйста. |
|
| 16.11.2011, 17:10 | |
|
Ответы с готовыми решениями:
18
Помогите сократить код
|
|
Silver
|
|
| 16.11.2011, 18:07 | |
|
Сделай массив комбобоксов
и заполняй их в цикле или создай на его основе UserControl, забей в него изначально все данные и просто потом кидай на форму |
|
|
2 / 2 / 1
Регистрация: 10.04.2011
Сообщений: 415
|
||||||
| 16.11.2011, 18:10 | ||||||
|
Да элементарно:
0
|
||||||
|
Silver
|
||||||
| 16.11.2011, 18:12 | ||||||
|
Лучше массив
Тогда и выборка значения будет проще:
|
||||||
|
2 / 2 / 1
Регистрация: 10.04.2011
Сообщений: 415
|
|
| 17.11.2011, 11:39 | |
|
для Silver: чем твой способ лучше (проще) моего, там ведь приходится массив использовать?
0
|
|
|
Silver
|
||
| 17.11.2011, 11:48 | ||
(ComboBox1,ComboBox2,...,ComboBox60) то для обработки события (например) Click нужно будет 60 раз написать один и тот-же код для каждого ComboBox. О чем и говорил автор темы. В случае же с массивом код пишется один раз. А разруливание номера контрола происходит по индексу (Index), переданному в качестве аргумента. (см. мой пред. пример) |
||
|
Silver
|
||||||
| 17.11.2011, 11:51 | ||||||
|
Заполнение списком значений будет выглядеть так:
|
||||||
|
2 / 2 / 1
Регистрация: 10.04.2011
Сообщений: 415
|
|
| 17.11.2011, 13:59 | |
|
А нафига вобще писать код-обработчик чекбоксов? Когда юзер сделает свои необходимые пометки и нажмет ОК, тогда в аналогичном цикле и перепишешь данные
0
|
|
|
Igrek
|
|
| 27.11.2011, 14:52 | |
|
Спасибо за содержательную дискуссию. Я попробую применить все варианты и потом еще здесь появлюсь и поделюсь результатами эксперимента. Игорь
|
|
|
22 / 5 / 1
Регистрация: 05.09.2010
Сообщений: 370
|
|
| 28.11.2011, 06:16 | |
|
Igrek, а почему не используется ListBox?
0
|
|
|
Сумрак
|
|
| 28.11.2011, 10:51 | |
|
Хм... 60 комбобоксов на форме - это многовато ИМХО... у меня рука не подымается больше 10 ложить... Не проще былобы подойти к вопросу несколько иначе? К примеру поместить ListView(В режиме таблицы) и кликая по нужным полям заполнять его из появившегося комбо или list? И обработка проще, и выглядит все наглядней.
Если просто как переключатели использовать то Masalov правильно советует - ListBox. |
|
|
Igrek
|
|
| 28.11.2011, 15:06 | |
|
Сегодня я просидел пару часов, с применением цикла получилось(предложение от Walker). А вот с массивом-нет. Массив я объявил(Dim newComboBox(60) As ComboBox : Set .... ) А вот тут споткнулся, не знаю как сделать, что ни писал, все выдается ошика, типа Invalid qualiter или др. А без "Set..." на строку newComboBox(i).RowSource="Предметы" выдается ошибка "object variable not set".SILVERу: не моглы бы Вы указать мне как правильно создать массив комбобоксов?
Теперь остальным, кому интересно: 60-это не критично, может быть и несколько меньше. Это моя первая работа, читал книгу "Прогр-ие в Эксел за 24 часа", другой нету. По ней все и делал. Задача в том, что предметы(их много и все разные),заносятся в начале на лист, создается поименованный диапазон(его я тоже назвал "предметы"). Пользователь же в форме их должен по заданным правилам занести по ячейкам. Сколько предметов-столько и ячеек. Я применил то, что знаю(или кажется знаю), а про Listbox или lisView - для меня пока еще не под силу. Буду рад если подскажете. Спасибо всем. |
|
|
Silver
|
|
| 28.11.2011, 15:25 | |
|
Во-первых я должен извиниться перед автором темы за то, что
ввел его в заблуждение. В VBA (в отличие от VB) нельзя создать массив контролов на форме! Поэтому тут будет работать только схема предложенная Johny Walker. Может сделать проще? И "прикрутить" комбобокс к нужным ячейкам, если они все равно заполняются из списка? Для этого нужно выбрать ячейку, войти в пункт меню "Данные/Проверка..." указать "Тип данных" - "Список", а в качестве источника именованный диапазон ("предметы"). |
|
|
Сумрак
|
|
| 28.11.2011, 15:27 | |
|
LV - ВЫ постоянно видите. в Win проводнике слева дерево справа он. Он может отображать в нескольких стандартных видах данные. Нас интересует табличный. Описывать я думю нет смысла, найти описание в любой книге для VB и VBA.
Я им постоянно пользуюсь из за его гибкости. Главное - это свойство TAG в строках. Туда можно положить индетификатор чего угодно. ячейки строки или всего вместе(Но парсить придется если все туда занести)Но все эже я порекомендовал рассмотерть и мой варинт. :-) Он посложнее в некотором смысле, но проще в сопровождении и програмировании. Вам не надо дамть 10, 20 или 100 элементов там может быть до .. тут не вспомню или 32000 или 64000. Добавляются они динамически. List или Combo один заполняется в ависимости от клика(и соответственно от ключа в свойстве TAG выбраной строки) и выбранное значение ставится в выбранное место. Т.к. Строки в LV являются массивом то их можно обрабатывать в цыкле. :-) ВОбщем я вроде все сказал. |
|
|
Igrek
|
|
| 28.11.2011, 17:16 | |
|
Сегодня я просидел пару часов, с применением цикла получилось(предложение от Walker). А вот с массивом-нет. Массив я объявил(Dim newComboBox(60) As ComboBox : Set .... ) А вот тут споткнулся, не знаю как сделать, что ни писал, все выдается ошика, типа Invalid qualiter или др. А без "Set..." на строку newComboBox(i).RowSource="Предметы" выдается ошибка "object variable not set".SILVERу: не моглы бы Вы указать мне как правильно создать массив комбобоксов?
Теперь остальным, кому интересно: 60-это не критично, может быть и несколько меньше. Это моя первая работа, читал книгу "Прогр-ие в Эксел за 24 часа", другой нету. По ней все и делал. Задача в том, что предметы(их много и все разные),заносятся в начале на лист, создается поименованный диапазон(его я тоже назвал "предметы"). Пользователь же в форме их должен по заданным правилам занести по ячейкам. Сколько предметов-столько и ячеек. Я применил то, что знаю(или кажется знаю), а про Listbox listViev -я их пока знаю слабо, буду рад если подскажете-приведете небольшой пример что-ли. Всем Спасибо. |
|
|
Сумрак
|
|
| 28.11.2011, 17:25 | |
|
хех... подсказать не трудно ... но надо знать что... если можно в краце - что Вы создаете и как оно должно выглядеть :-)Пока кроме 60 эл.управления на форме и таблицы в Excel мы ничего не видим. :-)
|
|
|
22 / 5 / 1
Регистрация: 05.09.2010
Сообщений: 370
|
|
| 29.11.2011, 07:01 | |
|
пример работы с ListBox
0
|
|
|
Igrek
|
|
| 29.11.2011, 13:07 | |
|
Во первых хочу извиниться за вчерашний ляп: одно и тоже сообщение отправил 2 раза. Спасибо Masalov''у за наглядный пример, все понятно, пригодится в следующих проектах. А вот про ListView(о нем писал Сумрак) я ничего не нашел,ни в инструментах, ни в справочной системе VB. Хотелось бы знать, что это такое? Для повышения уровня знаний. Спасибо.
|
|
|
Сумрак
|
|
| 29.11.2011, 19:54 | |
|
ListView - это элемент управления.
про него можно найти в любом учебнике по VB6, сейчас много таких в магазинах. У меня сейчас чистая ХРюша, а на вскидку не вспомню правильное название библы где он лежит. (но люди подскажут тут). Описывать все его возможности нет смысла лучше почитать про него в инете или в книге. Как он выглядит? Правая часть Проводника Windows - он и есть(ну может не он именно но точно такойже). :-) |
|
| 29.11.2011, 19:54 | |
|
Помогаю со студенческими работами здесь
19
Как можно сократить код Очень длинный код... Кто подскажет как сократить
Как сократить код? При запуске кода ошибка Procedure too large Сократить код Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|