Использование класса, как следует из приведенного выше ответа, является хорошей стратегией для краткого и элегантного обращения со многими элементами управления:
1) Я не вижу проблем в создании 25 событий с 1линия, вызывающая частную процедуру общей пользовательской формы, если количество элементов управления не является динамическим.Это философия KISS .
2) В общем, я считаю событие Изменение очень тревожным, потому что он выполняет весь пересчет каждой введенной цифры.Это более разумно и умеренно сделать это, используя событие Выход или Перед обновлением , поскольку оно выполняет пересчет только при выборе значения.Например, Google Instant раздражает меня, пытаясь вернуть ответы, потребляя ресурсы, но пользователь не определил вопрос.
3) Возникла проблема с проверкой.Я согласен, что вы можете избежать неправильных ключей с событием Изменить , однако, если вам нужно проверить данные, вы не можете знать, продолжит ли пользователь печатать или данные готовы к проверке.
4) Следует помнить, что Изменить или Выход события не вынуждает пользователя передавать текстовые поля, поэтому система должна быть повторно проверена и пересчитана при попытке выйти изформа без отмены.
Следующий код прост, но эффективен для статических форм.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call AutoCalc(Cancel)
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call AutoCalc(Cancel)
End Sub
.....
Private Sub TextBox25_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call AutoCalc(Cancel)
End Sub
Private Function Valid
.....
End Function
Private Sub AutoCalc(Canc As Variant)
If Not Valid() Then Canc=True
' Calculation
End Sub
Если вы привыкли экономить время, вы можете создать общую подпрограмму VBA для генерации кодадля событий, связанных с элементами управления в форме, которая соответствует маске.Этот код может быть в виде черновика (безопаснее генерировать непосредственно код, который содержит ошибки в некоторых версиях Excel), а затем скопировать и вставить в модуль формы.
Sub GenerateEvent(Form As String, Mask As String, _
Evento As String, Code As String)
' Form - Form name in active workbook
' Mark - String piece inside control name
' Evento - Event name to form procedure name
' Code - Code line inside event
Dim F As Object
Dim I As Integer
Dim L As Long
Dim R As Range
Dim Off As Long
Set F = ThisWorkbook.VBProject.VBComponents(Form)
Set R = ActiveCell ' Destination code
Off = 0
For I = 0 To F.Designer.Controls.Count - 1
If F.Designer.Controls(I).Name Like "*" & Mask & "*" Then
R.Offset(Off, 0) = "Private Sub " & _
F.Designer.Controls(I).Name & "_" & Evento & "()"
R.Offset(Off + 1, 0) = " " & Code
R.Offset(Off + 2, 0) = "End Sub"
Off = Off + 4
End If
Next I
End Sub
Sub Test()
Call GenerateEvent("FServCons", "tDt", "Exit", _
"Call AtuaCalc(Cancel)")
End Sub