Ich habe ein Access-Formular mit einem Textfeld, in das ich eine Zahl wiederholt eingeben, die Eingabetaste drücken und ein Skript ausführen lassen soll. Aus Gründen der Geschwindigkeit sollte das Feld den Fokus behalten, nachdem DoStuff()
ausgeführt wurde.
Obwohl ich sicher bin, dass DoStuff()
ausgeführt wird, wechselt der Fokus immer zum nächsten Feld in der Aktivierreihenfolge. Es ist, als würde Me.MyFld.SetFocus
ignoriert.
Wie halte ich den Fokus auf dieses Feld, nachdem DoStuff()
abgeschlossen ist?
Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
DoStuff
Me.MyFld.SetFocus
End If
End Sub
Wenn Sie die Reihenfolge der Ereignisse für einen Tastendruck betrachten, der den Fokus ändern würde , können Sie sehen, dass es immer diesem Muster folgt:
KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus
Sie können den Fokus an einer beliebigen Stelle dort neu einstellen, und er folgt weiterhin dem Muster. Wir müssen es also sagen, um dem Muster zu folgen. Ersetzen Sie Ihren Me.MyFld.SetFocus
durch DoCmd.CancelEvent
und es sollte Ihr Problem beheben. Im Grunde werden Sie dadurch einfach aus dem obigen Muster herausgeschleudert, sodass die Ereignisse Exit
und LostFocus
niemals ausgelöst werden.
Eine Problemumgehung versetzt den Fokus zu einem anderen Steuerelement und dann zurück zum ersten Steuerelement. So was:
Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
DoStuff
Me.anotherControl.SetFocus
Me.MyFld.SetFocus
End If
End Sub
Eine andere Lösung für das Problem, das ich in Excel verwende.
Es sei UserForm1 mit den Steuerelementen TextBox1 und CommandButton1 vorhanden.
Code im Formularmodul:
Option Explicit
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyReturn Then
'Call DoStuff
Application.OnTime Now, "'Control_SetFocus """ & Me.Name & """, """ & Me.ActiveControl.Name & """ '"
' The concatenation returns a string: 'Control_SetFocus "UserForm1", "TextBox1"'
End If
End Sub
Und Code im Standardmodul:
Option Explicit
Sub Control_SetFocus(FormName As String, ControlName As String)
Dim oUserForm As Object
Set oUserForm = GetFormByName(FormName)
If Not oUserForm Is Nothing Then
oUserForm.Controls(ControlName).SetFocus
End If
End Sub
Function GetFormByName(FormName As String) As Object
Dim oUserForm As Object
On Error GoTo ErrHandle
For Each oUserForm In VBA.UserForms
If StrComp(oUserForm.Name, FormName, vbTextCompare) = 0 Then
Exit For
End If
Next oUserForm
If oUserForm Is Nothing Then
Set oUserForm = UserForms.Add(FormName)
End If
Set GetFormByName = oUserForm
Exit Function
ErrHandle:
Select Case Err.Number
Case 424:
MsgBox "Userform " & FormName & " not exists.", vbExclamation, "Get userform by name"
Case Else:
MsgBox Err.Number & ": " & Err.Description, vbCritical, "Get userform by name"
End Select
End Function
Artik
access options
Advanced
auswählenDon't move
aus Move after enter
auswählenok
Es wird 100% funktionieren
Entfernen Sie die gesamte Zeile für variable_name.SetFocus
und fügen Sie einfach Folgendes hinzu: Cancel = True
Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
DoStuff
Cancel = True
End If
End Sub