2012-04-11 120 views
0

我在用戶窗體上有一個文本框。它是窗體上唯一的文本框。除了這個文本框外,還有三個標籤和兩個按鈕。基本上,我希望焦點在所有情況下都保留在此文本框中,除了其中一個按鈕被點擊的時刻之外,但我希望焦點回到文本框。這兩個按鈕都將「TakeFocusOnClick」和「TabStop」設置爲False。我在將焦點設置到文本框時遇到問題,這就是我更改這兩個設置的原因。Excel用戶窗體文本框行爲

一旦我改變了這些設置,文本框中的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 2012-04-11 22:39:00

+0

不,你不應該接受評論,但如果他們有道理,請遵循他們:)現在看你的問題:) – 2012-04-11 23:01:14

回答

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屬性設置爲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 2012-04-12 00:01:08

+0

你可以上傳示例文件嗎? – 2012-04-12 00:17:05

相關問題