其他TextBox更新后更新TextBox的值

时间:2019-06-29 20:16:09

标签: excel vba controls

我正在学习VBA,并且正在为我的本地台球厅的联赛经理工作(那家伙喜欢Excel)。我已经创建了一个UserForm来输入分数,我正在寻找一种更简单的方法来在其中编写控件。我有一个TextBox,它需要显示UserForm中其他TextBox中包含的值的总和。除了编写每个文本框都包含相同代码的AfterUpdate子例程外,还有一种方法可以说

-如果任何文本框发生更改或更新,则更新此金额

我的研究向我指出了为TextBoxes使用类的方向,但是我读到的是WithEvents修饰符不支持Change或Update之前/之后,并且我无法找到一个示例解决了我的问题。还是一个仅适用于我要分组的TextBox,而不适用于所有TextBoxes的示例。如前所述,我可以为每个TextBox轻松编写一个重复的子例程(如下所示),但是我觉得有一种更有效的方法。

Private Sub txtPlayer1_1_Score6_AfterUpdate()
    txtPlayer1_1_Total.Value = CInt(txtPlayer1_1_Score1.Value) + _
                               CInt(txtPlayer1_1_Score2.Value) + _
                               CInt(txtPlayer1_1_Score3.Value) + _
                               CInt(txtPlayer1_1_Score4.Value) + _
                               CInt(txtPlayer1_1_Score5.Value) + _
                               CInt(txtPlayer1_1_Score6.Value)

End Sub

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这是在类模块中使用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

不过,我建议您使用标签而不是文本框作为总计,以使用户无法更改其值。

希望这会有所帮助!