goo blog サービス終了のお知らせ 

風のフリーランスプログラマ

あるフリーランスプログラマの独り言

Access探検隊 入力後にフォーカスを動かさない方法

2011年10月16日 15時10分54秒 | プログラミング
Accessの入力画面で、あるテキストボックスの入力後にフォーカスを動かしたくない場合がある。

今回は簡易見積り画面でそういうケースがあった。
見積りの内訳をいくつか入力して単価が計算される。
最後に個数を入力して金額が出る。
ここで、個数を次々とお試し計算させたいということで、個数の入力後はそのまま同じテキストボックスにフォーカスがあって欲しい。
しかし、普通にタブ移動したいし、他のテキストボックスは入力後に次のテキストボックスに移動したい。

さて、どうするか。

最初は個数のテキストボックスの更新後処理で、自分にフォーカスを移動するコードを書いてみた。

--------
Private Sub TextBox1_AfterUpdate()
  TextBoxダミー.SetFocus
  TextBox1.SetFocus
End Sub
--------

TextBoxダミー.SetFocus は、一度他のコントロールにフォーカスを移さないとうまくいかなかったので苦肉の策である。

ところが、これでフォーカスは動かなくなったが、カーソルが先頭にきて文字列が選択されない。
選択されないと、新しい個数を入力するのに前のデータを消さなくてはならず不便である。
そこで、SelStartプロパティ&SelLengthプロパティでなんとかならないかといろいろやってみたが、どうやら更新後処理にSetFocusを書いているために最後には無効になってしまう。
やっぱり、SetFocusを使ったあたりで無理があったのだ。

で、いろいろ調べているうちに、Accessのオプションに「Enterキー入力後の動作」というのがあることに気付いた。
これを個数のテキストボックスにだけ適用できないものか。

できました。

--------
Private Sub TextBox1_Enter()
  Application.SetOption "Move After Enter", 0
End Sub

Private Sub TextBox1_Exit(Cancel As Integer)
  Application.SetOption "Move After Enter", 1
End Sub
--------

テキストボックスのフォーカス取得時イベントでEnterキーで移動しないように設定し、フォーカス喪失時イベントで元に戻すようにしたのが上のコードである。
文字列も選択されたままだし、何よりコードが美しい。

Applicationオブジェクトの SetOptionメソッドで、VBAからAccessのオプションをコントロールできるんだ。
今まで使ったことないので知らなかった。
また一つ勉強になった。

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。