CommandButtonのEnterイベント後にフォーカスを移動する方法

このQ&Aのポイント
  • コマンドボタンのEnterイベント後に、フォーカスを移動する方法についての質問です。
  • コマンドボタンのEnterイベントによってフォーカスが移動した後、同じ処理を実行するための方法を知りたいです。
  • タブキーやエンターキーでコマンドボタンにフォーカスしても、クリックしたのと同じ処理を行い、指定の位置にフォーカスを移動する方法について教えてください。
回答を見る
  • ベストアンサー

コマンドボタンの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イベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。 要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。 よろしくお願いいたします。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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ユーザーフォームでは)制御しやすそうです(汗))

BENGAL
質問者

お礼

大変遅くなりまして申し訳ありません。 さらに、細かく調べて頂いてありがとうございます。 ご提示いただいた内容だけでも、納得な事が多く参考になりました。 ありがとうございます!

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

「コマンドボタン上でのEnterキーの入力でコマンドボタンのClickイベントを」 ではなく、「コマンドボタンへの移動だけでコマンドボタンのClickイベントを」 というのは、かなり特殊な動きかと思います。 この特殊な動きをさせるのであれば、イベントへの動作の割り当ての仕方も、 特殊になることを覚悟した方がよさそうです。 ・・・ということで、   コマンドボタンのClickイベントには一切処理を置かず、   Clickで行おうとしていた全ての処理を、Enterイベントに割り当て とされてはいかがでしょうか。 (「コマンドボタンをマウスクリックした後、再クリック」したとしても、1回目の  クリックで他のコントロールにフォーカス移動しているので、2回目のクリック  でもコマンドボタンのEnterイベントはちゃんと発生してくれます) Private Sub CommandButton1_Enter()   MsgBox "Ok"   textBox2.SetFocus End Sub ※ご質問のアプリケーションが不明ですが、こちらはAccess2003で動作確認  しました。

BENGAL
質問者

お礼

ありがとうございます。 さっそく試してみました。 結果、textBox2ではなく、textBox1にフォーカスが移動してしまいました。 もしかしたら、各コントロールの設定によっても挙動が変わってくるのでしょうか。 こちらの環境をお伝えするのを忘れておりました。 Windows Vista home premium Excel2007 となります。

関連するQ&A

  • VBAでのユーザーフォーム上でのタブオーダーの移動の方法

    やりたい事を以下に書きます。  ユーザーフォームで入力用のTEXTBOXがいくつかあり、TABINDEXが最初のTEXTBOXから順に入力していきます。  1つのTEXTBOXに入力完了後した場合、TABキーまたは、ENTERにより次のTEXTBOXにフォーカスが移動し、最後にコマンドボタンにを押すと入力が完了するというフォームを作っています。  ただし、最初のTEXTBOXに『99』を入力すると、途中のTEXTBOXへのフォーカスの移動はしないで最後のコマンドボタンにフォーカスが移動するようにしたいと考えています。 問題点を以下に書きます。  TEXTBOXの入力完了を現在、「AfterUpdate」イベントでつかまえて、TEXTBOXの値を取得し、その値が『99』だった場合、コマンドボタンにフォーカスを移動するようにコーディングしています。 こんな感じです。(かなり省略していますが、) Private Sub TextBox1_AfterUpdate() If TextBox1.Value = "99" Then CommandButton1.SetFocus Exit Sub End If End Sub この用にコーディングすると、TABINDEXが二つ後ろのTEXTBOXが入力待ち状態となってしまいます。 たとえば TEXTBOXが3つコマンドボタンが1つのフォームだと、 TEXTBOX1に『99』と入力し、上記のコーディングだと一度コマンドボタンにフォーカスが移動したあと、最後にTEXTBOX3にフォーカスが移動して入力待ち状態となる感じです。 色々試しましたが、解決方法が見つかりません。知っている方いましたら、教えてください。

  • Vba UserForm SetFocus

    ExcelのVbaでUserForm上に英単語のタイピング練習のソフトを作ろうとしていますが、うまくいきません。コントロールのイベントについての理解が不足しているのが分かりました。 ユーザフォーム上の複数のテキストボックス間のフォーカスの移動について教えて下さい。 UserForm1にテキストボックスを3つ、コマンドボタンを1つ配置しました。それぞれTextBox1、TextBox2、TextBox3、CommandButton1とします。 Private Sub CommandButton1_Click() TextBox3.SetFocus ・・・(1) End Sub Private Sub TextBox3_Enter() MsgBox "In TextBox3" TextBox2.SetFocus ・・・(2) End Sub 各TextBoxのTabStopプロパティは「True」、「TabIndex」は番号順になっています。 コマンドボタンのTabStopプロパティは「False」にしています。 フォームを表示し、コマンドボタンをクリックするとエラーが発生します。 (2)の実行の後(?)、(1)がエラー表示されます。 各イベントの発生のタイミング、連鎖、終了等の理解が不足していて、その理由がよく分かりません。どなたか教えていただけないでしょうか。よろしくお願いします。

  • フォーカスを移動させる?設定

    人から頂いたファイルを改良するように上司に指示され困っています。。。 頂いたファイルがどう言ったものかと言いますと・・・ 1.TextBox1へは6桁の数字を入力します。 2.CommandButton1を押すと6桁の数字と同じファイル名のイメージが表示されます。 ・・・と言う、操作は決して難しいものではないのですが、 このTextBox1やCommandButton1はフォームではなくてシート上にあります。 これが私にはこの上ない困りものなのです。 何をしたいかと言いますと・・・ ◎Enterを押すとTextBox1からCommandButton1へフォーカスが移動し、CommandButton1が押せる。 ・・・と言うようにしたいのです。 これがフォームで作られていれば「TabIndex」で設定できるのですが、フォームでないものをいじったことがなくて大変困っています。 (現時点ではEnterを押してもTabを押しても反応せず、マウスでCommandButton1を押さなくてはいけません。) よろしくお願いします。

  • ユーザーフォームのカーソル移動

    Excelのマクロでカーソル移動の事で教えて下さい。 フォームを表示するとTextBox1にカーソルが表示されます。 TextBox1で入力の判断しNG場合 カーソルを移動せずTextBox1に表示したいのですが CommandButton1に移動してしまいます。 (SetFocusでTextBox1を指定してNG) 【フォームの内容です】 TextBox1が1個 CommandButtonが2個存在します。 TextBox1のTabIndexは 0 CommandButton1のTabIndexは 1 CommandButton2のTabIndexは 2 【プログラムです】 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If TextBox1 = "" Then MsgBox "NG"     TextBox1.SetFocus End If End Sub 宜しくお願い致します。

  • EXCEL2000でTextBox1にフォーカスをあてたい

    いつもお世話になります。 OSはWin XP Home EXCEL2000です。 現在以下の現象で悩んでおります。 EXCEL2000のVBAでUserform1(シート上ではない方です)を作り、そこにTextbox1(TabIndex = 0)とCommandButton1(TabIndex = 1)を配置しました。 UserFormを初回に表示した時、及びフォームの右上の「X」で閉じた後は問題ないのですが、以下のコードでUserForm1を閉じた後に再び他のマクロからUserForm1.showとやると、どこにもフォーカスがない状態でUserForm1が立ち上がります。 Private Sub CommandButton1_Click() UserForm1.TextBox1.SetFocus UserForm1.Hide End Sub 一方他のマクロから UserForm1.show UserForm1.textbox1.SetFocus とやってみても期待通りにフォーカスはあたりません。 どのような場合でもUserFormが表示されたときにはtextbox1にフォーカスをあてるようにしたいのです。 尚、この現象はEXCEL2002だと同じコードでも問題なくフォーカスがあたります。 以上よろしくお願いします。

  • フォームを開く時のイベント処理

    Visual Basic 6.0 あるフォーム読込時イベント[Private Sub Form_Load()]で コマンドボタンにフォーカスを移動しようとしたら、エラーしてしましました。 Private Sub Form_Load() CommandButton.SetFocus ’プロシージャの呼び出し、または引数が不正です End Sub Form_Open や BeforeUpdate ? 開いた後にフォーカスをセット出来る イベント処理は無いでしょうか? ご教授願います。

  • フォーカスについて

    エンターを押すと、特定のコマンドボタンが押ささるプログラムを作っているのですが、エンターを押すとフォーカスがセットされているコマンドボタンが押ささってしまいます。 特定のコマンドボタンって言っても、1個のコマンドボタンなんですがなんかいい方法ありますか? それから、キーボードの矢印キーで、並んであるコマンドボタンにフォーカスを移動させたいのですがいい方法ありますか? TabIndexの関係だと思うのですが、上キーを押すと、すぐ上のボタンではなく右にいったり左にいったり・・・ どうか教えてください。 お願いします

  • TabIndexを使わないで、フォーカスの移動

    ご多忙中大変申し訳ありません。 VBの初心者です。 TabIndexを使わないで、コントロールの名前の番号でフォーカスの移動をしたいのですが、私のレベルでは全くできません。 TextBox1、TextBox2、TextBox3、TextBox3、~TextBox15 のようにTextBoxの後ろに付いている、数字を利用してフォーカスの移動をしたいと思っております。 実装前に下記のようなコードを書いてテストしていますが、どこを調べても、また試行錯誤を繰り返してもできません。 Public Class Form1 'テスト Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Me.KeyPreview = True '1列目TextBoxの生成 Dim i As Integer For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(50, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 txtbx.Text = "TabIndexは" & CStr(i * 3) txtbx.Name = "TextBox" & CStr(i + 1) Me.Controls.Add(txtbx) Next '2列目TextBoxの生成 For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(160, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 + 1 txtbx.Text = "TabIndexは" & CStr(i * 3 + 1) txtbx.Name = "TextBox" & CStr(i + 6) Me.Controls.Add(txtbx) Next '3列目TextBoxの生成 For i = 0 To 4 Dim txtbx As New TextBox txtbx.Size = New Size(105, 30) txtbx.Location = New Point(270, 50 + i * 40) txtbx.Font = New Font("MSゴシック", 12, FontStyle.Regular) txtbx.TabIndex = i * 3 + 2 txtbx.Text = "TabIndexは" & CStr(i * 3 + 2) txtbx.Name = "TextBox" & CStr(i + 11) Me.Controls.Add(txtbx) Next End Sub Private Sub Form1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown If e.KeyCode = Keys.Right Then '→キーによるフォーカスの移動 Me.SelectNextControl(ActiveControl, True, True, True, False) e.Handled = True ElseIf e.KeyCode = Keys.Left Then '←キーによるフォーカスの移動 Me.SelectNextControl(ActiveControl, False, True, True, False) e.Handled = True End If '↓(Down)キーによるフォーカスの移動  ここができません。 If e.KeyCode = Keys.Down Then Dim txtboxname As String txtboxname = Me.ActiveControl.Name 'TextBoxの名前の名前の取得 Dim txtbxnum As String txtbxnum = txtboxname.Remove(0, 7) 'TextBox~の名前から、~(数字)だけにする。 Dim controlName As String controlName = "TextBox" & CStr((CInt(txtbxnum) + 1)) 'TextBox~の名前の~に1を足す。 Me.Controls(controlName).Select() 'TextBox~+1のTextBoxをフォーカス 'Select() Focus()も結果は同じです。 End If '↑(Down)キーによるフォーカスの移動 'この部分は、↓(Down)キーによるフォーカスの移動が出来るようになりましたら、追加します End Sub ' Enterキーによるフォーカスの移動 Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress If e.KeyChar = Chr(Keys.Enter) Then Me.SelectNextControl(ActiveControl, True, True, True, True) e.Handled = True End If End Sub End Class 最終的な目的の動作は、EnterキーではTabIndexの順番にフォーカスの移動。 ←キーでは、左にフォーカスの移動。 →キーでは、右にフォーカスの移動。 ↑キーでは、上にフォーカスの移動。 ↓キーでは、下にフォーカスの移動。 コントロールの名前の番号でフォーカスの移動をしたい理由は、 Enterキーと←、→キーによるフォーカスの移動でTabIndexの順番を使い、上下方向、↑キー、↓キー移動には、TabIndexの順番が画像のように少々複雑になってしまい、TabIndexを使用してのフォーカスの移動は断念しました。 もし、TabIndexでフォーカスの移動が出来るようなら、そちらのほうでもかまいません。 使用バージョンは、VB2010 Express Edition です。 ご迷惑を、おかけしますが、どうかご助力をお願いいたします。

  • タブキー 自身のコントロールにフォーカスをあてたい

    タブキーで移動しても自身のコントロールにフォーカスをあてたい txt_検索文字と言うコントロールがあり、 txt_検索文字に文字を入力して、タブキーで移動すると、 Private Sub txt_検索文字_AfterUpdate() ’更新処理・・・ Me.Controls("txt_検索文字").SetFocus End Sub のイベントが発生するのですが、 タブキーを押してイベントが終わっても、再度、txt_検索文字のままにしたいのですが、 Me.Controls("txt_検索文字").SetFocus がきいてないようです。 他のコントロールにフォーカスが当たってしまいます。 ようは、タブキーを押してコントロールの更新イベントが発生しても、再度同じコントロールのままカーソルを充てる方法を教えてください。

  • フォーカスの順番移動

    VBAで今フォーム1にテキストボックス2つ コンボボックス3つ上から順にあるのですが エンターキーまたはタブを押すと上から順番にフォーカスを移動させたいので すが、どうすればいいのでしょうか?プロパティの設定でできるのでしょうか ?今はタブキーを押すとばらばらの順番でフォーカスが移動します。なぜでしょう? ちなみにコントロールの名前は上から TextBox1、TextBox2、ComboBox1、ComboBox2、ComboBox3です

専門家に質問してみよう