webdevqa.jp.net

.setfocusが無視されるのはなぜですか?

数字を繰り返し入力したり、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
_
8
PowerUser

フォーカスを変更するキー押下のイベントの順序 を見ると、常に次のパターンに従っていることがわかります。

KeyDown → BeforeUpdate → AfterUpdate → Exit → LostFocus

そこのどこにでもフォーカスをリセットすることができ、それでもパターンに従い続けます。したがって、パターンに従うのをやめるように指示する必要があります。 Me.MyFld.SetFocusDoCmd.CancelEventに置き換えると、問題が解決するはずです。基本的に、これは上記のパターンからあなたを追い出すだけなので、ExitおよびLostFocusイベントは決して発生しません...

14
techturtle

回避策は、フォーカスを別のコントロールに移動してから、最初のコントロールに戻すことです。このような:

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

1
Artik
  1. クリック access options
  2. Advancedを選択します
  3. 選択する Don't move from Move after enter
  4. okをクリックします

それは100%動作します

1
user10048738

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
0