プロが教えるわが家の防犯対策術!

コマンドボタンの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イベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。

要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。

よろしくお願いいたします。

教えて!goo グレード

A 回答 (2件)

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ユーザーフォームでは)制御しやすそうです(汗))
    • good
    • 0
この回答へのお礼

大変遅くなりまして申し訳ありません。

さらに、細かく調べて頂いてありがとうございます。

ご提示いただいた内容だけでも、納得な事が多く参考になりました。
ありがとうございます!

お礼日時:2009/07/24 08:01

「コマンドボタン上でのEnterキーの入力でコマンドボタンのClickイベントを」


ではなく、「コマンドボタンへの移動だけでコマンドボタンのClickイベントを」
というのは、かなり特殊な動きかと思います。

この特殊な動きをさせるのであれば、イベントへの動作の割り当ての仕方も、
特殊になることを覚悟した方がよさそうです。

・・・ということで、
  コマンドボタンのClickイベントには一切処理を置かず、
  Clickで行おうとしていた全ての処理を、Enterイベントに割り当て
とされてはいかがでしょうか。
(「コマンドボタンをマウスクリックした後、再クリック」したとしても、1回目の
 クリックで他のコントロールにフォーカス移動しているので、2回目のクリック
 でもコマンドボタンのEnterイベントはちゃんと発生してくれます)

Private Sub CommandButton1_Enter()
  MsgBox "Ok"
  textBox2.SetFocus
End Sub


※ご質問のアプリケーションが不明ですが、こちらはAccess2003で動作確認
 しました。
    • good
    • 0
この回答へのお礼

ありがとうございます。

さっそく試してみました。

結果、textBox2ではなく、textBox1にフォーカスが移動してしまいました。
もしかしたら、各コントロールの設定によっても挙動が変わってくるのでしょうか。

こちらの環境をお伝えするのを忘れておりました。
Windows Vista home premium
Excel2007
となります。

お礼日時:2009/06/16 14:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング