wake-up-neo.com

Warum wird mein .setfocus ignoriert?

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
8
PowerUser

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.

14
techturtle

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

1
Artik
  1. klicken Sie auf access options
  2. Advanced auswählen
  3. Don't move aus Move after enter auswählen
  4. klicken Sie auf ok

Es wird 100% funktionieren

1
user10048738

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
0