Excel VBA - 手动调用 Userform 上的 TextBox 退出事件?
Excel VBA - Calling TextBox Exit Event on Userform manually?
我正在构建一个用户表单,其中有两个用于输入日期的文本框。输入日期后,我将在 Exit
事件触发时验证它们。如果验证表明用户数据不是所需要的,则会通知用户,清除文本框,并将焦点return返回到文本框。
如果用户使用鼠标 select 在框外,而不是 Tab,就会出现问题。如果使用 Tab,它会按预期完美触发,并且字段被清除并且焦点被 returned。如果使用鼠标,则不会触发。根据 this article,这是预期的行为(它用于 Access,但我没有看到 Excel 的类似相关 MSDN 文章。)
所以我尝试了 AfterUpdate
事件。但是,SetFocus
在 AfterUpdate
事件中不起作用,我假设是因为对 this question 的响应中概述的事件链。因此,我无法在文本框触发后 return 将焦点返回到文本框。该线程有一个建议作为对另一个控件 SetFocus
的替代答案,并作为解决方法返回,但这对我不起作用,所以我认为这可能是特定于 Access 的解决方法。
我考虑过的最后一个选择是让 AfterUpdate
事件只调用 Exit
事件,但是 Exit
事件有一个必需的参数 (ByVal Cancel As MSForms.ReturnBoolean)
,它是您如何取消退出并 return 用户到文本框。因此,没有一个你可以传递给它的值不会抛出我能找到的错误(我发现最接近的是传递 Nothing
但在尝试将其设置为 True
稍后取消退出。)
有没有办法实现我在这里寻找的东西,或者我应该坚持 AfterUpdate
而忽略我正在努力实现的 SetFocus
?
Exit
事件适用于所有为窗体上的另一个控件触发 Enter
的鼠标点击。但是当您直接单击窗体而不是任何其他控件时,什么也没有发生。
在这里,在退出并移动到用户表单之前,使用 ActiveControl
属性 确定您所在的最后一个控件。
示例代码,根据您的要求修改。
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call doValidation(Me.TextBox1.Text) '/ Validation Routine when user leaves TextBox
End Sub
Private Sub UserForm_Click()
'/ If user clicked on the user form instead of ay other control
If Me.ActiveControl.Name = Me.TextBox1.Name Then
Call doValidation(Me.TextBox1.Text) '/ Validation Routine when user leaves TextBox
End If
End Sub
Private Sub doValidation(strText)
MsgBox strText
End Sub
建议:对于日期输入,使用DateTimePicker
而不是TextBox
,以后会省去很多麻烦。
在 VBA 中,您可以使用 Call Subname 这个词来调用任何已定义的子函数或函数:
例如调用 Textbox1_exit(参数)
然而,从有些令人困惑的描述来看,我认为您的问题在于您将自己限制在几个事件函数中。我建议探索所有事件函数,看看哪一个最适合你的事件触发。
以下是 Access VBA 中的事件及其顺序列表:
https://msdn.microsoft.com/en-us/library/office/jj249049.aspx
以及表单事件的顺序:
我认为对于您的应用程序,根据您为某些组件提供的 lost_focus 或 got_focus 的描述可能会有用。
此外,您可以手动将焦点设置到几乎任何内置方法的组件:compName.SetFocus()
我知道几个月前有人回答了这个问题,但给出了一个替代解决方案。对于发现此问题的任何人。
要验证 Excel 文本框数据,请使用 BeforeUpdate 事件,它在 AfterUpdate 事件之前触发,并且能够防止控件失去焦点。
根据您的要求修改示例代码
记住Cancel = True
停止对控件的控件更新并保持焦点。
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = doValidation(Textbox1.Text) 'Validation Route
End Sub
Private Function doValidation(strText) as Boolean
'Do Validation
if Valid then
doValidation = False
Else
msgBox "Not Valid"
doValidation = True
End if
End Sub
在我看来,这是验证 Excel 用户表单文本框
上的输入的最简单方法
我目前找不到正确的 MSDN 文章,Google 想要 return 的只是访问结果。
我正在构建一个用户表单,其中有两个用于输入日期的文本框。输入日期后,我将在 Exit
事件触发时验证它们。如果验证表明用户数据不是所需要的,则会通知用户,清除文本框,并将焦点return返回到文本框。
如果用户使用鼠标 select 在框外,而不是 Tab,就会出现问题。如果使用 Tab,它会按预期完美触发,并且字段被清除并且焦点被 returned。如果使用鼠标,则不会触发。根据 this article,这是预期的行为(它用于 Access,但我没有看到 Excel 的类似相关 MSDN 文章。)
所以我尝试了 AfterUpdate
事件。但是,SetFocus
在 AfterUpdate
事件中不起作用,我假设是因为对 this question 的响应中概述的事件链。因此,我无法在文本框触发后 return 将焦点返回到文本框。该线程有一个建议作为对另一个控件 SetFocus
的替代答案,并作为解决方法返回,但这对我不起作用,所以我认为这可能是特定于 Access 的解决方法。
我考虑过的最后一个选择是让 AfterUpdate
事件只调用 Exit
事件,但是 Exit
事件有一个必需的参数 (ByVal Cancel As MSForms.ReturnBoolean)
,它是您如何取消退出并 return 用户到文本框。因此,没有一个你可以传递给它的值不会抛出我能找到的错误(我发现最接近的是传递 Nothing
但在尝试将其设置为 True
稍后取消退出。)
有没有办法实现我在这里寻找的东西,或者我应该坚持 AfterUpdate
而忽略我正在努力实现的 SetFocus
?
Exit
事件适用于所有为窗体上的另一个控件触发 Enter
的鼠标点击。但是当您直接单击窗体而不是任何其他控件时,什么也没有发生。
在这里,在退出并移动到用户表单之前,使用 ActiveControl
属性 确定您所在的最后一个控件。
示例代码,根据您的要求修改。
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call doValidation(Me.TextBox1.Text) '/ Validation Routine when user leaves TextBox
End Sub
Private Sub UserForm_Click()
'/ If user clicked on the user form instead of ay other control
If Me.ActiveControl.Name = Me.TextBox1.Name Then
Call doValidation(Me.TextBox1.Text) '/ Validation Routine when user leaves TextBox
End If
End Sub
Private Sub doValidation(strText)
MsgBox strText
End Sub
建议:对于日期输入,使用DateTimePicker
而不是TextBox
,以后会省去很多麻烦。
在 VBA 中,您可以使用 Call Subname 这个词来调用任何已定义的子函数或函数: 例如调用 Textbox1_exit(参数)
然而,从有些令人困惑的描述来看,我认为您的问题在于您将自己限制在几个事件函数中。我建议探索所有事件函数,看看哪一个最适合你的事件触发。 以下是 Access VBA 中的事件及其顺序列表: https://msdn.microsoft.com/en-us/library/office/jj249049.aspx
以及表单事件的顺序:
我认为对于您的应用程序,根据您为某些组件提供的 lost_focus 或 got_focus 的描述可能会有用。 此外,您可以手动将焦点设置到几乎任何内置方法的组件:compName.SetFocus()
我知道几个月前有人回答了这个问题,但给出了一个替代解决方案。对于发现此问题的任何人。
要验证 Excel 文本框数据,请使用 BeforeUpdate 事件,它在 AfterUpdate 事件之前触发,并且能够防止控件失去焦点。
根据您的要求修改示例代码
记住Cancel = True
停止对控件的控件更新并保持焦点。
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = doValidation(Textbox1.Text) 'Validation Route
End Sub
Private Function doValidation(strText) as Boolean
'Do Validation
if Valid then
doValidation = False
Else
msgBox "Not Valid"
doValidation = True
End if
End Sub
在我看来,这是验证 Excel 用户表单文本框
上的输入的最简单方法我目前找不到正确的 MSDN 文章,Google 想要 return 的只是访问结果。