web-dev-qa-db-fra.com

Pourquoi mon .setfocus est-il ignoré?

J'ai un formulaire d'accès avec une zone de texte conçue pour permettre de taper plusieurs fois un numéro, d'appuyer sur entrée et de laisser un script effectuer des tâches. Pour la vitesse, le champ doit garder le focus après la fin de DoStuff().

Cependant, bien que je sois sûr que DoStuff() soit exécuté, le focus se place toujours sur le champ suivant dans l'ordre de tabulation. C'est comme si Me.MyFld.SetFocus était ignoré.

Comment puis-je rester concentré sur ce champ une fois que DoStuff() est terminé?

Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer)  
     If KeyCode = vbKeyReturn Then  
         DoStuff  
         Me.MyFld.SetFocus  
     End If
End Sub
8
PowerUser

Si vous regardez l'ordre des événements d'une touche qui changerait le focus , vous verrez qu'il suit toujours ce modèle:

KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus

Vous pouvez redéfinir la mise au point n’importe où et conserver le même schéma. Nous devons donc lui dire d'arrêter de suivre le modèle. Remplacez votre Me.MyFld.SetFocus par DoCmd.CancelEvent et cela devrait résoudre votre problème. En gros, cela vous éloigne du modèle ci-dessus, de sorte que les événements Exit et LostFocus ne se déclenchent jamais ...

14
techturtle

Une solution de contournement consiste à déplacer le focus sur un autre contrôle puis sur le premier contrôle. Comme ça:

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
5

Une autre solution au problème que j'utilise dans Excel.

Laissé existe UserForm1 avec les contrôles TextBox1 et CommandButton1.

Code dans le module de formulaire:

    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

Et code dans le module standard:

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. cliquez sur access options
  2. sélectionnez Advanced
  3. sélectionnez Don't move parmi Move after enter
  4. cliquez sur ok

Cela fonctionnera à 100%

1
user10048738

Essayez de supprimer toute la ligne pour variable_name.SetFocus et ajoutez simplement: Cancel = True

Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer)  
     If KeyCode = vbKeyReturn Then  
         DoStuff  
         Cancel = True  
     End If
End Sub
0
Steven McCaffrey