2

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

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

此代码工作正常,如果文本框留空,则会弹出消息框。清除消息框后,如果我再次立即回车,消息框再次出现,提示焦点在文本框上。但是,如果我尝试输入一个字符(例如数字“1”),则文本框中不会出现任何内容。

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

4

3 回答 3

10

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

您不应该在用户输入表单时用消息打扰他们。最后做。

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

问题是,在您的代码中,您正在设置焦点,但随后会触发回车键。你不需要设置焦点,因为文本框已经有了焦点,你只需要取消回车键。

于 2012-06-06T00:52:38.007 回答
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

我希望这对以后遇到此问题的其他人有所帮助。

于 2013-08-28T22:32:29.603 回答
-2

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

无论如何,如果是这种情况,您总是可以在 i=0 时运行它,执行(或当为真时)。

抱歉,第一次在这里发帖,希望有意义。

于 2014-07-25T12:40:48.530 回答