選択したチェックボックス(フォームコントロール)の名前を変更する

昨日は、何度も登場する似たようなプロシージャを纏めてみた。
infoment.hatenablog.com
今日は、選択したチェックボックス(フォームコントロール)の名前を変更することに挑戦する。
f:id:Infoment:20191117132456p:plain

単純にチェックボックスの名前を変更するだけなら、あまり難しくない。
このような感じで、変更後の名前を指定するだけだ。

CheckBox.Name = 変更後の名前

ただし今回は、チェックボックスの名前をグループ化に利用しているため、グループ情報がある場合は、その部分を残さなければならない。

そこで、これを判別したうえで、名前を変更することにした。

まず、ユーザーフォームにテキストボックスとボタンを追加。
f:id:Infoment:20191117132930p:plain

  1. テキストボックス NewNameInputButton
  2. コマンドボタン  NameChangeButton
ユーザーフォーム(CBsEditForm)
Private Sub NameChangeButton_Click()

    Dim SelectedIndex As Long
        SelectedIndex = CBsListBox.ListIndex

        ' チェックボックス選択確認。
        If SelectedIndex = -1 Then
            MsgBox "対象となるCheckBoxが未選択です。"
            Exit Sub
        End If
        
    Dim OldName As String
        OldName = CBs.Item(SelectedIndex + 1).Name
    
    ' 名前が既にグループ分けされているか否か確認するため、
    ' 「_」で分割して配列化する。
    Dim NameArray As Variant
        NameArray = Split(OldName, "_")
        
    Dim NewName As String
    ' 配列ならば、3つ目の値を置き換える。
    ' 配列でないならば、すべて置き換える。
        If UBound(NameArray) > 0 Then
            ReDim Preserve NameArray(0 To 2)
            NameArray(2) = NewNameInputBox.Value
            NewName = Join(NameArray, "_")
        Else
            NewName = NewNameInputBox.Value
        End If
    
        ' チェックボックスのキャプション変更。
        CBs.Item(SelectedIndex + 1).Name = NewName
        ' 次の入力に備え、テキストボックスを初期化。
        NewNameInputBox.Value = vbNullString
        ' キャプション変更を反映するために、リストボックスをリセット。
        ResetCBsListBox
        ' どのチェックボックスが選ばれていたかを明示するため、改めて
        ' 対象をリストから選択。
        CBsListBox.Selected(SelectedIndex) = True
End Sub

テスト結果はこちら。
f:id:Infoment:20191117133220g:plain

通常であれば、名前だけ変更するケースは少ないと思う。今回は、名前を空欄にしてチェック部分だけ利用する場合、グループ化すると同じ名前のチェックボックスが複数発生する現象が起きたため、追加した次第。

最終回まであと2回。明日に続きます。

参考まで。