オプションボタンの管理ツール:指定ボタンの色変更 ③

昨日は、シート上に配置された複数のオプションボタンについて、リストボックスで選択したオプションボタンのグループ名を変更してみた。
infoment.hatenablog.com
今日は、この部分について少し修正してみる。
f:id:Infoment:20190419232456p:plain

現時点で思う「修正すべき点」は、以下の三つだ。

  1. 「●オプションボタン詳細」で各ボタンを選択した際、「●グループ名」の「選択状態」が残ったままになっている。これを解消。
  2. 1.の逆を解消。
  3. 「●グループ名」を選択した際、対応するオプションボタンを「●オプションボタン詳細」で選択させたい。

1.および2.について一番手っ取り早いのは、クリックしていない側のリストボックスを更新してしまうこと。そこでまず、リストボックス用に作成した辞書を、モジュールレベル変数に変更して使い回しできるようにする。

Option Explicit
Dim col As Collection
Dim myForeColor() As Long
Dim myBackColor() As Long
Dim ListSeq() As Variant
' ↓ 今回、モジュールの先頭に宣言個所を変更。
Dim Dict As Dictionary

そのうえで、まず「●オプションボタン詳細」のイベントを変更する。

Private Sub DetailListBox_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '「●グループ名」を初期化。
    ' ※今回追加。
    GroupListBox.Clear
    GroupListBox.List = Dict.Keys
    
    Dim i As Long
        For i = 1 To DetailListBox.ListCount
            With col.Item(i).Object
                Select Case DetailListBox.Selected(i - 1)
                    Case True
                        .ForeColor = vbYellow
                        .BackColor = 192
                    Case False
                        .ForeColor = myForeColor(i)
                        .BackColor = myBackColor(i)
                End Select
            End With
        Next
End Sub

「●グループ名」に関しては、「●オプションボタン詳細」を一旦リセットしたうえで、さらに選択したグループに対応するオプションボタンをリスト上で選択し、加えてシート上のオプションボタンの色まで変更する必要がある。

Private Sub GroupListBox_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    '「●オプションボタン詳細」を初期化。
    ' ※今回追加。
    DetailListBox.Clear
    DetailListBox.List = ListSeq
    
    Dim i As Long
        With DetailListBox
            For i = 0 To .ListCount - 1
                If .List(i, 1) = GroupListBox.Value Then
                    .Selected(i) = True
                End If
            Next
        End With
        
        For i = 1 To col.Count
            With col.Item(i).Object
                If .GroupName = GroupListBox.Value Then
                    .ForeColor = vbYellow
                    .BackColor = 192
                Else
                    .ForeColor = myForeColor(i)
                    .BackColor = myBackColor(i)
                End If
            End With
        Next
End Sub

以上の結果が、↓ こちら。
f:id:Infoment:20190419235431g:plain

時間切れで、今日はここまで。次回に続きます。

参考まで。