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
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 ...
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
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
access options
Advanced
Don't move
parmi Move after enter
ok
Cela fonctionnera à 100%
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