Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
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. Должен же быть способ сократить текст процедур!? Помогите, кто знает, пожалуйста.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2011, 17:10
Ответы с готовыми решениями:

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

Слишком длинный типовой код в UserForm VBA. Как сократить код?
Программа выдает ошибку о слишком длинном коде. 1. Есть форма, в форме Multipage с 30 вкладками, на каждой вкладке 20 кнопок. 2. Тексты...

Как сократить код
Пример написаного кода 'RAD 1 'A mm ///////////////////////////////// 'B1R1A If TextBoxB1R1A.Value = "" Then ...

18
Silver
16.11.2011, 18:07
Сделай массив комбобоксов
и заполняй их в цикле
или создай на его основе UserControl, забей в него
изначально все данные и просто потом кидай на форму
2 / 2 / 1
Регистрация: 10.04.2011
Сообщений: 415
16.11.2011, 18:10
Да элементарно:
Visual Basic
1
2
3
4
5
' ...
for i=1 to 60
  Controls("ComboBox" & format(i)).RowSource = "Предметы"
next i
' ...
Дальше сам разберешься?
0
Silver
16.11.2011, 18:12
Лучше массив
Тогда и выборка значения будет проще:
Visual Basic
1
2
3
Sub ComboBox_Click(Index As Integer)
   предмет(Index)= ComboBox(Index).Value. 
End Sub
2 / 2 / 1
Регистрация: 10.04.2011
Сообщений: 415
17.11.2011, 11:39
для Silver: чем твой способ лучше (проще) моего, там ведь приходится массив использовать?
0
Silver
17.11.2011, 11:48
для Silver: чем твой способ лучше (проще) моего, там ведь приходится массив использовать?
Лучше тем, что если использовать твой метод, т.е. кучу комбобоксов
(ComboBox1,ComboBox2,...,ComboBox60) то для обработки события (например)
Click нужно будет 60 раз написать один и тот-же код для каждого ComboBox.
О чем и говорил автор темы.
В случае же с массивом код пишется один раз. А разруливание
номера контрола происходит по индексу (Index), переданному
в качестве аргумента. (см. мой пред. пример)
Silver
17.11.2011, 11:51
Заполнение списком значений будет выглядеть так:
Visual Basic
1
2
3
for i=1 to 60
   ComboBox(i).RowSource = "Предметы"
next i
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 - он и есть(ну может не он именно но точно такойже). :-)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2011, 19:54
Помогаю со студенческими работами здесь

Как можно сократить код
Sub Макрос2() ' ' Макрос2 Макрос ' ' Range("B20:B28").Select Range("B28").Activate Selection.Copy ...

Очень длинный код... Кто подскажет как сократить
Sub ВзрывГОСТ() ' ' Давление100 Макрос ' Вычисляет давление в 100 кПа (ГОСТ или НПБ) ' ' Сочетание клавиш: Ctrl+q ' ...

Как сократить код макроса и сделать цикл на 12 итераций?
Доброго времени суток. Поможете с циклом? Это автомакрос, который на указанном листе делает фильтр по критерию - Город, затем копирует...

Как сократить код? При запуске кода ошибка Procedure too large
На странице эксель расположено 100 фигур,я написал код чтоб фигуры закрашивались в цвет ячейки,но после 80 фигуры vba выдал ошибку...

Сократить код
Hello World, помогите придумать обработку замены + 1 +2 +3 итд в цикл, тем самым сократить код For n = 1 To 41 Step 10 If...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Реалии
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
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru