AccessVBAでとあるテキストボックスにSetFocusしてもSetFocusが効かない(カーソルが当たらない)・・・
少し悩みましたので、この現象の原因と対処法・解決策をご紹介します!
クリックできる目次
Accessの設定値を確認
「ファイル」→「オプション」→「クライアントの設定」の中にある「Enterキー入力後の動作」の設定値を確認します。
設定値は次の3つですね
- 移動しない
- 次のフィールド
- 次のレコード
この中の「次のフィールド」
これは例えば次のようなことがしたい場合にチェックをつけます。
- テキストボックスAにデータを入力しEnterキーを押下
- 自動的にテキストボックス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が効かない(次のフィールド、例えばボタン等にフォーカスがあたってしまう)
たしかに「移動しない」に設定を変えることでこの現象は回避できますが、パソコンごとの設定に依存したくないですよね。
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使い方・便利技・トラブル対処まとめはこちら↓
2 件のコメント
長い間の悩みが解決できました。。。基本を勉強させて頂きました。時間のある限記りサーフさせていただきます。有り難うございます。
ご連絡ありがとうございます。Accessのこの機能は、少しわかりづらい仕様ですよね、、、私もまだまだ勉強中です。