質問: コマンドボタンのenterイベント後に、フォーカスを移動したい。 コマンドボタンのenterイベント後に、フォーカスを移動したい。 フォームに「textbox1」(tabindex=0)「textbox2」(tabindex=1)「commandbutton1」(tabindex=2)の3つのコントロールがある場合。 commandbutton1がクリックされた場合も、textbox2からcommandbutton1に、タブキーまたはエンターキーで、フォーカスが移った場合にも、同じ処理を行い、処理結果によってtextbox1やtextbox2にフォーカスを移したいと考えています。 以下のようなサンプルを作成しました。 private sub commandbutton1_enter() commandbutton1_click end sub private sub commandbutton1_click() msgbox ("ok") textbox2.setfocus end sub この場合、commandbutton1_enterのイベントが起こった場合、commandbutton1_click()のtextbox2.setfocusは効きません。 (正確には、commandbutton1_enterイベントが終わった時点で無効でしょうか。) enterイベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。 要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。 よろしくお願いいたします。
回答: no.1です。 > 結果、textbox2ではなく、textbox1にフォーカスが移動してしまいました。 windows xp home・excel2003/l2007のユーザーフォームにて、同じ動作に なることを確認しました。 確かに、bengalさんが質問文で記述されているように、enterイベントの 発生するタイミングが「フォーカス移動の直前」であるために、vbaでfocusを 設定した後に、enter/tabの入力が反映されてしまっているようです。 試行錯誤の末、一応、「textbox2のexitイベントを制御するための変数を モジュールレベルで宣言」することにより、textbox2にフォーカスを残すように できました・・・が、今度はコマンドボタンのクリックによる移動の場合に、 textbox2から抜けるのに2回enter/tab/clickが必要になってしまいました(汗) (accessと違い、excelのユーザーフォームでは、setfocusによる移動時には enterイベントが発生しないらしく、フラグが意図した通りに初期化されない) ともあれ、こちらで試したコードを以下に提示します: option explicit 'textbox2のexitイベントを制御する変数を宣言 '(=textbox2のexitイベントをキャンセルさせるためのフラグ) private bolt2hold as boolean private sub commandbutton1_enter() msgbox "ok" 'exitイベントのキャンセルフラグをオンにする bolt2hold = true textbox2.setfocus end sub private sub textbox2_exit(byval cancel as msforms.returnboolean) 'フラグがオンの場合はexitイベントをキャンセルしてフォーカスを保持する cancel = bolt2hold 'フラグを初期化(textbox2の編集後などにまでキャンセルされるのを回避) bolt2hold = false end sub commandbutton1で立てるフラグをtrue/falseではなく時刻の記録とし、 「textbox2のexitイベント発生時の時刻とほぼ同時ならキャンセル」と いうのも試してみましたが、tabキーを押しっぱなしにした場合などの動作が 結局制御できていない状態になるため、断念しました(汗) 以上、中途半端な回答で申し訳ありませんが、参考まで。 (通常通り、コマンドボタンのクリック/コマンドボタン上でのenterキー入力で 対応した方が、(特にexcelユーザーフォームでは)制御しやすそうです(汗))