AccessVBAのSetFocusが効かない原因と対処方法

AccessVBAでとあるテキストボックスにSetFocusしてもSetFocusが効かない(カーソルが当たらない)・・・

少し悩みましたので、この現象の原因と対処法・解決策をご紹介します!

Accessの設定値を確認

「ファイル」→「オプション」→「クライアントの設定」の中にある「Enterキー入力後の動作」の設定値を確認します。

設定値は次の3つですね

  • 移動しない
  • 次のフィールド
  • 次のレコード

この中の「次のフィールド」

これは例えば次のようなことがしたい場合にチェックをつけます。

  1. テキストボックスAにデータを入力しEnterキーを押下
  2. 自動的にテキストボックスBに移動したい

この「次のフィールド」にチェックが付いている状態で、かつVBAでKeyDownイベントにSetFocus処理を記述している場合は、少し注意が必要です。

VBAでSetFocusが効かない原因

次のようにKeyDownイベントプロシージャ内で、フォーカスをコントロール(テキストボックスA入力後、テキストボックスBにSetFocus)しているとします。

 'テキストボックスAのKeyDownイベント処理の中
 If KeyCode = vbKeyReturn Then
    Me.テキストボックスB.SetFocus
 End If

このとき、「Enterキー入力後の動作」の設定値が「次のフィールド」に設定されている状態で、次のコードを実行するとどうなると思いますか?

答えは、テキストボックスBの次のフィールドにフォーカスがあたります。

これはテキストボックスBにフォーカスがあたった後に、Enterキー入力後の動作(次のフィールド)が効いているためですね。

Accessのこの設定値は、パソコンごとに持っています。

つまり、次のような問題が発生する可能性があります。

  • パソコンAで実行すると、SetFocusが効く
  • パソコンBで実行したら、SetFocusが効かない(次のフィールド、例えばボタン等にフォーカスがあたってしまう)

それならパソコンBの設定値をかえたら?

たしかに「移動しない」に設定を変えることでこの現象は回避できますが、パソコンごとの設定に依存したくないですよね。

VBAでSetFocusが効かないときの対処法

次のように、「KeyCode = 0」を追加します。

 'テキストボックスAのKeyDownイベント処理の中
 If KeyCode = vbKeyReturn Then
    Me.テキストボックスB.SetFocus
    
    '↓↓追加
    KeyCode = 0
 End If

この例では、KeyCode=0でEnterキーの入力をキャンセルしています。

こうすることで「次のフィールド」設定の有無に関係なく、SetFocusでフォーカスをコントロール可能です。

まとめ

今回はAccessVBAでとあるテキストボックスにSetFocusしてもSetFocusが効かない(カーソルが当たらない)場合の原因と対処法・解決策についてご紹介しました!

Enterキー入力後の動作の設定を「次のフィールド」に設定している場合は注意してください。

よくわからなければ、SetFocusのあとに「KeyCode = 0」を追加してみてくださいね。

Access使い方・便利技・トラブル対処まとめはこちら↓

今回はAccessのクエリ・フォーム・レポート、VBAの使い方や便利技とトラブル対処法まとめです。よく使うものだけを厳選して...

シェアする

  • このエントリーをはてなブックマークに追加

フォローする