CheckBoxを1対1で排他処理する

ちょっと作ってみたので書いてみる

Private m_conflict As Boolean   ' 排他処理状態を示すフラグ

'---------------------------------------
'   チェックボックスの排他処理
'---------------------------------------
Private Sub CheckBoxExeclusion(One As Object, The_Other As Object)
    If One.Value = True And The_Other.Value = True Then
        m_conflict = True
    
        Dim ret As VbMsgBoxResult
        ret = MsgBox("「" & One.Caption & "」は" & vbCrLf & _
                        "「" & The_Other.Caption & "」と同時にチェックできません。" & vbCrLf & _
                        "それでも「" & One.Caption & "」にチェックしますか?", vbYesNo)
        If ret = vbYes Then
            One.Value = True
            The_Other.Value = False
        Else
            One.Value = False
            The_Other.Value = True
        End If
        
        m_conflict = False
    End If
End Sub

'---------------------------------------
'   チェックボックス A
'---------------------------------------
Private Sub CheckBoxA_Click()
	If Not m_conflict Then Call CheckBoxExeclusion( CheckBoxA, CheckBoxB )
End Sub

'---------------------------------------
'   チェックボックス B
'---------------------------------------
Private Sub CheckBoxB_Click()
	If Not m_conflict Then Call CheckBoxExeclusion( CheckBoxB, CheckBoxA )
End Sub

'
'	....	その他処理については省略	....
'

'---------------------------------------
'   フォームの初期化
'---------------------------------------
Private Sub UserForm_initailize()
	m_conflict = False
End Sub
デバックをして気付いた注意点
  • CheckBox はクリックした時点で Value が反転している。その為、各 (CheckBox)_Click 処理で Value の反転はしなくて良い。
  • CheckBox の Value の値を変更すると、項目を Click したものと同等と見なされ (CheckBox)_Click の処理に飛ぶ。これによって無限ループにはまる可能性も・・・。
  • メッセージボックスの内容は見難いかも