多页用户窗体中的文本框退出事件
text box exit event in multipage userform
我有一个包含子多页的多页用户表单。文本框退出事件不起作用它在用户窗体退出时起作用。所以我尝试了更新后的事件。它工作正常,但如果输入的值不是数字,我无法将焦点设置为文本框。代码工作正常。用户窗体不显示 previos 页面文本框。
下面是屏幕截图和代码
在第 4 页我有文本框,输入详细信息后,我单击第 2 页继续。在此之前,我需要检查输入的 detaisl 是否为数字。如果它不是数字,我必须显示 page4 并关注文本框 1 以重新输入无效的详细信息。请大家帮帮我。
Private Sub TextBox3_AfterUpdate()
If Len(UserForm1.TextBox3.Value) <> 0 And _
IsNumeric(UserForm1.TextBox3.Value) = False Then
UserForm1.MultiPage1.Value = 0
userform1.multipage2.value = 1
UserForm1.TextBox3.SetFocus
MsgBox "Only Numbers are Allowed!!"
End If
End Sub
代码没有显示错误,但它没有关注仍然显示第 2 页的文本框。
您可以考虑使用 keydown 事件来防止非数字输入以及像这样的东西
'' allows checking numlock
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Const ksCapital As Long = 20
Private Const ksNumLock As Long = 144
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyBack, vbKeyDelete, vbKeyLeft, vbKeyRight, vbKeyInsert, vbKeyNumlock
'' allow deleting, moving, changing numlock
Case Asc(0) To Asc(9)
'' if input is a number, not a symbol let it remain
If Shift Eqv Not GetKeyState(ksNumLock) Then KeyCode = 0
Case Asc("-")
'' allow negatives
If InStr(1, Me.TextBox1.Text, "-") > 0 Or Me.TextBox1.SelStart > 0 Then Let KeyCode = 0
Case Asc(".")
'' allow decimals
If InStr(1, Me.TextBox1.Text, ".") > 0 Then Let KeyCode = 0
Case Else
'' allow nothing else
Let KeyCode = 0
End Select
End Sub
消息框中断设置焦点
显示消息框 (window) 会中断您的 SetFocus
代码。为了解决这个问题,只需通过
隐藏后重新显示用户表单
Me.Hide: Me.Show
另一种方法是通过 标签 标题消息显示错误消息。
使用您的原始代码修改示例:
Private Sub TextBox3_AfterUpdate()
If Len(Me.TextBox3.Value) <> 0 And _
IsNumeric(Me.TextBox3.Value) = False Then
Me.MultiPage1.Value = 0
MsgBox "Only Numbers are allowed!!"
Me.MultiPage2.Value = 1
Me.TextBox3.SetFocus
Me.Hide: Me.Show ' << work around by redisplaying userform
End If
End Sub
提示
在用户窗体代码模块本身中使用 Me.
前缀比 UserForm1.
更好地识别控件(并允许 IntelliSense)。
我有一个包含子多页的多页用户表单。文本框退出事件不起作用它在用户窗体退出时起作用。所以我尝试了更新后的事件。它工作正常,但如果输入的值不是数字,我无法将焦点设置为文本框。代码工作正常。用户窗体不显示 previos 页面文本框。
下面是屏幕截图和代码
在第 4 页我有文本框,输入详细信息后,我单击第 2 页继续。在此之前,我需要检查输入的 detaisl 是否为数字。如果它不是数字,我必须显示 page4 并关注文本框 1 以重新输入无效的详细信息。请大家帮帮我。
Private Sub TextBox3_AfterUpdate()
If Len(UserForm1.TextBox3.Value) <> 0 And _
IsNumeric(UserForm1.TextBox3.Value) = False Then
UserForm1.MultiPage1.Value = 0
userform1.multipage2.value = 1
UserForm1.TextBox3.SetFocus
MsgBox "Only Numbers are Allowed!!"
End If
End Sub
代码没有显示错误,但它没有关注仍然显示第 2 页的文本框。
您可以考虑使用 keydown 事件来防止非数字输入以及像这样的东西
'' allows checking numlock
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Const ksCapital As Long = 20
Private Const ksNumLock As Long = 144
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyBack, vbKeyDelete, vbKeyLeft, vbKeyRight, vbKeyInsert, vbKeyNumlock
'' allow deleting, moving, changing numlock
Case Asc(0) To Asc(9)
'' if input is a number, not a symbol let it remain
If Shift Eqv Not GetKeyState(ksNumLock) Then KeyCode = 0
Case Asc("-")
'' allow negatives
If InStr(1, Me.TextBox1.Text, "-") > 0 Or Me.TextBox1.SelStart > 0 Then Let KeyCode = 0
Case Asc(".")
'' allow decimals
If InStr(1, Me.TextBox1.Text, ".") > 0 Then Let KeyCode = 0
Case Else
'' allow nothing else
Let KeyCode = 0
End Select
End Sub
消息框中断设置焦点
显示消息框 (window) 会中断您的 SetFocus
代码。为了解决这个问题,只需通过
Me.Hide: Me.Show
另一种方法是通过 标签 标题消息显示错误消息。
使用您的原始代码修改示例:
Private Sub TextBox3_AfterUpdate()
If Len(Me.TextBox3.Value) <> 0 And _
IsNumeric(Me.TextBox3.Value) = False Then
Me.MultiPage1.Value = 0
MsgBox "Only Numbers are allowed!!"
Me.MultiPage2.Value = 1
Me.TextBox3.SetFocus
Me.Hide: Me.Show ' << work around by redisplaying userform
End If
End Sub
提示
在用户窗体代码模块本身中使用 Me.
前缀比 UserForm1.
更好地识别控件(并允许 IntelliSense)。