こんにちは、Ryoです。
VBAで扱うUserForm(ユーザーフォーム)のコマンドボタンですが、不特定多数の人間が扱う場合は違うボタンを押してしまったり、ダブルクリックしてしまって不要なエラーにつながってしまうこともあります。
今回はその対処として、サンプルを使ってコマンドボタンの有効/無効切替やダブルクリック防止、フォーカス指定などについて書いてみたいと思います。
1.サンプル概要
先ずUSerForm呼び出し用コマンドボタンによりフォームを表示します。
呼び出す際に表示位置を指定したいこともありますから、サンプルでは位置を指定する形で記述しています。
フォームにはCommandButton1~6を配置し、「ボタン有効/無効切替」「二度押し防止」「復旧」(二度押し防止ボタン復旧用)「閉じる」ボタンが配置されています。
CommandButton1~6は有効/無効切替用として設置してあり、「ボタン有効/無効」切替ボタンを押すと。。。
この通り表示が変わり無効化され、押せなくなりますが再度ボタンを押すと元に戻ります。
二度押し防止(ダブルクリック防止)については押すと、ボタン自体が無効化され下の「復旧」を押すことで有効化されます。
このサンプルでは「二度押し防止」を押すとフォーカスが「復旧」に、「復旧」を押すと「二度押し防止」に切り替わる形としています。
では次にUserFormやサンプルコードについて説明します。
2.サンプルコード
◆UserForm
UserFormについては、エディタ画面の挿入からユーザーフォームを選択します。
そのフォーム上にCommandButton1~6をツールボックスから配置し、「ボタン有効/無効切替」はCommandButton7、「閉じる」がCommandButton8、「二度押し防止」がCommandButton9、「復旧」がCommandButton10となっています。
ボタン名はプロパティウィンドウの項目別にある表示内「Caption」で変更しています。
ボタンカラーについても同様の表示内にあるBackColorやForeColorでパレットを選択して選んでいますが、ここはお好みで良いと思います。
◆Form呼び出し
Sheet上に配置したボタンの「Form呼び出し」については以下になります。
Sub ボタン1_Click() With UserForm1 .StartUpPosition = 0 .Top = 300 .Left = 200 .Show End With End Sub
デフォルト名をそのまま使ったのでボタン1_Click()になってますが、ここで行っているのはフォームの表示位置を指定し、そこに表示させるということです。
記述が被るのでWithを使っていますが、.StartUpPosition = 0として次に指定する.Top = 300、.Left = 200で上端からと左端からの位置を指定します。
その後、.Showでフォームが表示されるということになります。
念のために説明しますが、With UserForm1としているので、End Withまでの間は省略しており、例えば.Top=300はUserForm1.Top=300を表しているということです。
◆ボタン有効/無効切替
この部分は「ボタン有効/無効切替」ボタンを押すことで実行されるので、UserForm1上に配置したボタンをダブルクリックすると、Private Sub CommandButton7_Click()が表示されるので、その中に記述します。
【記述例1】
Private Sub CommandButton7_Click() For i = 1 To 6 With UserForm1.Controls("CommandButton" & i) If .Enabled = True Then .Enabled = False Else .Enabled = True End If End With Next i End Sub
WithとIfを使った場合のサンプルです。
ボタンを無効化する為にはUserForm1.Controls(“CommandButton” & i).Enabled = True又はFalseを指定し有効はTrue,無効はFalseになります。
ちょっと紛らわしいのですが、知っておくと困らない点として上述の様に指定する記述は変数を使ってコマンドボタン複数に対し処理する上で使います。
通常単体のボタンを有効、又は無効にする場合はCommandButton9.Enabled = FalseだけでOKなのですが、この記述を基に”CommandButton” & i.Enabledでは動作しないので、ご注意ください。
そして肝心の有効/無効はIf文で処理していますが、単純に.Enabled = TrueならFalse、.Enabled = FalseならTrueに切り替えています。これでもOKですが、ON/OFF切替の形であれば以下の様な形でスッキリ出来ます。
【記述例2】
Private Sub CommandButton7_Click() For i = 1 To 6 With UserForm1.Controls("CommandButton" & i) .Enabled = Not .Enabled End With Next i 'Not演算子は論理否定を求めるのでTrueならFalse,FalseならTrueを返す。 'その為、本サンプルの様にON/OFF切替には有効 End Sub
この様にNot演算子を使うとスッキリ書けますし、切替などには有効なので知っていると便利でお薦めです。
◆二度押し防止(ダブルクリック防止)
これは誤ってダブルクリックや二回押してしまうことを防ぐには効果的だと思います。
記述自体は上で説明した有効/無効と同様です。
Private Sub CommandButton9_Click() CommandButton9.Enabled = False CommandButton10.SetFocus End Sub
このサンプルでは「二度押し防止」ボタンを押した際に「無効」とすれば良いので、押されたらCommandButton9.Enabled = Falseで無効化するだけです。
次のCommandButton10.SetFocusは「復旧」ボタンをフォーカス指定するものなので、ボタン押す⇒無効化⇒復旧ボタンにフォーカスという形です。
◆復旧ボタン(二度押し防止ボタンの解除)
Private Sub CommandButton10_Click() With CommandButton9 If .Enabled = False Then .Enabled = True .SetFocus End With End Sub
「復旧」ボタンが押されたら「二度押し防止」ボタンが無効の場合、True(有効)にして「二度押し防止」ボタンをフォーカス指定するという処理になります。
このボタン間はフォーカスを移しているので、マウスでクリックしなくてもEnterキーを押すことで交互に移り変わります。
◆閉じる
フォームを閉じる場合の処理は以下の通りです。
Private Sub CommandButton8_Click() Unload UserForm1 End Sub
Unloadで閉じるフォームを指定すればOKです。
3.まとめ
このサンプルではボタンを押すことで無効/有効を切り替えたりしていますが、実運用上では開始するボタンを押した後、再起動防止用として無効にしつつ他の押してほしくないボタンを無効化し、処理終了後に有効化するような使い方だと思います。
実際に運用を始めた後の操作などでエラー防止する上では有用な方法だと思いますので、機会があれば参考にしてみてくださいね。
以上、ユーザーフォームボタンの有効/無効、フォーカス指定やフォーム表示位置指定についてでした!今回の記事が何かの参考になれば幸いです。
Ryo