解決済み

コマンドボタンのEnterイベント後に、フォーカスを移動したい。

  • 困ってます
  • 質問No.5046031
  • 閲覧数3440
  • ありがとう数6
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 62% (17/27)

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

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

よろしくお願いいたします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル14

ベストアンサー率 73% (1287/1744)

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ユーザーフォームでは)制御しやすそうです(汗))
お礼コメント
BENGAL

お礼率 62% (17/27)

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

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

ご提示いただいた内容だけでも、納得な事が多く参考になりました。
ありがとうございます!
投稿日時 - 2009-07-24 08:01:52
OKWAVE 20th Be MORE ありがとうをカタチに

その他の回答 (全1件)

  • 回答No.1
レベル14

ベストアンサー率 73% (1287/1744)

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

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

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

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


※ご質問のアプリケーションが不明ですが、こちらはAccess2003で動作確認
 しました。
お礼コメント
BENGAL

お礼率 62% (17/27)

ありがとうございます。

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

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

こちらの環境をお伝えするのを忘れておりました。
Windows Vista home premium
Excel2007
となります。
投稿日時 - 2009-06-16 14:04:23
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ