如何根据需要将焦点放在文本框中

时间:2012-06-06 00:14:04

标签: vba excel-vba textbox setfocus excel

我在userform上有一个文本框。如果用户无法在此文本框中输入任何内容,我需要捕获该内容以强制输入。我可以很容易地做到这一点,但在通知用户他们需要输入后,我希望焦点返回到文本框。现在,它没有这样做。这是我的代码:

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'),文本框中就不会出现任何内容。

有人可以建议我如何以允许用户输入数据的方式重新关注此文本框?谢谢!

3 个答案:

答案 0 :(得分:8)

为什么不使用“确定”按钮来完成操作?

当用户在表单中输入内容时,您不应该使用消息来打扰用户。最后做。

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

问题在于,在您的代码中,您正在设置焦点,但输入键随后会触发。您无需设置焦点,因为文本框已经具有取消输入键所需的焦点。

答案 1 :(得分:0)

其他答案看起来很复杂。我有类似的问题,真的想要一个文本警告。如果输入不正确,我在表单上制作一个看不见的标签似乎更容易。我还将标签的背景设为红色,以便用户注意到有问题。这样做可以使光标保持可见,并且就在它们离开的位置。

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

我希望这可以帮助后来遇到此问题的其他人。

答案 2 :(得分:-2)

看看上面的代码,我假设i计数器是为了让它继续下去?抱歉有点生疏,自从我完成代码以来已经过了几年。

无论如何,如果是这样的话,你总是可以在i = 0的情况下运行它,那么(或者是真的)。​​

对不起,第一次在这里发帖,希望有道理。