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

このコードは、テキスト ボックスが空白の場合にメッセージ ボックスがポップアップするという点で正常に機能します。メッセージ ボックスをクリアした後、すぐにもう一度 Enter キーを押すと、メッセージ ボックスが再び表示され、フォーカスがテキスト ボックスにあることが示されます。ただし、文字 (たとえば数字の「1」など) を入力しようとすると、テキスト ボックスに何も表示されません。

ユーザーがデータを入力できるように、このテキストボックスにフォーカスを戻す方法を誰か提案できますか? ありがとうございました!

4

3 に答える 3

10

アクションを完了するために「OK」ボタンを使用しないのはなぜですか?

ユーザーがフォームに入力している間、メッセージで迷惑をかけるべきではありません。最後にそれをしてください。

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 キーをキャンセルするだけで済みます。

于 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 に答える