多页用户窗体中的文本框退出事件

时间:2018-06-19 12:33:01

标签: excel vba excel-vba exit multipage

我有多页用户表单,其中有子多页表单。文本框退出事件不起作用,当用户窗体退出时它正在起作用。因此,我尝试了更新后事件。它工作正常,但如果输入的值不是数字,则无法在文本框中设置焦点。该代码工作正常。 userform不显示previos页面文本框。 下面是屏幕截图和代码 multipage screenshot



在第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

该代码未显示错误,但未将重点放在仍显示page2的文本框上。

2 个答案:

答案 0 :(得分:1)

您可以考虑使用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

答案 1 :(得分:1)

消息框中断设置了焦点

显示消息框(窗口)会中断您的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)。