Вот пример, который использует событие Change в модуле класса. Предполагается, что пользовательская форма называется UserForm1, поэтому измените имя соответствующим образом. Кроме того, вы можете изменить поведение кода в зависимости от ваших предпочтений, но, по крайней мере, это только начало.
Сначала в редакторе Visual Basic вставьте модуль класса (Редактор Visual Basic >> Вставить >> Модуль класса). Затем в окне свойств (F4) назовите свой класс clsTextBox. Затем поместите следующий код в модуль кода для класса ...
Option Explicit
Public WithEvents tb As MSForms.textBox
Private Sub tb_Change()
Dim textboxCollection As Collection
Dim textBox As clsTextBox
Dim total As Long
Set textboxCollection = UserForm1.getTextBoxCollection()
total = 0
For Each textBox In textboxCollection
If Len(textBox.tb.Value) > 0 Then
If IsNumeric(textBox.tb.Value) Then
total = total + textBox.tb.Value
Else
With textBox.tb
.SetFocus
.SelStart = 0
.SelLength = Len(.Value)
End With
End If
End If
Next textBox
UserForm1.txtPlayer1_1_Total.Value = total
End Sub
Затем поместите следующий код в модуль кода для пользовательской формы ...
Option Explicit
Dim m_textboxCollection As New Collection
Private Sub UserForm_Initialize()
Dim ctrl As MSForms.Control
Dim textBox As clsTextBox
For Each ctrl In Me.Controls
If InStr(1, ctrl.Name, "Score", vbTextCompare) > 0 Then
Set textBox = New clsTextBox
Set textBox.tb = ctrl
m_textboxCollection.Add textBox
End If
Next ctrl
End Sub
Public Property Get getTextBoxCollection()
Set getTextBoxCollection = m_textboxCollection
End Property
Я хотел бы предложить, однако, чтобы вы использовали метку вместо текстового поля для итога, чтобы пользователь не смог изменить его значение.
Надеюсь, это поможет!