【问题标题】:text box exit event in multipage userform多页用户表单中的文本框退出事件
【发布时间】:2018-06-19 12:33:00
【问题描述】:

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



在第 4 页我有文本框,输入详细信息后,我单击第 2 页继续。在此之前,我需要检查输入的详细信息是否为数字。如果它不是数字,我必须显示 page4 并专注于 text box1 以重新输入不起作用的详细信息。请帮帮我。

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 的文本框。

【问题讨论】:

  • 你确定你把这一切都放在了正确的用户表单中吗?您的代码表示 Userform1,但图像表示 Userform2
  • 您遇到什么错误?你想用UserForm1.MultiPage1.Value = 0 做什么?这不应该是UserForm1.MultiPage1.TextBox1.Value = 0之类的吗?
  • @Xabier 我没有收到任何错误。 [链接](UserForm1.MultiPage1.Value = 0) 我试图在用户表单中显示或导航多页页面 1。因为一旦我在文本框中输入值,如果我点击另一个多页说多页 page2,就会出现,然后我想导航到 multipage1 page4 中的文本框,如果它不是数字
  • @TaylorScott 它是 userform1 只是屏幕截图仅供参考。
  • 在文本框中有正确值后导航到 page2 的用户表单事件中是否还有代码?有时用户表单事件会以意想不到的顺序触发......

标签: vba excel exit multipage


【解决方案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)。

【讨论】:

  • 我试过不弹出消息框。仍然保持不变。它没有导航到 previos 多页文本框。我也尝试过隐藏和显示。没有成功
  • @sabarigiri,这对我来说没有问题(假设代码驻留在您的用户表单代码模块中) - 您是否在 msgbox 和 multiplage 语句之后设置了焦点,如上面的代码所示?
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多