【Excel VBA】ユーザーフォームで条件を満たすまでボタンをクリックさせないようにする方法

Excel
スポンサーリンク

今回はユーザーフォームで条件を満たすまでボタンをクリックさせないようにする方法を備忘録も兼ねて紹介したいと思います。

スポンサーリンク

条件を満たすまでボタンをクリックさせないようにする方法

例えば以下のようにチェックボックスとコマンドボタン(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.EnabledTrueにし、どちらか一方でもチェックが入っていなければFalseを設定するようにします。

    If CheckBox1.Value = True And CheckBox2.Value = True Then
        'OKボタンを押せるようにする
        CommandButton1.Enabled = True
    Else
        'OKボタンを押せないようにする
        CommandButton1.Enabled = False
    End If

こうすることでチェックボックスの値に応じてボタンを押せる・押せないところまで変化させることができるようになります。

スポンサーリンク

まとめ

今回はユーザーフォームで条件を満たすまでボタンをクリックさせないようにする方法を備忘録も兼ねて紹介しました。

似たような悩みをお持ちの方は是非参考にしていただければと思います。

このブログではVBAに関する記事を不定期で投稿していますので、是非ご覧ください!

コメント

タイトルとURLをコピーしました