2012-04-11 15 views
0

Ich habe ein Textfeld in einem Benutzerformular. Es ist die einzige Textbox auf dem Formular. Neben diesem Textfeld gibt es drei Beschriftungen und zwei Schaltflächen. Grundsätzlich möchte ich, dass der Fokus in allen Szenarios auf diesem Textfeld bleibt, außer in dem Moment, in dem einer der Knöpfe angeklickt wird, aber dann möchte ich, dass der Fokus direkt zum Textfeld zurückkehrt. Beide Schaltflächen haben "TakeFocusOnClick" und "TabStop" auf False festgelegt. Ich hatte Probleme, den Fokus auf die Textbox zu setzen, weshalb ich diese beiden Einstellungen geändert habe.Excel Benutzerformular Textfeld Verhalten

Sobald ich diese Einstellungen geändert habe, hat die Eingabetaste in der Textbox keinen Effekt mehr. Ich habe Ereignisse für _AfterUpdate und _KeyPress für das Textfeld geschrieben, aber sie werden nicht ausgelöst. Wie Sie im Code sehen können, habe ich die Zeilen auskommentiert, um den Fokus auf dieses Textfeld zu setzen. Da es jetzt das einzige Objekt ist, das fokussiert werden kann, werden diese Linien (theoretisch) nicht benötigt. Wenn ich den anderen Objekten erlaubte, den Fokus zu bekommen, hatten diese Linien keinen Effekt (der Fokus war trotz dieser SetFocus-Linien auf die Knöpfe zu wechseln).

Hier ist der Code. Es ist sehr einfach, außer dass die Eingabetaste das Ereignis nicht auslöst. Kann jemand sehen warum? Vielen Dank.

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

Entschuldigung. Wusste nicht, dass ich Kommentare akzeptieren sollte. Ich habe nichts ignoriert. Aber ich ging zurück und akzeptierte einige von früheren Posts. Danke für die Köpfe hoch. Ich werde das von jetzt an im Auge behalten. – Alex

+0

Nein, du solltest keine Kommentare akzeptieren, aber folge ihnen, wenn sie Sinn machen :) Schau dir deine Frage jetzt an :) –

Antwort

1

Ich habe einen Weg gefunden, dies zu erreichen. In dem Code hat oben ich die _KeyPress und _AfterUpdate Ereignisse aus und ersetzte sie durch:

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

nicht sicher, warum die anderen Methoden nicht funktioniert hat, aber dies tut.

Auch nicht sicher, warum einfach den Fokus direkt eingestellt hat nicht funktioniert. Ich vermute, dass der Fokus gesetzt wurde, aber dann passierte etwas anderes, das den Fokus von der Textbox abwandelte. Nur eine Vermutung.

Danke für die Hilfe. Ich schätze es.

1

Um

Sie können beginnen, entweder im Entwurfsmodus, die TabIndex Eigenschaft der Textbox auf 0 gesetzt oder Sie den Fokus auf das Textfeld in der

Private Sub UserForm_Initialize() 
    TextBox1.SetFocus 
End Sub 

UserForm_Initialize() einstellen Auf ähnliche Weise rufen Sie nach jedem von Ihnen durchgeführten Vorgang einfach die TextBox1.SetFocus auf, um zur Textbox zurückzukehren.

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 

Lassen Sie mich wissen, wenn dies nicht das ist, was Sie wollen?

+0

Danke, aber das ist es was ich versuche zu sagen. Ich begann mit dieser Herangehensweise. Sie können sehen, dass ich einige Verweise auf formMath.txtAnswer.SetFocus als letzte Zeile an einigen verschiedenen Stellen habe. Als ich den Tasten erlaubte, zu fokussieren, funktionierte das nicht. Ich würde aus diesen Unterprogrammen mit dem Fokus, der auf die Schaltflächen festgelegt wurde, hervorgehen, obwohl die letzte Zeile speziell den Fokus auf das Textfeld festlegen sollte. Ich habe keine Ahnung, warum das passiert ist. Also änderte ich die Tasten, so dass sie den Fokus nicht akzeptieren konnten, was mein Fokusproblem löste, aber dann wurden die Ereignisse nicht ausgelöst. Sehr verwirrt. – Alex

+0

Können Sie eine Beispieldatei hochladen? –