2012-04-11 2 views
0

У меня есть текстовое поле на пользовательской форме. Это единственное текстовое поле в форме. Помимо этого текстового поля есть три ярлыка и две кнопки. В принципе, я хочу, чтобы фокус оставался в этом текстовом поле во всех сценариях, кроме момента, когда была нажата одна из кнопок, но затем я хочу, чтобы фокус вернулся в текстовое поле. Обе кнопки имеют значение «TakeFocusOnClick» и «TabStop» равны False. У меня возникли проблемы с установкой фокуса на текстовое поле, поэтому я изменил эти два параметра.Поведение текстового поля Excel Userform

Как только я изменил эти настройки, клавиша 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 
+0

Извините. Не знал, что я должен был принимать комментарии. Я ничего не игнорировал. Но я вернулся и принял некоторые из ранних сообщений. Спасибо за головы. С этого момента я буду следить за этим. – Alex

+0

Нет, вы не должны принимать комментарии, но следите за ними, если они имеют смысл :) Глядя на ваш вопрос сейчас :) –

ответ

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 

Не знаю, почему другие методы не работают, но это делает.

Также не уверен, почему просто настройка фокуса напрямую не работала. Я подозреваю, что фокус был установлен, но потом произошло что-то еще, что изменило фокус текстового поля. Просто догадка.

Спасибо за помощь. Я ценю это.

1

Для начала

Вы можете в режиме конструктора, установите TabIndex свойство Textbox 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 

Сообщите мне, если это не то, что вы хотите?

+0

Спасибо, но это то, что я пытаюсь сказать. Я начал с этого подхода. Вы можете видеть, что у меня есть несколько ссылок на formMath.txtAnswer.SetFocus как на последнюю строку в нескольких разных местах. Когда я позволил кнопкам сфокусироваться, это не сработало. Я бы вышел из этих подпрограмм с фокусом, установленным на кнопки, хотя последняя строка была специально предназначена для установки фокуса на текстовое поле. Я понятия не имею, почему это происходит. Итак, я сменил кнопки, чтобы они не могли принять фокус, который решил мою проблему фокусировки, но тогда события не срабатывали. Очень смущенный. – Alex

+0

Можете ли вы загрузить образец файла? –

Смежные вопросы