Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
1

Как можно оптимизировать код?

10.07.2017, 09:00. Показов 1343. Ответов 21
Метки нет (Все метки)

Здравствуйте!

Столкнулся с проблемой. VBA стал ругаться на сильно длинный код. Надо его оптимизировать, а как сделать не знаю. Познаний мало.
По мере добавления информации код растёт и нутром чую должно быть какое-то эффектное решение данной задачи.

Вот часть кода:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
If Rows("385").Hidden = False And [AO385] = "Пригоден" Then
    OptionButton1.Enabled = True
    OptionButton2.Enabled = True
 
ElseIf Rows("485").Hidden = False And [AO485] = "Пригоден" Then
    OptionButton1.Enabled = True
    OptionButton2.Enabled = True
 
ElseIf Rows("585").Hidden = False And [AO585] = "Пригоден" Then
    OptionButton1.Enabled = True
    OptionButton2.Enabled = True
 
ElseIf Rows("685").Hidden = False And [AO685] = "Пригоден" Then
    OptionButton1.Enabled = True
    OptionButton2.Enabled = True
 
ElseIf Rows("785").Hidden = False And [AO785] = "Пригоден" Then
    OptionButton1.Enabled = True
    OptionButton2.Enabled = True
......................................................и т.д.
Строк может быть сколько угодно. Т.е. нужно смотреть по мере добавления информации. Узнать это можно например из наличия текста в каждой сотой строке.
Узнавать какая последняя заполненная строка и в цикл загонять?
Как можно это сделать?

Спасибо
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2017, 09:00
Ответы с готовыми решениями:

Как можно оптимизировать/ускорить код?
Здравствуйте, задача примерно такого типа: на экселевском листе есть данные в 3 колоннах (обозначим...

Как можно оптимизировать этот код по времени исполнения?
Добрый день уважаемые форумчане. Имеется такой код. У меня в файле 110 000 строк, и...

Можно ли оптимизировать код VBA Word
Есть код Dim i As Long Const he As String = "0123456789ABCDEF" Dim imm As Range Dim ChaR()...

Можно ли оптимизировать код внесения данных с листа Word в таблицу
есть текст в ВОРДЕ вида "E4 E B3 ECB1 F1 F2 F0 E0 F5 B3 FE 1EF8 EA EE EB E7 20 EE EC E2 B3 E4 EE...

21
1572 / 648 / 222
Регистрация: 09.06.2011
Сообщений: 1,321
10.07.2017, 09:46 2
код с коленки ...
Visual Basic
1
2
3
4
5
6
7
8
9
For i=385 to 785 step 100
  if rows(i).hidden = false then
    if cells(i,"AO").value =  "Пригоден" then
      OptionButton1.Enabled = True
      OptionButton2.Enabled = True
      exit for
    end if
  end if
next
1
1054 / 500 / 135
Регистрация: 27.02.2013
Сообщений: 1,442
10.07.2017, 10:25 3
Artem1977, попробуйте так
Visual Basic
1
2
3
4
5
6
For i = 385 To Rows.Count Step 100
 If Rows("i").Hidden = False And Cells(i, 41).Value = "Пригоден" Then
OptionButton1.Enabled = True
OptionButton2.Enabled = True
 End If
Next i
1
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
10.07.2017, 10:57  [ТС] 4
Объединил и использовал такой код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
For i = 385 To 1585 Step 100
    If Rows(i).Hidden = False And Cells(i, "AO").Value = "Пригоден" Then
        OptionButton1.Enabled = True
        OptionButton2.Enabled = True
        Exit For
    Else
        OptionButton1.Enabled = False
        OptionButton2.Enabled = False
    End If
Next i
Вроде работает, надо тестировать. Но здесь жестко привязан цикл. Могу и вручную число менять, но это же неправильно)))
Как мне мне правильно определить последнюю строчку??? Rows.count не срабатывает, т.к. есть пустые и скрытые строки. Но вот в каждой сотой ячейке "А" есть текст. Это можно как то использовать?

Добавлено через 6 минут
Хотя это и не принципиально. Могу число по-больше поставить, с запасом
0
181 / 180 / 30
Регистрация: 11.10.2016
Сообщений: 573
10.07.2017, 10:58 5
можно взять всё самое лучшее из вышеприведенного кода уважаемых Step_UA и OLEGOFF и тогда получится вот что:
Visual Basic
1
2
3
4
5
6
7
8
9
For i=385 to Rows.Count Step 100
  If Rows("i").Hidden = False Then
      If Cells(i, 41).Value = "Пригоден" Then
         OptionButton1.Enabled = True
         OptionButton2.Enabled = True
         Exit For
      Enf If
  End If
Next
блин, чуть опоздал с ответом (:
1
es geht mir gut
11490 / 4722 / 1181
Регистрация: 27.07.2011
Сообщений: 11,434
10.07.2017, 11:00 6
А так? (сам не проверял)

Visual Basic
1
2
3
4
5
6
7
8
9
       OptionButton1.Enabled = False
        OptionButton2.Enabled = False
For i = 385 To Cells(Rows.Count, "A").End(xlUp).Row Step 100
    If Rows(i).Hidden = False And Cells(i, "AO").Value = "Пригоден" Then
        OptionButton1.Enabled = True
        OptionButton2.Enabled = True
        Exit For
    End If
Next i
1
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
10.07.2017, 11:06  [ТС] 7
SoftIce, да, работает!!!

Всем спасибо!!!
0
6848 / 2786 / 525
Регистрация: 19.10.2012
Сообщений: 8,494
10.07.2017, 12:01 8
Где искать Rows("i")?
0
1054 / 500 / 135
Регистрация: 27.02.2013
Сообщений: 1,442
10.07.2017, 12:04 9
Цитата Сообщение от Hugo121 Посмотреть сообщение
Где искать Rows("i")?

Не по теме:

описка

0
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
13.07.2017, 08:15  [ТС] 10
В продолжение темы. В событиях Worksheet_Change имеется код.
Отрывок кода такой:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
If Not Intersect(Target, Range("BS612")) Is Nothing Then
    If [BS612] = "не соответствует" Then
        Rows("613:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    Else
        Rows("613").Hidden = False
        Rows("614:1048576").Hidden = True
        [BS613] = ""
        Range("BS613").Select
    End If
End If
 
If Not Intersect(Target, Range("BS613")) Is Nothing Then
    If [BS613] = "не герметичен" Then
        Rows("614:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    ElseIf [EB601] = 0 And [AO685] = "Пригоден" And [EC305] = 1 Then
        Rows("614:626").Hidden = False
        Rows("627:683").Hidden = True
        Rows("684:685").Hidden = False
        Rows("686:690").Hidden = True
        Rows("691:692").Hidden = False
        Rows("693:694").Hidden = True
        Rows("695:700").Hidden = False
        Range("AO696").Select
    ElseIf [EB601] = 0 And [AO685] = "Пригоден" And [EC305] <> 1 Then
        Rows("614:626").Hidden = False
        Rows("627:683").Hidden = True
        Rows("684:685").Hidden = False
        Rows("686:690").Hidden = True
        Rows("691:692").Hidden = True
        Rows("693:694").Hidden = False
        Rows("695:700").Hidden = False
        Range("AO694").Select
    ElseIf [EB601] = 0 And [AO685] = "Не пригоден" Then
        Rows("614:626").Hidden = False
        Rows("627:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    ElseIf [EB601] = 1 Then
        Rows("614:628").Hidden = False
        Rows("629:1048576").Hidden = True
        [AO628] = ""
        Range("AO628").Select
    End If
End If
 
If Not Intersect(Target, Range("AO628")) Is Nothing Then
    If [AO628] = "соответствует" And [AO685] = "Пригоден" And [EC305] = 1 Then
        Rows("629:683").Hidden = True
        Rows("684:685").Hidden = False
        Rows("686:690").Hidden = True
        Rows("691:692").Hidden = False
        Rows("693:694").Hidden = True
        Rows("695:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO696").Select
    ElseIf [AO628] = "соответствует" And [AO685] = "Пригоден" And [EC305] <> 1 Then
        Rows("629:683").Hidden = True
        Rows("684:685").Hidden = False
        Rows("686:690").Hidden = True
        Rows("691:692").Hidden = True
        Rows("693:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO694").Select
    ElseIf [AO628] = "не соответствует" Then
        Rows("629:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    End If
End If
 
If Not Intersect(Target, Range("AO694")) Is Nothing Then
    Range("AO696").Select
End If
Кода очень много, контролируемых ячеек также много и они не повторяются.
Начал ругаться VBA на то что очень много кода.

Как я понимаю надо всё это разделять на процедуры и вызывать их при наступлении событий?
А когда и этот лимит подойдёт, то всё, тушить свет? Или как то можно хитрее?
0
es geht mir gut
11490 / 4722 / 1181
Регистрация: 27.07.2011
Сообщений: 11,434
13.07.2017, 08:20 11
Цитата Сообщение от Artem1977 Посмотреть сообщение
А когда и этот лимит подойдёт, то всё, тушить свет?
Добавите ещё один модуль.
0
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
13.07.2017, 08:29  [ТС] 12
еще одно событие Worksheet_Change?

Добавлено через 4 минуты
Сейчас приходится переделывать так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
If Not Intersect(Target, Range("BS612")) Is Nothing Then
    call func
End If
 
sub func()
    If [BS612] = "не соответствует" Then
        Rows("613:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    Else
        Rows("613").Hidden = False
        Rows("614:1048576").Hidden = True
        [BS613] = ""
        Range("BS613").Select
    End If
end sub
Но мне не понятно что делать когда лимит закончится для строк
Visual Basic
1
2
3
If Not Intersect(Target, Range("BS612")) Is Nothing Then
    call func
End If
Добавлено через 1 минуту
Может сама логика у меня неправильно организована?
0
es geht mir gut
11490 / 4722 / 1181
Регистрация: 27.07.2011
Сообщений: 11,434
13.07.2017, 08:31 13
Цитата Сообщение от Artem1977 Посмотреть сообщение
еще одно событие Worksheet_Change?
Нет, в Worksheet_Change только вызов процедур.

Например, у Вас есть длинный код, такой:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
     'Код
End Sub
Разбиваем на процедуры так:
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
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Sub_1 Target
    Sub_2 Target
    Sub_3 Target
    Sub_4 Target
End Sub
 
Sub Sub_1(ByVal Target As Range)
     'Код
     'Код
     'Код
     'Код
End Sub
 
Sub Sub_2(ByVal Target As Range)
     'Код
     'Код
     'Код
     'Код
End Sub
 
Sub Sub_3(ByVal Target As Range)
     'Код
     'Код
     'Код
     'Код
End Sub
 
Sub Sub_4(ByVal Target As Range)
     'Код
     'Код
     'Код
     'Код
End Sub
0
es geht mir gut
11490 / 4722 / 1181
Регистрация: 27.07.2011
Сообщений: 11,434
13.07.2017, 08:34 14
Цитата Сообщение от Artem1977 Посмотреть сообщение
Может сама логика у меня неправильно организована?
Может и неправильно, нужно смотреть подробнее.
0
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
13.07.2017, 08:34  [ТС] 15
Не могу понять как в моём случае делать. Не так как я привёл пример?
0
es geht mir gut
11490 / 4722 / 1181
Регистрация: 27.07.2011
Сообщений: 11,434
13.07.2017, 08:42 16
Цитата Сообщение от Artem1977 Посмотреть сообщение
как в моём случае делать
Например, так:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Sub_1 Target
    Sub_2 Target
    Sub_3 Target
    Sub_4 Target
End Sub
 
Sub Sub_1(ByVal Target As Range)
  If Not Intersect(Target, Range("BS612")) Is Nothing Then
    If [BS612] = "не соответствует" Then
        Rows("613:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    Else
        Rows("613").Hidden = False
        Rows("614:1048576").Hidden = True
        [BS613] = ""
        Range("BS613").Select
    End If
End If
End Sub
 
Sub Sub_2(ByVal Target As Range)
 If Not Intersect(Target, Range("BS613")) Is Nothing Then
    If [BS613] = "не герметичен" Then
        Rows("614:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    ElseIf [EB601] = 0 And [AO685] = "Пригоден" And [EC305] = 1 Then
        Rows("614:626").Hidden = False
        Rows("627:683").Hidden = True
        Rows("684:685").Hidden = False
        Rows("686:690").Hidden = True
        Rows("691:692").Hidden = False
        Rows("693:694").Hidden = True
        Rows("695:700").Hidden = False
        Range("AO696").Select
    ElseIf [EB601] = 0 And [AO685] = "Пригоден" And [EC305] <> 1 Then
        Rows("614:626").Hidden = False
        Rows("627:683").Hidden = True
        Rows("684:685").Hidden = False
        Rows("686:690").Hidden = True
        Rows("691:692").Hidden = True
        Rows("693:694").Hidden = False
        Rows("695:700").Hidden = False
        Range("AO694").Select
    ElseIf [EB601] = 0 And [AO685] = "Не пригоден" Then
        Rows("614:626").Hidden = False
        Rows("627:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    ElseIf [EB601] = 1 Then
        Rows("614:628").Hidden = False
        Rows("629:1048576").Hidden = True
        [AO628] = ""
        Range("AO628").Select
    End If
End If
End Sub
 
Sub Sub_3(ByVal Target As Range)
   If Not Intersect(Target, Range("AO628")) Is Nothing Then
    If [AO628] = "соответствует" And [AO685] = "Пригоден" And [EC305] = 1 Then
        Rows("629:683").Hidden = True
        Rows("684:685").Hidden = False
        Rows("686:690").Hidden = True
        Rows("691:692").Hidden = False
        Rows("693:694").Hidden = True
        Rows("695:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO696").Select
    ElseIf [AO628] = "соответствует" And [AO685] = "Пригоден" And [EC305] <> 1 Then
        Rows("629:683").Hidden = True
        Rows("684:685").Hidden = False
        Rows("686:690").Hidden = True
        Rows("691:692").Hidden = True
        Rows("693:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO694").Select
    ElseIf [AO628] = "не соответствует" Then
        Rows("629:683").Hidden = True
        Rows("684:690").Hidden = False
        Rows("691:696").Hidden = True
        Rows("697:700").Hidden = False
        Rows("701:1048576").Hidden = True
        Range("AO687").Select
    End If
End If
End Sub
 
Sub Sub_4(ByVal Target As Range)
    If Not Intersect(Target, Range("AO694")) Is Nothing Then
       Range("AO696").Select
    End If
End Sub
1
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
13.07.2017, 08:50  [ТС] 17
Понял. Спасибо за разъяснения.
Теперь кода будет еще больше и ещё запутаннее будет)))

Добавлено через 1 минуту
А какое существует ограничение на количество процедур в одном модуле?
0
es geht mir gut
11490 / 4722 / 1181
Регистрация: 27.07.2011
Сообщений: 11,434
13.07.2017, 09:00 18
Цитата Сообщение от Artem1977 Посмотреть сообщение
А какое существует ограничение на количество процедур в одном модуле?
По-моему, на количество строк, что-то около 65000. Но ведь эти Sub_1, Sub_2 ...... можно перенести в другой модуль без проблем, они же Public

Добавлено через 2 минуты
Цитата Сообщение от Artem1977 Посмотреть сообщение
Теперь кода будет еще больше и ещё запутаннее будет)))
А что делать? В том куске кода, который Вы привели в качестве примера, оптимизировать нечего, по крайней мере я пока не увидел никакой системы.
0
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
17.07.2017, 05:44  [ТС] 19
И снова обращаюсь за помощью.
Имеется форма. В ней чекбоксами я выбираю то оборудование, которое мне нужно. И в соответствии с моим выбором открываются или скрываются те строки которые нужны для работы. Потом с этими данными ничего делать не нужно, они просто включаются в шапку отчета. Сейчас сделано по ужасному, всё в ручную. Для меня не проблема всё это вручную дописывать по мере появления новых элементов, но это же неправильно да и думаю что рано или поздно начнёт ругаться на too large code. Помогите, научите как надо, пожалуйста.
Итак. В первом фрейме у меня выбирается эталонное оборудование. Перечень его вручную забиваю в строки с 101 по 200. В наименование его имеется форматирование(касается степеней у единиц измерения). Количество строк для разного оборудования разное. Где две строки, где три, а есть и пять. Но начинается оно с длинного дефиса. Короткое название для чекбокса я также вношу вручную. Оно берется из строчки где речь идёт о заводском номере и состоит из заводского номера и текста который расположен перед ним. Т.е. например из такого: "...65353 имп, СКС-6, зав.№533. Регистрационный..." должно быть извлечена надпись для чекбокса "СКС-6, зав.№533".
Во втором фрейме расположено дополнительное оборудование. Его перечень расположен в строках с 201 по 300. Пока форматирования нет, но не исключаю что в дальнейшем может и появиться. Наименование для чекбоксов берётся полностью из строки, сразу же после длинного дефиса. По ширине текст пока умещается, а дальше непонятно, может горизонтальную полосу прокрутки?
Подумываю о том, чтобы в зависимости от содержимого в какой-нибудь ячейке, например FB1, у меня становились доступными(Enable=True) одни чекбоксы, и недоступными(Enable=False) другие. Что-то типа:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
If [FB1]=1 then 
checkbox1.enabled=true 
checkbox2.enabled=true
...
checbox8.enabled=false
checkbox9.enabled=true
checkbox10.enabled=false
...
elseif [FB1]=2 then 
checkbox1.enabled=true 
checkbox2.enabled=false
...
checbox8.enabled=true
checkbox9.enabled=true
checkbox10.enabled=false
...
и т.д.

Пока я их вручную отключаю
И было бы здорово, если эти недоступные чекбоксы у меня в списке и не появлялись. Но это так, хотелки
При инициализации формы должно проверяться что ранее было выбрано и помечать это в чекбоксах.
При нажатии на кнопку Ок должно проверяться что выбрано и открывать/строки в зависимости от выбора. Если не выбрано ничего, то скрывать и заголовок, который для 1-го фрейма находится в 101 строке, а для второго - в 201.
Сейчас у меня это сделано через проверки If..Then..Else. Это страшно, не масштабируемо

Помогите упростить код и сделать его масштабируемым при появлении новых записей.

P.s. В прилагаемом файле вырезано всё лишнее не относящееся к данной теме. Вообще в книге несколько листов, и этот лист имеет другое название, если это важно для работы. А также несколько форм.
0
Вложения
Тип файла: zip Книга1.zip (90.8 Кб, 3 просмотров)
0 / 0 / 1
Регистрация: 19.04.2017
Сообщений: 43
17.07.2017, 05:44  [ТС] 20
И снова обращаюсь за помощью.
Имеется форма. В ней чекбоксами я выбираю то оборудование, которое мне нужно. И в соответствии с моим выбором открываются или скрываются те строки которые нужны для работы. Потом с этими данными ничего делать не нужно, они просто включаются в шапку отчета. Сейчас сделано по ужасному, всё в ручную. Для меня не проблема всё это вручную дописывать по мере появления новых элементов, но это же неправильно да и думаю что рано или поздно начнёт ругаться на too large code. Помогите, научите как надо, пожалуйста.
Итак. В первом фрейме у меня выбирается эталонное оборудование. Перечень его вручную забиваю в строки с 101 по 200. В наименование его имеется форматирование(касается степеней у единиц измерения). Количество строк для разного оборудования разное. Где две строки, где три, а есть и пять. Но начинается оно с длинного дефиса. Короткое название для чекбокса я также вношу вручную. Оно берется из строчки где речь идёт о заводском номере и состоит из заводского номера и текста который расположен перед ним. Т.е. например из такого: "...65353 имп, СКС-6, зав.№533. Регистрационный..." должно быть извлечена надпись для чекбокса "СКС-6, зав.№533".
Во втором фрейме расположено дополнительное оборудование. Его перечень расположен в строках с 201 по 300. Пока форматирования нет, но не исключаю что в дальнейшем может и появиться. Наименование для чекбоксов берётся полностью из строки, сразу же после длинного дефиса. По ширине текст пока умещается, а дальше непонятно, может горизонтальную полосу прокрутки?
Подумываю о том, чтобы в зависимости от содержимого в какой-нибудь ячейке, например FB1, у меня становились доступными(Enable=True) одни чекбоксы, и недоступными(Enable=False) другие. Что-то типа:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
If [FB1]=1 then 
checkbox1.enabled=true 
checkbox2.enabled=true
...
checbox8.enabled=false
checkbox9.enabled=true
checkbox10.enabled=false
...
elseif [FB1]=2 then 
checkbox1.enabled=true 
checkbox2.enabled=false
...
checbox8.enabled=true
checkbox9.enabled=true
checkbox10.enabled=false
...
и т.д.

Пока я их вручную отключаю
И было бы здорово, если эти недоступные чекбоксы у меня в списке и не появлялись. Но это так, хотелки
При инициализации формы должно проверяться что ранее было выбрано и помечать это в чекбоксах.
При нажатии на кнопку Ок должно проверяться что выбрано и открывать/строки в зависимости от выбора. Если не выбрано ничего, то скрывать и заголовок, который для 1-го фрейма находится в 101 строке, а для второго - в 201.
Сейчас у меня это сделано через проверки If..Then..Else. Это страшно, не масштабируемо

Помогите упростить код и сделать его масштабируемым при появлении новых записей.

P.s. В прилагаемом файле вырезано всё лишнее не относящееся к данной теме. Вообще в книге несколько листов, и этот лист имеет другое название, если это важно для работы. А также несколько форм.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.07.2017, 05:44

Как оптимизировать код получения данных из массива?
Доброго времени суток :), Уважаемые форумчане :senor:, Пожалуйста помогите оптимизировать код. Есть...

Чем оптимизировать код, массивом или библиотекой и как?
Здравствуйте, не получается ускорить код используя массивы или библиотеки, не могу с их...

Оптимизировать код
Dim vopros1 As Variant vopros1 = Array(&quot; &quot;, &quot;А&quot;, &quot;ГММ&quot;, &quot;Ц&quot;, &quot;П&quot;, &quot;АА&quot;, &quot; &quot;, &quot; &quot;, &quot;Ц&quot;, &quot;ННД&quot;,...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.