用户窗体 - 在 MsgBox 之后将焦点重定向到文本框

Userform - Redirect focus on textbox after MsgBox

我希望这不是那么愚蠢,但我确实没有找到适合我的 post。 情况:我希望有人在用户表单的文本框中输入日期。
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) 目前的反应是,用户在 MsgBox 出现后按 Enter 后,它继续到下一个文本框,但我希望用户被强制在文本框中重新输入有效日期。

如果有人可以帮助我解决这个问题,或者将我重定向到 Post 或 link 来回答我的问题,我将不胜感激。

此致, 卢查

这是整个用户窗体

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

Me.EB_Ende.SetFocus

Here 是关于 SetFocus 的更多信息。

其他可能有用的东西...您可以更改对象 "tabbed" 通过的默认顺序。 (即,在当前控件中按 Enter 或 Tab 键后哪个单元格应获得焦点:

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

您的代码存在一些问题(例如,未在错误处理程序之前退出,您是否希望在出现错误时使用 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

或者,您可以完全跳过 error-hander:

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

工作完美

Private Sub txtSalary_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

如果不是 IsNumeric(txtSalary) 那么 MsgBox "请只输入数字!", vbRetryCancel 取消 = 真 txt薪资=“” 结束如果

If IsNumeric(txtSalary) 那么
txtSalary = Format(txtSalary, "$#,##0.00") 万一 结束子