我可以循环遍历 VBA 中的用户表单文本框输入事件吗?

Can I loop through Userform Textbox enter event in VBA?

我有一个包含 150 多个文本框(数字)的用户表单,我希望能够使用显示的加号和减号按钮添加到其中。

我已经对每个文本框输入事件进行了硬编码,并且觉得必须有一种更直接的方法。

我可以循环访问这些文本框事件吗?

Userform with 150 textboxes

Dim NumTest As Integer


Private Sub TextBox1_Enter()
    NumTest = 1
End Sub
Private Sub TextBox2_Enter()
    NumTest = 2
End Sub
Private Sub TextBox3_Enter()
    NumTest = 3
End Sub
Private Sub TextBox4_Enter()
    NumTest = 4
End Sub
Private Sub TextBox5_Enter()
    NumTest = 5
End Sub
Private Sub TextBox6_Enter()
    NumTest = 6
End Sub
Private Sub TextBox7_Enter()
    NumTest = 7
End Sub
Private Sub TextBox8_Enter()
    NumTest = 8
End Sub
Private Sub TextBox9_Enter()
    NumTest = 9
End Sub
Private Sub TextBox10_Enter()
    NumTest = 10
End Sub
Private Sub TextBox11_Enter()
    NumTest = 11
End Sub
Private Sub TextBox12_Enter()
    NumTest = 12
End Sub
'And so on....

我有以下内容可以添加


'*********************ADD/SUBTRACT BUTTONS ******************************
Private Sub CommandButtonMOne_Click()
    Me("TextBox" & NumTest).Value = Me("TextBox" & NumTest).Value - 1
End Sub
Private Sub CommandButtonMFiv_Click()
    Me("TextBox" & NumTest).Value = Me("TextBox" & NumTest).Value - 5
End Sub

Private Sub CommandButtonMTen_Click()
    Me("TextBox" & NumTest).Value = Me("TextBox" & NumTest).Value - 10
End Sub
Private Sub CommandButtonPOne_Click()
    Me("TextBox" & NumTest).Value = Me("TextBox" & NumTest).Value + 1
End Sub
Private Sub CommandButtonPFiv_Click()
    Me("TextBox" & NumTest).Value = Me("TextBox" & NumTest).Value + 5
End Sub
Private Sub CommandButtonPTen_Click()
    Me("TextBox" & NumTest).Value = Me("TextBox" & NumTest).Value + 10
End Sub

如果需要更改文本框的数量,这是一个挑战,因为虽然您可以动态添加文本框并将代码附加到它们的“更改”事件,但我不知道有什么方法可以附加到“输入”或“点击”事件。如果您不需要在运行时更改文本框的数量,我建议编写一个循环来为文本框生成 VBA 代码,然后将其粘贴到您的模块中。类似于以下内容:

Sub write_code()
 Dim x As Integer
 For x = 1 To 150
  Debug.Print "Private Sub TextBox" & x & "_Enter():";
  Debug.Print "NumTest = " & x & ":End Sub"
  Next
End Sub

我已经在一行中编写了生成事件 sub-procedures 的代码,因为您需要 150 行,而调试 window 总共限制为 200 行。

如果文本框的数量在运行时发生变化,我可以更多地考虑如何执行此操作。所以如果是这样的话,请在下面评论。

因为您只需要更改最近选择的文本框的值,所以您可以使用表单的 ActiveControl 属性 来判断选择了哪个文本框。这将不需要文本框上的代码。但是,因为当您单击按钮时按钮会获得焦点,所以您不能对按钮使用此方法。您可以将按钮更改为标签,并在标签的“点击”事件上编写代码。标签将起作用,因为它们在单击时不会获得焦点。

“Plus 5 标签”的代码如下所示:

ActiveControl.Value = ActiveControl.Value + 5

即使文本框是在运行时创建的,这种方法也适用。如果没有选中文本框,这段代码会报错,所以可以加一个if语句来检查,如下:

Private Sub lblAddFive_Click()
  If TypeName(ActiveControl) = "TextBox" Then
    ActiveControl.Value = ActiveControl.Value + 5
  Else
    MsgBox "Selecte a textbox first."
  End If
End Sub