我在userform上有一个文本框。它是表单上唯一的文本框。除此文本框外,还有三个标签和两个按钮。基本上,我希望焦点在所有场景下都保留在这个文本框中,除了点击其中一个按钮的那一刻,但我希望焦点能够直接回到文本框。两个按钮都将“TakeFocusOnClick”和“TabStop”设置为False。将焦点设置到文本框时出现问题,这就是我更改这两个设置的原因。
一旦我更改了这些设置,文本框中的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 :(得分: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
如果这不是您想要的,请告诉我?
答案 1 :(得分: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
不确定为什么其他方法不起作用,但确实如此。
也不确定为什么直接设置焦点不起作用。我怀疑焦点是在设置,但随后发生了其他事情,这改变了文本框的焦点。只是一个猜测。
感谢您的帮助。我很感激。