昨日は、シート上に配置された複数のオプションボタンについて、リストボックスで選択したオプションボタンのグループ名を変更してみた。
infoment.hatenablog.com
今日は、この部分について少し修正してみる。
現時点で思う「修正すべき点」は、以下の三つだ。
- 「●オプションボタン詳細」で各ボタンを選択した際、「●グループ名」の「選択状態」が残ったままになっている。これを解消。
- 1.の逆を解消。
- 「●グループ名」を選択した際、対応するオプションボタンを「●オプションボタン詳細」で選択させたい。
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
以上の結果が、↓ こちら。
時間切れで、今日はここまで。次回に続きます。
Option Explicit
Dim col As Collection
Dim myForeColor() As Long
Dim myBackColor() As Long
Dim ListSeq() As Variant
Dim Dict As Dictionary
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
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 GroupNameChangeButton_Click()
Dim i As Long
For i = 1 To DetailListBox.ListCount
With col.Item(i).Object
Select Case DetailListBox.Selected(i - 1)
Case True
.GroupName = GroupNameTextBox.Value
End Select
End With
Next
Call ResetList
GroupNameTextBox.Value = vbNullString
End Sub
Private Sub GroupNameTextBox_Change()
If GroupNameTextBox.Value = vbNullString Then
GroupNameChangeButton.Enabled = False
Else
GroupNameChangeButton.Enabled = True
End If
End Sub
Private Sub UserForm_Initialize()
Set col = New Collection
Dim myObj As Excel.OLEObject
For Each myObj In ActiveSheet.OLEObjects
If myObj.progID = "Forms.OptionButton.1" Then
col.Add myObj
End If
Next
ReDim myForeColor(1 To col.Count)
ReDim myBackColor(1 To col.Count)
ReDim ListSeq(1 To col.Count, 1 To 3)
Dim i As Long
For i = 1 To col.Count
With col.Item(i).Object
myForeColor(i) = .ForeColor
myBackColor(i) = .BackColor
End With
Next
Call ResetList
GroupNameChangeButton.Enabled = False
End Sub
Private Sub UserForm_Terminate()
Call ResetColor
End Sub
Private Sub ResetList()
Set Dict = New Dictionary
Dim i As Long
For i = 1 To col.Count
With col.Item(i).Object
ListSeq(i, 1) = col.Item(i).Name
ListSeq(i, 2) = .GroupName
ListSeq(i, 3) = .Caption
Dict(.GroupName) = 1
End With
Next
GroupListBox.List = Dict.Keys
DetailListBox.List = ListSeq
End Sub
Private Sub ResetColor()
Dim i As Long
For i = 1 To col.Count
With col.Item(i).Object
.ForeColor = myForeColor(i)
.BackColor = myBackColor(i)
End With
Next
End Sub
参考まで。