Userform - 在MsgBox之后将焦点重定向到文本框

时间:2018-04-04 09:57:34

标签: excel vba excel-vba userform setfocus

我希望这不是那么愚蠢,但我真的找不到一个适合我的帖子。 情况:我希望有人在Userform的文本框中输入日期 ErrorHandler:如果用户没有输入正确的格式,我想要一个非常简单的解决方案。 (EB_Start.Activate和EB_Start.SetFocus根本不起作用)

为此,我得到了:

Private Sub EB_Ende_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
   On Error GoTo Error_Handler
   Me.EB_Ende = CDate(Me.EB_Ende)                                                  
      Error_Handler:
      EB_Start.Activate
      EB_Start.SetFocus
MsgBox ("Please enter a valid date"), , "Datum"
End Sub

问题: 我现在的问题是,如何将焦点重定向到文本框(EB_Ende) 目前的反应是,在用户按下Enter后,MsgBox出现后,它继续到下一个文本框,但我希望用户被迫重新输入文本框中的有效日期。

如果有人可以帮我解决这个问题,或者将我重定向到可以回答我的问题的帖子或链接,我会非常感激。

祝你好运, Lutscha

这是整个UserForm Sry it is in german

3 个答案:

答案 0 :(得分:2)

BeforeUpdate事件中设置焦点不会起作用 - 现在还为时过早。在将焦点移动到下一个控件之前触发它。更好的方法是处理Exit事件并在需要时取消它:

Private Sub EB_Ende_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  On Error GoTo Error_Handler
  EB_Ende = CDate(EB_Ende)
  Exit Sub   '<-- exit sub when there is no error
Error_Handler:
  Cancel = True
  MsgBox ("Please enter a valid date"), , "Datum"
End Sub

答案 1 :(得分:2)

您的代码存在一些问题(例如,在错误处理程序之前没有退出,并且当您收到错误时,是否要使用Cancel=msoTrue取消EB_Ende的文本条目?)所以你可以试试这个:

Private Sub EB_Ende_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
   On Error GoTo Error_Handler
   Me.EB_Ende = CDate(Me.EB_Ende)                                                  
   Exit Sub
Error_Handler:
    EB_Start.SetFocus
    MsgBox ("Please enter a valid date"), , "Datum"
End Sub

或者,您可以完全跳过错误处理程序:

Private Sub EB_Ende_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    If IsDate(Me.EB_Ende) Then
        Me.EB_Ende = CDate(Me.EB_Ende)                                                  
    Else
        Cancel = msoTrue
        EB_Start.SetFocus
        MsgBox ("Please enter a valid date"), , "Datum"
    End If
End Sub

答案 2 :(得分:1)

有趣的是,你将答案用作问题的标签:

Me.EB_Ende.SetFocus

Here是关于SetFocus的更多信息。

其他可能有帮助的东西......你可以改变对象的默认顺序&#34; tabbed&#34;通过。 (即,在当前控件中按Enter或tab后,哪个单元格应该聚焦:

img