Всем здравия. Сразу оговорюсь – мой макрос работает. Но есть момент, который выглядит весьма громоздко. Решаю такую вот задачу: Моя форма UserForm имеет 29 одинаковых блоков Frames, в каждом из которых есть 9 нажимаемых объектов. Для упрощения работы с ними я присвоил им названия исходя из их функционала. Например, для Frame1 это: PredmetComboBox1, PedNagruzkaTextBox1, OptionBottonOB1, OptionBottonOS1, RazriadComboBox1, TetradTextBox1, KabinetTextBox1, RukovodTextBox1, MetodTextBox1. Для Frame2, соответственно: PredmetComboBox2, PedNagruzkaTextBox2, OptionBottonOB2, OptionBottonOS2, RazriadComboBox2, TetradTextBox2, KabinetTextBox2, RukovodTextBox2, MetodTextBox2. Ну, и так далее до 29. Изменение данных любого из перечисленных объектов должно отслеживаться, для чего пришлось написать 29*9=261 процедуру... Помогите, пожалуйста, привести это в более изящное компактное состояние.
Private Sub PredmetComboBox2_Change ()
Call общая_процедура (передаваемые параметры)
End Sub
Private Sub общая_процедура (принимаемые параметры)
здесь_работаем
End Sub
Так у меня и реализовано. Для этого написано 261 процедура с реакцией на изменение свойства _Change. Я имел ввиду, есть ли возможность написать их 9 и прокрутить по циклу 29 раз?
Не всегда оправдано. Возможно, тоже приводится к одному блоку?
ListBox с предметами, поля для ввода значений, ListBox с результатом. Выбираем предмет, вносим значения, сохраняем запись (добавляется во второй список). После обработки/корректировки второго списка сохраням данные куда надо.. Это зависит от задачи. Ну, и вопрос для другой темы.
'>>>>>>>>>> Предмет 1 <<<<<<<<<< Private Sub PredmetComboBox1_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub PedNagruzkaTextBox1_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub OptionBottonOB1_Click() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub OptionBottonOS1_Click() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub RazriadComboBox1_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub TetradTextBox1_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub KabinetTextBox1_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub RukovodTextBox1_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub MetodTextBox1_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub '--------------------------------------------------------------------- '>>>>>>>>>> Предмет 2 <<<<<<<<<< Private Sub PredmetComboBox2_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub PedNagruzkaTextBox2_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub OptionBottonOB2_Click() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub OptionBottonOS2_Click() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub RazriadComboBox2_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub TetradTextBox2_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub KabinetTextBox2_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub RukovodTextBox2_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub Private Sub MetodTextBox2_Change() If llArrPredmet_Filling Then Call ArrPredmet_Filling End Sub
Модули классов это единственно верный вариант, потому что даже если вывести основной обработчик в одну процедуру, все равно потребуется 261 событие что бы эту процедуру вызвать, а модули классов все эти процедуры вызова сокращают в разы.
"Все гениальное просто, а все простое гениально!!!"
Вероятно, Вы не совсем уловили суть, а я от вопроса в сторону не уходил. Список предметов в UserForm не динамический. Не стоит только такая задача просто вбить преподаваемые позиции и сопутствующие им параметры. Нужно всё это ещё и визуально контролировать по каждому из преподавателей (первое поле вверху для выборки ФИО), а также периодически вносить изменения. Поэтому была создана избыточная таблица (БД) на 29 строк – 3 страницы по десятку.
P.S. Файл примера выслан быть не может ввиду гигантности файла с зарплатой, где все листы взаимозависимы друг от друга. Поковыряю мозг по ссылке от Дмитрий(The_Prist) Щербаков.
Дмитрий , ещё раз спасибо за именно эту конкретную ссылку. Всё, что до этого по модулям классов выдал мне интернет, у меня не работало.
Теперь моя простынь из 261 процедуры сузилась то 9.
Скрытый текст
(1). В главном модуле объявил: Public arrComboBoxPredmet() As New Class1 Public arrTextBoxPedNagruzka() As New Class1 Public arrOptionButtonOB() As New Class1 Public arrOptionButtonOS() As New Class1 Public arrComboBoxRazriad() As New Class1 Public arrTextBoxTetrad() As New Class1 Public arrTextBoxKabinet() As New Class1 Public arrTextBoxRukovod() As New Class1 Public arrTextBoxMetod() As New Class1
(2). В коде UserForm заполнил: Private Sub UserForm_Activate() ... For i = 1 To 29 Set arrComboBoxPredmet(i).objComboBoxPredmet = Me.Controls("PredmetComboBox" & i) Set arrTextBoxPedNagruzka(i).objTextBoxPedNagruzka = Me.Controls("PedNagruzkaTextBox" & i) Set arrOptionButtonOB(i).objOptionButtonOB = Me.Controls("OptionButtonOB" & i) Set arrOptionButtonOS(i).objOptionButtonOS = Me.Controls("OptionButtonOS" & i) Set arrComboBoxRazriad(i).objComboBoxRazriad = Me.Controls("RazriadComboBox" & i) Set arrTextBoxTetrad(i).objTextBoxTetrad = Me.Controls("TetradTextBox" & i) Set arrTextBoxKabinet(i).objTextBoxKabinet = Me.Controls("KabinetTextBox" & i) Set arrTextBoxRukovod(i).objTextBoxRukovod = Me.Controls("RukovodTextBox" & i) Set arrTextBoxMetod(i).objTextBoxMetod = Me.Controls("MetodTextBox" & i) Next ... End Sub
(3). В модуле классов объявил: Public WithEvents objComboBoxPredmet As MSForms.ComboBox Public WithEvents objTextBoxPedNagruzka As MSForms.TextBox Public WithEvents objOptionButtonOB As MSForms.OptionButton Public WithEvents objOptionButtonOS As MSForms.OptionButton Public WithEvents objComboBoxRazriad As MSForms.ComboBox Public WithEvents objTextBoxTetrad As MSForms.TextBox Public WithEvents objTextBoxKabinet As MSForms.TextBox Public WithEvents objTextBoxRukovod As MSForms.TextBox Public WithEvents objTextBoxMetod As MSForms.TextBox
(4). Ну, и, наконец, бывшая простынь – в модуле классов написал: Private Sub objComboBoxPredmet_Change() Call Array_Filling_Predmet(IndexOf(objComboBoxPredmet.Name)) End Sub ' Private Sub objTextBoxPedNagruzka_Change() Call Array_Filling_PedNagruzka(IndexOf(objTextBoxPedNagruzka.Name)) End Sub ' Private Sub objOptionButtonOB_Change() Call Array_Filling_Budget(IndexOf(objOptionButtonOB.Name)) End Sub ' Private Sub objOptionButtonOS_Change() Call Array_Filling_Budget(IndexOf(objOptionButtonOS.Name)) End Sub ' Private Sub objComboBoxRazriad_Change() Call Array_Filling_Razriad(IndexOf(objComboBoxRazriad.Name)) End Sub ' Private Sub objTextBoxTetrad_Change() Call Array_Filling_Tetrad(IndexOf(objTextBoxTetrad.Name)) End Sub ' Private Sub objTextBoxKabinet_Change() Call Array_Filling_Kabinet(IndexOf(objTextBoxKabinet.Name)) End Sub ' Private Sub objTextBoxRukovod_Change() Call Array_Filling_Rukovod(IndexOf(objTextBoxRukovod.Name)) End Sub ' Private Sub objTextBoxMetod_Change() Call Array_Filling_Metod(IndexOf(objTextBoxMetod.Name)) End Sub ' Private Function IndexOf(ByVal cString As String) As Integer IndexOf = Val(Right(cString, 2)) If IndexOf = 0 Then IndexOf = Val(Right(cString, 1)) End Function