▶ Windows 11情報をお求めの方はこちらをクリック

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

2 min

 

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の使い方や便利技とトラブル対処法まとめです。 よく使うものだけを厳選してご紹介します。 Access全般の

 

SEパパ

SEパパ

外資系IT企業SE職で2児の父ちゃん!職業柄かリサーチ&問題解決が好き。

幅広いジャンルで「お悩み解決」記事を執筆中。月間最高24万PV。雑誌掲載。

読者様に役立つ情報提供を心がけています。

カテゴリー:

2 件のコメント

  1. 長い間の悩みが解決できました。。。基本を勉強させて頂きました。時間のある限記りサーフさせていただきます。有り難うございます。

    • ご連絡ありがとうございます。Accessのこの機能は、少しわかりづらい仕様ですよね、、、私もまだまだ勉強中です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA