こんにちは、Ryoです。
VBAでよく扱うユーザーフォームで、起動時やキャンセル時のボタン処理を通常はマウスなどでクリックして行っていると思いますが、頻度が多くなってくるとボタン位置までカーソルを動かす動作そのものが煩わしくなることもあるので、今回はEnterやEscキーなどを使ってボタンクリックと同様の動作をさせる方法をトグルボタンやフォーカスなども交えながら書いていきます。
1.サンプル概要
サンプルとして画像に示すユーザーフォームを準備しています。
コマンドボタン1を「既定」として設定しており、「Enter」キーを押すことでCommandButton1をクリックした時と同様の動作を行います。サンプルではEnterキーを押すとテキストボックスに[Enter]key pressed.と表示します。
コマンドボタン2はキャンセルボタンとして設定し、Escキーを入力することでCommandButton2をクリックした時と同様の処理としています。サンプルではEscキーを押すとテキストボックスに[Esc]key pressed.と表示します。
上の画像の通り、通常ではEscキー押す=キャンセルボタンなのでコマンドボタン2にフォーカスが移ります。この状態でEnterキーを押すとフォーカスのあるコマンドボタン2を押してしまうので、それを避ける為の例としてトグルボタンのON/OFFでフォーカス移動有無を選択できる形としています。
トグルボタンを押すと「 ON 」表示に変わり、「Esc」キーやコマンドボタン2のクリックでもフォーカスは常にコマンドボタン1に戻ります。
再度トグルボタンを押すと表示は「 OFF 」に変わり、フォーカス自体の制限はなくなりますので初期状態に戻ります。
これらの内容について以下に書いていきます。
2.サンプル構成
◆ユーザーフォーム構成
サンプルの構成としては以下画像の通りで、UserForm1上にToggleButton1/TextBox1/CommandButton1/CommandButton2を配置しています。
◆サンプルコード
◆Enter/Escキーで処理を実行
Private Sub UserForm_Initialize() 'Me=このユーザーフォームに対する処理 With Me 'コマンドボタン1をデフォルト(既定)のボタンに設定 .CommandButton1.Default = True 'コマンドボタン2をキャンセルボタンに設定 .CommandButton2.Cancel = True End With End Sub
先ずはコマンドボタン1とコマンドボタン2にEnter/Escキーで実行できるようDefaultプロパティ/Cancelプロパティを使用して設定していきます。
構文:オブジェクト.Default/Cancel = True or False
DefaultプロパティはTrue設定したコマンドボタンを「既定」として設定するもので、他のコントロールにフォーカスがなければ「Enter」キーでそのコマンドボタンをクリックした時と同様の動作を行うことができます。
また、CancelプロパティにTrueを設定したコマンドボタンは「キャンセルボタン」となります。この場合はコマンドボタンにフォーカスがなくてもEscキーで実行することが可能です。
◆トグルボタンによる処理
Private Sub ToggleButton1_Change() 'トグルボタンが変化した際の処理 With ToggleButton1 'トグルボタンの状態に応じて分岐処理 Select Case .Value Case True 'トグルボタンがON=Trueで 'ボタン上のCaptionを「 ON 」 .Caption = "「 ON 」" Case False 'トグルボタンがOFF=Falseで 'ボタン上のCaptionを「 OFF 」 .Caption = "「 OFF 」" End Select End With End Sub
Private Sub ToggleButton1_Change()はトグルボタンが変更された際に処理を実行するものになります。
ここではValueプロパティを利用してトグルボタンの状態を取得します。
ToggleButton1.Value = True or False
トグルボタンがくぼんだ状態がONでTrueとなり、OFFでFalseとなりますので、その状態にあわせてキャプションを変更していますので、True⇒Caption =”「 ON 」”、False⇒Caption = ” 「 OFF 」”としています。
◆コマンドボタン動作
Private Sub CommandButton1_Click() '「Enter」キーが押された場合、または 'コマンドボタン1がクリックされた際の処理 TextBox1.Text = "[Enter]key pressed." End Sub
Private Sub CommandButton2_Click() '「ESC」キーが押された場合、または 'コマンドボタン2がクリックされた際の処理 TextBox1.Text = "[ESC]key pressed." '**追記** 'ESCキー入力によるキャンセルは対象のコマンドボタンに 'フォーカスがなくても実行可能 '(実行時にキャンセルボタンへフォーカスが移動) '****** 'トグルボタンがON⇒フォーカスを常にボタン1とする 'トグルボタンがOFF⇒フォーカスを特に制限しない If ToggleButton1.Value = True Then _ Me.CommandButton1.SetFocus End Sub
CommandButton1は「Enter」キー入力、またはボタンクリックした際のTextBox1への表示のみになります。
CommandButton2については「Esc」キー入力、またはボタンクリックにてTextBox1へ表示しますが、ここでToggleButton1のON/OFFによるフォーカス移動有無の判定も行っています。
If ToggleButton1.Value = True Then Me.CommandButton1.SetFocus
ToggleButton1がTrue(ON)であればフォーカスをCommandButton1に移すので、Enterキーを押すことで動作させたいボタンが常に選択された状態としています。
3.まとめ
データ収集や集計などを目的にユーザーフォームで作成することは多いのですが、繰り返す回数が多いとマウスでカーソルを合わせるだけでも煩わしく感じますから、サンプルのような形でキー入力を利用することも良いかと思います。
今回は使用したトグルボタンを併用するとスイッチ的な役割を果たしてくれますので使い勝手も変わりますから、機会があれば活用などを検討されてみるのも良いと思います。
以上、Enter/Escキーで処理を実行する(ユーザーフォーム)方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo