Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 12
Excel

Слишком длинный типовой код в UserForm VBA. Как сократить код?

15.11.2018, 20:03. Показов 3320. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа выдает ошибку о слишком длинном коде.
1. Есть форма, в форме Multipage с 30 вкладками, на каждой вкладке 20 кнопок.
2. Тексты на кнопках привязаны к каждой ячейке.
3. Вызов формы обновляет первые 20 кнопок на первом листе.
4. Каждый клик по вкладке на Multipage обновляет значения своих 20 кнопок.

НО, код слишком длинный. как сократить? Я могу разбить код на отдельные модули, но как его вызвать при клике по вкладкам формы. Вот пример кода.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub MultiPage1_Change()
'Клик по вкладкам загружает название кнопок каждой вкладки отдельно. Поисковые операции назначены на кнопки.
Dim One As Variant
Select Case MultiPage1.Value
       Case 0: 'Страница ================================ 1 Не используется.
       
       Case 1: 'Страница ================================ 2
   Sheets("СЕРВ").Range("E23") = 2 'Обозначение выделенного таба Образец: 2,4,6,8 итд. (ВАРИАНТ)
   One = Sheets("СЕРВ").Range("E23").Value
   Button2_1.Caption = Worksheets("ПОИСК").Cells(4, One + 5).Text
   Button2_2.Caption = Worksheets("ПОИСК").Cells(5, One + 5).Text
   Button2_3.Caption = Worksheets("ПОИСК").Cells(6, One + 5).Text
   Button2_4.Caption = Worksheets("ПОИСК").Cells(7, One + 5).Text
   Button2_5.Caption = Worksheets("ПОИСК").Cells(8, One + 5).Text
   Button2_6.Caption = Worksheets("ПОИСК").Cells(9, One + 5).Text
   Button2_7.Caption = Worksheets("ПОИСК").Cells(10, One + 5).Text
   Button2_8.Caption = Worksheets("ПОИСК").Cells(11, One + 5).Text
   Button2_9.Caption = Worksheets("ПОИСК").Cells(12, One + 5).Text
   Button2_10.Caption = Worksheets("ПОИСК").Cells(13, One + 5).Text
   Button2_11.Caption = Worksheets("ПОИСК").Cells(14, One + 5).Text
   Button2_12.Caption = Worksheets("ПОИСК").Cells(15, One + 5).Text
   Button2_13.Caption = Worksheets("ПОИСК").Cells(16, One + 5).Text
   Button2_14.Caption = Worksheets("ПОИСК").Cells(17, One + 5).Text
   Button2_15.Caption = Worksheets("ПОИСК").Cells(18, One + 5).Text
   Button2_16.Caption = Worksheets("ПОИСК").Cells(19, One + 5).Text
   Button2_17.Caption = Worksheets("ПОИСК").Cells(20, One + 5).Text
   Button2_18.Caption = Worksheets("ПОИСК").Cells(21, One + 5).Text
   Button2_19.Caption = Worksheets("ПОИСК").Cells(22, One + 5).Text
   Button2_20.Caption = Worksheets("ПОИСК").Cells(23, One + 5).Text
Таких кодов 30 штук.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2018, 20:03
Ответы с готовыми решениями:

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

Пишу программу на i8080 не идет код слишком длинный
Добрый вечер помогите пожалуйста решить задачу на ассемблере 1.2.1 Ввести программу 7.2. и записать в ОЗУ с адреса 0900 по 090F...

Друзья немного сократить код VBA
Ребят, написал код. Но он слишком большой. очень много If. Как бы мне его сократить. Механика кода проста. Есть сводная таблица, он...

5
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
15.11.2018, 20:17
Как вариант - один длинный и 30 коротких:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Private Sub MultiPage1_Change()
Call MPage_Ch(MultiPage1)
End Sub
 
Private Sub MPage_Ch(x as object)
 
End Sub
'Клик по вкладкам загружает название кнопок каждой вкладки отдельно. Поисковые операции назначены на кнопки.
Dim One As Variant
Select Case x.Value
       Case 0: 'Страница ================================ 1 Не используется.
       
       Case 1: 'Страница ================================ 2
   Sheets("СЕРВ").Range("E23") = 2 'Обозначение выделенного таба Образец: 2,4,6,8 итд. (ВАРИАНТ)
   One = Sheets("СЕРВ").Range("E23").Value
   With Worksheets("ПОИСК")
   Button2_1.Caption = .Cells(4, One + 5).Text
   Button2_2.Caption = .Cells(5, One + 5).Text
   Button2_3.Caption = .Cells(6, One + 5).Text
   Button2_4.Caption = .Cells(7, One + 5).Text
   Button2_5.Caption = .Cells(8, One + 5).Text
   Button2_6.Caption = .Cells(9, One + 5).Text
   Button2_7.Caption = .Cells(10, One + 5).Text
   Button2_8.Caption = .Cells(11, One + 5).Text
   Button2_9.Caption = .Cells(12, One + 5).Text
   Button2_10.Caption = .Cells(13, One + 5).Text
   Button2_11.Caption = .Cells(14, One + 5).Text
   Button2_12.Caption = .Cells(15, One + 5).Text
   Button2_13.Caption = .Cells(16, One + 5).Text
   Button2_14.Caption = .Cells(17, One + 5).Text
   Button2_15.Caption = .Cells(18, One + 5).Text
   Button2_16.Caption = .Cells(19, One + 5).Text
   Button2_17.Caption = .Cells(20, One + 5).Text
   Button2_18.Caption = .Cells(21, One + 5).Text
   Button2_19.Caption = .Cells(22, One + 5).Text
   Button2_20.Caption = .Cells(23, One + 5).Text
Можно ещё какие аргументы добавить/обработать, то нам неведомо...
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
15.11.2018, 20:30
Лучший ответ Сообщение было отмечено MrKanzas как решение

Решение

Visual Basic
1
2
3
for i=1 to 20
controls("Button2_" & i).Caption = Worksheets("ПОИСК").Cells(i+3, One + 5).Text
next i
1
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,933
Записей в блоге: 4
15.11.2018, 20:33
небольшое сокращение кода(20%) при явном присвоении(без массивов, которые не всегда приемлемы)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 Private Sub MultiPage1_Change()
'Клик по вкладкам загружает название кнопок каждой вкладки отдельно. Поисковые операции назначены на кнопки.
Dim One As Variant
dim ws as worksheet
set ws=Worksheets("ПОИСК")
Select Case MultiPage1.Value
  Case 0: 'Страница ====== 1 Не используется.
  
  Case 1: 'Страница ====== 2
 Sheets("СЕРВ").Range("E23") = 2 
'Обозначение выделенного таба Образец: 2,4,6,8 итд. (ВАРИАНТ)
 One = Sheets("СЕРВ").Range("E23").Value
 Button2_1.Caption = ws.Cells(4, One + 5).Text
 Button2_2.Caption = ws.Cells(5, One + 5).Text
 Button2_3.Caption = ws.Cells(6, One + 5).Text
 Button2_4.Caption = ws.Cells(7, One + 5).Text
 Button2_5.Caption = ws.Cells(8, One + 5).Text
 Button2_6.Caption = ws.Cells(9, One + 5).Text
 Button2_7.Caption = ws.Cells(10, One + 5).Text
 Button2_8.Caption = ws.Cells(11, One + 5).Text
 Button2_9.Caption = ws.Cells(12, One + 5).Text
 Button2_10.Caption = ws.Cells(13, One + 5).Text
 Button2_11.Caption = ws.Cells(14, One + 5).Text
 Button2_12.Caption = ws.Cells(15, One + 5).Text
 Button2_13.Caption = ws.Cells(16, One + 5).Text
 Button2_14.Caption = ws.Cells(17, One + 5).Text
 Button2_15.Caption = ws.Cells(18, One + 5).Text
 Button2_16.Caption = ws.Cells(19, One + 5).Text
 Button2_17.Caption = ws.Cells(20, One + 5).Text
 Button2_18.Caption = ws.Cells(21, One + 5).Text
 Button2_19.Caption = ws.Cells(22, One + 5).Text
 Button2_20.Caption = ws.Cells(23, One + 5).Text
0
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 12
16.11.2018, 00:22  [ТС]
PureBasic
1
2
3
for i=1 to 20
controls("Button2_" & i).Caption = Worksheets("ПОИСК").Cells(i+3, One + 5).Text
next i
Удивительно, это наверное массивы. Это подходит. И Понимание открывает колоссальные возможности!
Назначение имени Листу тоже применимая идея!
Спасибо!
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
16.11.2018, 08:51
нет это не массивы это просто иная форма обращения к элементу на форме

Добавлено через 4 часа 9 минут
я вам еще одну хитрость расскажу
вынесите блок переименования в функцию
в этом случае нужно будет просто вызвать функцию и передать ей параметры
примерно будет так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub MultiPage1_Change()
Dim One As Long
Select Case MultiPage1.Value
  Case 0:   
  Case 1: 
 Sheets("СЕРВ").Range("E23") = 2 ' вот это не понятно сначала ячейке присвоили значение а следующей строкой считываем обратно - да и бог с ним лишь бы работало
 One = Sheets("СЕРВ").Range("E23").Value
call ChangeButtonCaption(One)
  Case 2:
Sheets("СЕРВ").Range("E23") = 3
 One = Sheets("СЕРВ").Range("E23").Value
call ChangeButtonCaption(One)
ну и собственно сама функция
Visual Basic
1
2
3
4
5
Private function ChangeButtonCaption(One as Long)
for i=1 to 20
UserName1.controls("Button2_" & i).Caption = Worksheets("ПОИСК").Cells(i+3, One + 5).Text
next i
end function
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2018, 08:51
Помогаю со студенческими работами здесь

Не получается запустить длинный код Алгоритма Гомори, код правильный.
Собственно как запустить код через С++Builder 6 #include<ctype.h> #include<string.h> #include<conio.h> #include<stdio.h> ...

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

Как сократить код?
Всем привет! Есть следующий код на c++ Builder: Edit1->Text="1"; Edit2->Text="2"; Edit3->Text="3"; ...

Как сократить код?
Может кто знает как сделать эти 2 кода компактными: procedure TForm5.Button1Click(Sender: TObject); var ini : TIniFile; begin ...

Как сократить код ?
сразу говорю я тупень который очень криво пишет. так что помогите. import matplotlib.pyplot as plt from matplotlib.ticker import...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru