Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何根据需要将焦点放在文本框中_Vba_Excel_Textbox_Setfocus - Fatal编程技术网

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”。很多人都不希望用回车键来回答另一个问题,他们可能会想知道该怎么办。不管怎样,你似乎有一点思维定势,所以如果你真的想要你所要求的行为,那么看看我编辑的答案