我希望这不是那么愚蠢,但我真的找不到一个适合我的帖子。 情况:我希望有人在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
答案 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后,哪个单元格应该聚焦: