我正在学习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
任何帮助将不胜感激。
答案 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
不过,我建议您使用标签而不是文本框作为总计,以使用户无法更改其值。
希望这会有所帮助!