沢山のチェックボックス ② チェックボックス追加に対応

昨日は、ユーザーフォームに配置された沢山のチェックボックスの中から、
一つだけチェックする方法の簡素化に取り組んでみた。
infoment.hatenablog.com

今日は、昨日の続きから。
f:id:Infoment:20200526220712j:plain

昨日は、CheckBox1 ~ CheckBox10までを一つのグループとして扱った。
何だか見た目が味気ないので、二つ足して干支にしてみた。
f:id:Infoment:20200526220852p:plain

このように、チェックボックスの数が増えることも、業務ではよくあること。
そのたびにFor ~ Next を書き換えるのは面倒だ。

そこで、CheckBoxが何個あるか数えることにした。

Sub SwichCheckBox(checkbox_number As Long)
    Dim i As Long
        If Me.Controls("CheckBox" & checkbox_number) = False Then
            Exit Sub
        End If
        
        For i = 1 To CheckBoxTotalNumber
            Select Case i
                Case checkbox_number
                    Me.Controls("CheckBox" & i) = True
                Case Else
                    Me.Controls("CheckBox" & i) = False
            End Select
        Next
End Sub

Private Property Get CheckBoxTotalNumber() As Long
    Dim Control As MSforms.Control
        For Each Control In Me.Controls
            If TypeName(Control) = "CheckBox" Then
                CheckBoxTotalNumber = CheckBoxTotalNumber + 1
            End If
        Next
End Property

上記のように、毎回数えたくない方は、さらに変数で受けても良いと思う。

CheckBoxの1~12が味気ないという方は、Enumと組み合わせても良いかも。

Enum 干支
    en子 = 1
    en丑
    en寅
    en卯
    en辰
    en巳
    en午
    en未
    en申
    en酉
    en戌
    en亥
    [_eLast]
End Enum

すると各CheckBoxのクリックイベントも、どのCheckBoxがどの干支と対応しているかなど、少し分かり易くなってくる。

Private Sub CheckBox1_Click()
    SwichCheckBox 干支.en子
End Sub

Private Sub CheckBox2_Click()
    SwichCheckBox 干支.en丑
End Sub

Private Sub CheckBox3_Click()
    SwichCheckBox 干支.en寅
End Sub

' 以降、省略。

ここまで工夫しても、CheckBoxが12個ならクリックイベントも12個、100個なら100個必要な訳で。

次回に続きます。

参考まで。