0

ユーザーフォームにテキストボックスがあります。フォーム上の唯一のテキストボックスです。このテキストボックスに加えて、3つのラベルと2つのボタンがあります。基本的に、ボタンの1つがクリックされた瞬間を除いて、すべてのシナリオでこのテキストボックスにフォーカスを維持したいのですが、その後、フォーカスをテキストボックスに戻したいと思います。どちらのボタンも「TakeFocusOnClick」と「TabStop」がFalseに設定されています。フォーカスをテキストボックスに設定する際に問題が発生したため、これら2つの設定を変更しました。

これらの設定を変更すると、テキストボックスのEnterキーは効果を発揮しなくなりました。テキストボックスの_AfterUpdateと_KeyPress用に作成されたイベントがありますが、発生しません。コードでわかるように、このテキストボックスにフォーカスを設定するために行をコメントアウトしました。現在、フォーカスをとることができる唯一のオブジェクトであるため、これらの線は(理論的には)必要ありません。他のオブジェクトにフォーカスを許可したとき、これらの線は効果がありませんでした(これらのSetFocus線にもかかわらず、フォーカスはボタンに切り替わりました)。

これがコードです。Enterキーがイベントをトリガーしないことを除いて、これは非常に単純です。誰もが理由を見ることができますか?ありがとう。

Private Sub btnDone_Click()
    Application.Calculation = xlCalculationAutomatic
    formMath.Hide

    'Clear statistics
    Range("attempts").Value = 0
    Range("correct").Value = 0
    Sheet5.Range("A2:W500").ClearContents

End Sub


Private Sub btnSubmit_Click()
    recordAnswer
    'formMath.txtAnswer.SetFocus
End Sub

Private Sub txtAnswer_AfterUpdate()
    recordAnswer
    'formMath.txtAnswer.SetFocus
End Sub

Private Sub txtAnswer_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = 13 Then
        recordAnswer
    End If
End Sub

Private Sub UserForm_Initialize()

    'Initialize manual calculation
    Application.Calculation = xlCalculationManual
    Application.Calculate

    'Initialize statistics
    Range("attempts").Value = 0
    Range("correct").Value = 0
    Sheet5.Range("A2:W500").ClearContents

    'Initialize first problem
    newProblem

End Sub

Sub recordAnswer()

    'Update statistics
    Dim attempts, correct As Integer
    attempts = Range("attempts").Value
    correct = Range("correct").Value

    Range("results").Offset(attempts, 0).Value = attempts + 1
    Range("results").Offset(attempts, 1).Value = lblTopNum.Caption
    Range("results").Offset(attempts, 2).Value = lblBotNum.Caption
    Range("results").Offset(attempts, 3).Value = lblBop.Caption
    Range("results").Offset(attempts, 4).Value = Range("Answer").Value
    Range("results").Offset(attempts, 5).Value = txtAnswer.Text

    If (Range("Answer").Value = txtAnswer.Text) Then
        Range("results").Offset(attempts, 6).Value = 1
    Else
        Range("results").Offset(attempts, 6).Value = 0
    End If

    'Update attempts and success
    Range("attempts").Value = attempts + 1
    Range("correct").Value = correct + 1

    newProblem

End Sub

Sub newProblem()

    Application.Calculate
    formMath.lblTopNum.Caption = Range("TopNum").Value
    formMath.lblBotNum.Caption = Range("BotNum").Value
    formMath.lblBop.Caption = Range("ProbType").Value
    formMath.txtAnswer.Value = ""
    'formMath.txtAnswer.SetFocus

End Sub
4

2 に答える 2

1

始めるには

デザインモードで、テキストボックスのTabIndexプロパティを0に設定するか、テキストボックスのフォーカスを設定することができます。UserForm_Initialize()

Private Sub UserForm_Initialize()
    TextBox1.SetFocus
End Sub

同様に、実行した操作の後で、を呼び出すだけTextBox1.SetFocusでテキストボックスに戻ります。

Option Explicit

Private Sub UserForm_Initialize()
    TextBox1.SetFocus
End Sub

Private Sub CommandButton1_Click()
    MsgBox "Hello from Button 1"
    TextBox1.SetFocus
End Sub

Private Sub CommandButton2_Click()
    MsgBox "Hello from Button 2"
    TextBox1.SetFocus
End Sub

これがあなたが望むものでないかどうか私に知らせてください?

于 2012-04-11T23:17:16.217 に答える
1

私はこれを達成する方法を見つけました。上記のコードでは、_KeyPressイベントと_AfterUpdateイベントを取り出して、次のように置き換えました。

Private Sub txtAnswer_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
        Case 13: recordAnswer
    End Select
End Sub

他の方法が機能しなかった理由はわかりませんが、これは機能します。

また、フォーカスを直接設定するだけではうまくいかなかった理由もわかりません。フォーカスが設定されていたのではないかと思いますが、その後、テキストボックスのフォーカスを変更する何かが起こっていました。ただの推測。

助けてくれてありがとう。それは有り難いです。

于 2012-04-12T06:39:31.383 に答える