数字を繰り返し入力したり、Enterキーを押したり、スクリプトに処理を実行させたりできるテキストボックスを備えたAccessフォームがあります。速度を上げるために、フィールドはDoStuff()
が実行された後もフォーカスを維持する必要があります。
ただし、DoStuff()
が実行されていることは確かですが、フォーカスは常にタブ順の次のフィールドに移動します。 _Me.MyFld.SetFocus
_が無視されているようです。
DoStuff()
が実行された後、このフィールドにフォーカスを維持するにはどうすればよいですか?
_Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
DoStuff
Me.MyFld.SetFocus
End If
End Sub
_
フォーカスを変更するキー押下のイベントの順序 を見ると、常に次のパターンに従っていることがわかります。
KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus
そこのどこにでもフォーカスをリセットすることができ、それでもパターンに従い続けます。したがって、パターンに従うのをやめるように指示する必要があります。 Me.MyFld.SetFocus
をDoCmd.CancelEvent
に置き換えると、問題が解決するはずです。基本的に、これは上記のパターンからあなたを追い出すだけなので、Exit
およびLostFocus
イベントは決して発生しません...
回避策は、フォーカスを別のコントロールに移動してから、最初のコントロールに戻すことです。このような:
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
私がExcelで使用している問題の別の解決策。
TextBox1およびCommandButton1コントロールを持つUserForm1が存在するとします。
フォームモジュールのコード:
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
そして、標準モジュールのコード:
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
from Move after enter
ok
をクリックしますそれは100%動作します
variable_name.SetFocus
の行全体を削除して、次を追加してみてください:Cancel = True
Private Sub MyFld_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
DoStuff
Cancel = True
End If
End Sub