Vba 如何根据需要将焦点放在文本框中
我在用户表单上有一个文本框。如果用户未能在此文本框中输入任何内容,我需要捕获该文本框以强制输入。我可以很容易地做到这一点,但在通知用户他们需要输入内容后,我希望焦点返回到文本框。现在,它不这样做。这是我的密码:Vba 如何根据需要将焦点放在文本框中,vba,excel,textbox,setfocus,Vba,Excel,Textbox,Setfocus,我在用户表单上有一个文本框。如果用户未能在此文本框中输入任何内容,我需要捕获该文本框以强制输入。我可以很容易地做到这一点,但在通知用户他们需要输入内容后,我希望焦点返回到文本框。现在,它不这样做。这是我的密码: Private Sub txtAnswer_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case KeyCode Case 13: If Me.tx
Private Sub txtAnswer_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 13:
If Me.txtAnswer.Value = "" Then
temp = MsgBox("You need to enter an answer!", vbCritical + vbOKOnly, "No Answer Found!")
Me.txtAnswer.SetFocus
Else
recordAnswer
End If
End Select
End Sub
如果文本框为空,则会弹出消息框,这段代码工作正常。清除消息框后,如果我再次按enter键,消息框将重新出现,表明焦点在文本框上。但是,如果我尝试输入一个字符(例如数字“1”),文本框中不会显示任何内容
有人能建议我如何让焦点回到这个文本框上,让用户输入数据吗?谢谢大家! 为什么不使用“确定”按钮来完成操作 当用户在表单中键入信息时,您不应该用消息来打扰他们。最后再做
Private Sub OK_Click()
'// Validate form
If txtAnswer.Text = vbNullString Then
MsgBox "You need to enter an answer!", vbExclamation, "No Answer Found!"
txtAnswer.SetFocus
Exit Sub
End If
'// You have reached here so form is correct carry on
recordAnswer
End Sub
如果您真的想使用您要求的行为,请尝试以下方法:
Private Sub txtAnswer_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 13:
If Me.txtAnswer.Value = "" Then
temp = MsgBox("You need to enter an answer!", vbCritical + vbOKOnly, "No Answer Found!")
KeyCode = 0
Else
recordAnswer
End If
End Select
End Sub
问题是,在您的代码中,您正在设置焦点,但enter键随后会触发。你不需要设置焦点,因为文本框已经有了焦点,你只需要取消回车键 其他答案似乎非常复杂。我有一个类似的问题,我真的想要一个文本警告。对我来说,在表单上做一个不可见的标签似乎更容易,如果输入不正确就会显示出来。我还将标签的背景设置为红色,这样用户就会注意到有问题。这样做可以使光标保持可见,并位于其停止的位置
Public Function amount(ByRef cont As MSForms.TextBox) As Integer
'makes sure that a number is used
'could change to account for decimals if necessary
Dim i As Long
On Error Resume Next
i = 0
If (cont.Value = "") Then Exit Function
Do While i < 1000000
If (cont.Value = i) Then
UserForm1.Label257.Visible = False
Exit Function
End If
i = i + 1
Loop
UserForm1.Label257.Visible = True
amount = 1
End Function
Public Sub qty_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If amount(UserForm1.qty) = 1 Then
Cancel = True
End If
End Sub
Public Function amount(ByRef cont作为MSForms.TextBox)作为整数
'确保使用了一个数字
如有必要,可以改为小数
我想我会坚持多久
出错时继续下一步
i=0
如果为(cont.Value=“”),则退出函数
当我<1000000时做
如果(cont.Value=i),则
UserForm1.Label257.Visible=False
退出功能
如果结束
i=i+1
环
UserForm1.Label257.Visible=True
金额=1
端函数
更新前的公共子数量(ByVal Cancel作为MSForms.RETURN布尔值)
如果金额(UserForm1.qty)=1,则
取消=真
如果结束
端接头
我希望这对以后遇到这个问题的其他人有所帮助。看看上面的代码,我想我的计数器会让它继续运行吗?对不起,有点生疏了,我已经写代码好几年了 无论如何,如果是这样的话,您可以在i=0时运行它,然后执行(或者在为true时)
抱歉,第一次在这里发帖,希望有意义。我觉得效果不错。。。
recordAnswer
做什么?奇怪。recordAnswer做了很多事情,主要是将数据填充到工作表上。该子程序已经过全面的现场测试,所以我知道这不是问题所在。我想我还是保持原样吧。用户只需单击文本框即可获得焦点。谢谢这篇关于Contextures的文章可能会有所帮助:。她有一个类似的问题,在评论中得到了解决。+1好主意。您可能想在txtAnswer.SetFocus
Whoops之后添加一个Exit Sub
,谢谢@Sidd,如果您看到我犯了这样愚蠢的错误,请随意编辑我的帖子。不。这是一个孩子们的数学课程。这个想法是,学生正在循环学习基本的数学问题。表单上有一个文本框,他们在其中输入问题的答案。(例如,2+2,然后输入“4”)。输入答案后,他们点击“回车”。然后告诉他们答案是否正确,但表格不会消失。一个新问题简单地向他们提出。他们只有在回答完问题并希望看到结果时才点击“确定”按钮。@Randy:如果您同意,我们可以查看您的exel文件吗?那么您需要“下一个问题”或“标记问题”按钮(上面有代码)以及“确定”按钮。实际上,“ok”按钮可能应该标记为“Finished”。很多人都不希望用回车键来回答另一个问题,他们可能会想知道该怎么办。不管怎样,你似乎有一点思维定势,所以如果你真的想要你所要求的行为,那么看看我编辑的答案