今回はユーザーフォームで条件を満たすまでボタンをクリックさせないようにする方法を備忘録も兼ねて紹介したいと思います。
条件を満たすまでボタンをクリックさせないようにする方法
例えば以下のようにチェックボックスとコマンドボタン(OKボタン)が配置されているユーザーフォームがあるとします。

ここに配置されているチェックボックス全てにチェックが入っていればクリックできるようにし、1つでもチェックが入っていない場合はボタンをクリックできないようにする、みたいな感じです。
コード
コードの紹介
それではコードを紹介します。
なお、コードは全てユーザーフォームのコードエディタに記述します。
'チェックボックス_1のステータスが変わった時に実行
Private Sub CheckBox1_Change()
If CheckBox1.Value = True And CheckBox2.Value = True Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub
'チェックボックス_2のステータスが変わった時に実行
Private Sub CheckBox2_Change()
If CheckBox1.Value = True And CheckBox2.Value = True Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub
'ユーザーフォームを開いたときに実行される
Private Sub UserForm_Initialize()
CommandButton1.Enabled = False
End Sub
'「OK」ボタンを押したらメッセージを表示
Private Sub CommandButton1_Click()
MsgBox "はりぼなブログへようこそ!"
Unload Me
End Sub
コードの説明
次に各プロシージャについて説明していきます。
ポイントになるのはチェックボックスのステータスが変わった時に実行されるプロシージャになります。
'チェックボックス_1のステータスが変わった時に実行
Private Sub CheckBox1_Change()
If CheckBox1.Value = True And CheckBox2.Value = True Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub
'チェックボックス_2のステータスが変わった時に実行
Private Sub CheckBox2_Change()
If CheckBox1.Value = True And CheckBox2.Value = True Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub
このプロシージャにおいてポイントになるのは以下の2点です。
CheckBox#_Change()
プロシージャCheckBox#.Value
まずCheckBox#_Change()
プロシージャについて説明します。
このプロシージャは普段書くようなプロシージャと違い、チェックボックスにチェックを入れたり外したりした時にも実行されます。
なぜそのタイミングで実行されるのか、というとこれはイベントを設定している為です。
イベントとは、特定のオブジェクトが何らかのアクションを起こした時にコードを実行させることができる機能のことです。
具体例を挙げると以下のようになります。
- ワークシートのセルを編集した時
- ワークブックを保存した時
- ユーザーフォームを開いた時
まあ色々書きましたが、イベントは何らかのアクションを起こしたタイミングで実行させることができる機能みたいなイメージを持っていただければOKです。
【チェックボックスオブジェクト名】_Change()
で定義することで、指定したチェックボックスのステータスが変わったタイミングで中の処理を実行させることができます。
'チェックボックスのステータスが変わったタイミングで実行される
Private Sub CheckBox#_Change()
'ここに処理を書く
End Sub
次にCheckBox#.Value
について説明します。
先ほど、「チェックボックスのステータス」と言いましたが、ここで言うチェックボックスのステータスとは「チェックが入っているか入っていないか」になり、【チェックボックスオブジェクト名】.Value
で確認することができます。

'チェックボックス_1のステータスを表示。
MsgBox CheckBox1.Value
チェックが入っていればTrue
になり、チェックが入っていなければFalse
が返ってきます。
これを利用してIfで条件として指定することでチェック状況を判定することができるわけです。
If CheckBox1.Value = True And CheckBox2.Value = True Then
End If
そして、チェックボックス1,2の両方にチェックが入っていれば、OKボタンを押せるようにCommandButton1.Enabled
をTrue
にし、どちらか一方でもチェックが入っていなければFalse
を設定するようにします。
If CheckBox1.Value = True And CheckBox2.Value = True Then
'OKボタンを押せるようにする
CommandButton1.Enabled = True
Else
'OKボタンを押せないようにする
CommandButton1.Enabled = False
End If
こうすることでチェックボックスの値に応じてボタンを押せる・押せないところまで変化させることができるようになります。

まとめ
今回はユーザーフォームで条件を満たすまでボタンをクリックさせないようにする方法を備忘録も兼ねて紹介しました。
似たような悩みをお持ちの方は是非参考にしていただければと思います。
このブログではVBAに関する記事を不定期で投稿していますので、是非ご覧ください!
コメント