こんにちは、Ryoです。
ユーザーフォームなどで主に使用するコマンドボタンですが、通常はクリックすることでそのボタンにフォーカスが残るので、用途としてテキストボックスにフォーカスを残しておきたい時などは切替わるフォーカスが煩わしいこともあります。なので今回はボタンクリック後のフォーカスを保持しない方法について書いていきます。
1.サンプル概要
ユーザーフォーム上にテキストボックス1つ、コマンドボタン3つを配置したサンプルを作っており、UserForm1の初期化処理でCommandButton1,2はボタンをクリックしてもフォーカスを残さない設定にしています。
「CommandButton1は文字列表示のみ」ですが、「CommandButton2はフォーカスを残さない設定をリセット」させるものなので、Button2を押した後はフォーカスがそれぞれ残るようになります。
「CommandButton3は初期状態に復帰させる」ボタンなので、押すことでテキストボックスをクリアし、ボタンクリックによるフォーカス保持を無効にさせています。
これらの内容を簡単に動作させたものが以下になります。
サンプル概要としては以上です。
2.サンプルコード
使用するユーザーフォーム構成は以下の通りです。
◆UserForm1初期化処理
Private Sub UserForm_Initialize() 'UserForm1初期化処理 'コマンドボタン1,2共にクリック時に 'フォーカスを残さない設定(=False) CommandButton1.TakeFocusOnClick = False CommandButton2.TakeFocusOnClick = False End Sub
この初期化処理でコマンドボタン1と2にフォーカスを残さない設定をしています。その場合はTakeFocusOnClickプロパティを利用します。
構文:オブジェクト.TakeFocusOnClick = True / False
このプロパティはコントロールをクリックした時に、そのコントロールのフォーカスについて設定することができます。True設定でフォーカスを持ち、False設定でフォーカスを持たない状態にします。
ここではフォーカスを持たせない状態を初期設定とするので、CommandButton1と2にFalseを設定しています。
◆CommandButton1クリックの処理
Private Sub CommandButton1_Click() 'TextBox1への文字列表示 'TextBox1の表示内容に応じて文字列を変更 With TextBox1 If .Value = "" Or _ .Value = "ボタンにフォーカスを残しません" Then 'フォーカスが残らない状態での文字列表示 .Text = "ボタンにフォーカスを残しません" Else 'フォーカスが残る状態での文字列表示 .Text = "ボタンにフォーカスが残ります" End If End With End Sub
このボタンはクリックしてもフォーカスが残らないことを確認する目的で設定しているものなので、クリックされたらTextBox1に「ボタンにフォーカスを残しません」と表示します。
基本は上述動作なのですが、これから書く他のボタン処理との関連で表示内容の変化を分岐処理で行っています。
CommandButton2はリセットしてフォーカスを残す処理になるので、そのボタンが押された後にCommanButton1をクリックして「・・・残しません」という表示では状態と整合しませんから、If文で状態を判定し表示を変えています。
If .Value =””はCommandButton3が押されていて、”・・・残しません”表示の時はCommandButton1のみ押されている状態、Elseの処理はCommandButton2が押されていることをそれぞれ判定させています。
◆CommandButton2クリックの処理
Private Sub CommandButton2_Click() 'リセット(ボタンクリック後にフォーカスを残す) '通常の状態に戻す(ボタンクリック⇒フォーカス) CommandButton2.TakeFocusOnClick = True CommandButton1.TakeFocusOnClick = True 'テキストボックスへの状態表示 TextBox1.Text = "ボタンにフォーカスが残ります" End Sub
ここではリセット機能としてTakeFocusOnClickプロパティにTrue設定(フォーカスを持つ)としています。
その際にテキストボックスの文字列表示を「・・・残りません」から「・・・残ります」への変更も合わせて実行します。ここで設定する文字列が上で書いたCommandButton1の判定条件にもなっています。
このボタン2を一度押すことで有効になるので、押してからボタンを再度クリックするとフォーカスが残る状態になっていることがわかると思います。
◆CommandButton3クリックの処理
Private Sub CommandButton3_Click() '初期状態に復帰する処理 'UserForm1の初期化処理を実行 Call UserForm_Initialize 'テキストボックスへフォーカスを移動 TextBox1.SetFocus 'テキストボックスの文字をクリア(空白) TextBox1.Value = vbNullString End Sub
ここでは初期状態に復帰させますので、CallでUserForm1の初期設定を行ったUserForm_Initialize()を実行させます。
そのままではCommandButton3にフォーカスが残ってしまうのでTextBox1へフォーカスを移動させることでボタンのフォーカスを外しています。
後はテキストボックスの文字をクリアすれば初期状態とすることができます。
以上がサンプルコードになります。
3.まとめ
フォーカスを一定にしたい場合などはSetFocusを使用して、どのボタンを押してもオブジェクト.SetFocusと統一しておけばOKなので必ずしもTakeFocusOnClickプロパティを利用しなくても対応はできるものと思います。
このプロパティは初期設定しておけば維持された状態になりますので、用途に応じて利用することで記述自体も楽になりますから知っておくと活用する機会もあるのではないかと思います。
以上、ボタンクリック後のフォーカスを残さない方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo