はじめに
Excelのシート上に配置した「フォームコントロール」をVBAで操作する際、前回は Shapes コレクションを経由する方法をご紹介しました。しかしVBAには、より直接的にコントロールを扱うための、コントロールの種類ごとに用意された専用のコレクションが存在します。
例えば、シート上の全てのチェックボックスは CheckBoxes コレクションに、全てのリストボックスは ListBoxes コレクションに、それぞれ格納されています。
この記事では、これらの種類別コレクションを使って、特定のフォームコントロールをよりスマートに操作する方法を解説します。この方法は、コードが簡潔になり、コントロール固有の機能にもアクセスしやすくなるというメリットがあります。
種類別コレクションによるアクセス方法
Shapes(...).ControlFormat を使う方法と異なり、種類別コレクションから取得したオブジェクトは、そのコントロール固有のプロパティ(.Value, .ListFillRangeなど)に直接アクセスできます。
基本構文: ActiveSheet.コントロールの複数形("コントロール名")
コントロール別のサンプルコード
1. チェックボックス (CheckBoxes コレクション)
CheckBox オブジェクトを取得し、その .Value プロパティを直接操作します。
サンプルコード
' CheckBoxesコレクションを使って、チェックボックスを操作する
Sub ManipulateCheckBoxDirectly()
    Dim chkBox As CheckBox
    
    ' "TaskCompleteCheck"という名前のチェックボックスを取得
    Set chkBox = ActiveSheet.CheckBoxes("TaskCompleteCheck")
    
    ' チェックボックスをオンにする
    chkBox.Value = xlOn ' xlOn = 1
    
    ' 現在の状態をメッセージボックスに表示
    If chkBox.Value = xlOn Then
        MsgBox chkBox.Name & " はチェックオンです。"
    End If
    
    ' リンクするセルも直接設定可能
    chkBox.LinkedCell = "C1"
End Sub
解説: ActiveSheet.CheckBoxes("TaskCompleteCheck") だけで、チェックボックスオブジェクトそのものを取得できます。.ControlFormat を挟む必要がなく、コードが直感的になります。
2. リストボックス (ListBoxes コレクション)
ListBox オブジェクトを取得し、リストの範囲や選択状態を操作します。
サンプルコード
' ListBoxesコレクションを使って、リストボックスを操作する
Sub ManipulateListBoxDirectly()
    Dim lstBox As ListBox
    
    ' "RegionListBox"という名前のリストボックスを取得
    Set lstBox = ActiveSheet.ListBoxes("RegionListBox")
    
    With lstBox
        ' リストの項目範囲を設定
        .ListFillRange = "RegionData!A2:A10"
        
        ' リストの4番目の項目を選択状態にする
        ' .Value と .ListIndex は同じものを指す
        .Value = 4
        
        ' 選択されている項目のインデックスを表示
        MsgBox .ListIndex & "番目の項目が選択されています。"
    End With
End Sub
解説: こちらも .ControlFormat を介さず、.ListFillRange や .Value といったプロパティに直接アクセスできています。
3. スピンボタン (Spinners コレクション)
同様に、Spinner オブジェクトを取得し、その数値範囲や現在値を操作します。
サンプルコード
' Spinnersコレクションを使って、スピンボタンを操作する
Sub ManipulateSpinnerDirectly()
    Dim spn As Spinner
    Set spn = ActiveSheet.Spinners("CountSpinner")
    
    With spn
        .Min = 0
        .Max = 50
        .SmallChange = 5
        .Value = 15
        .LinkedCell = "C2"
    End With
    
    MsgBox "スピンボタンの現在の値: " & spn.Value
End Sub
まとめ
今回は、VBAでシート上のフォームコントロールを、種類別の専用コレクション (CheckBoxes, ListBoxes など) を使って操作する方法を解説しました。
- ActiveSheet.CheckBoxes("名前")のように、コントロールの種類に応じたコレクション名を使う。
- この方法では .ControlFormatを経由する必要がない。
- コントロール固有のプロパティに直接アクセスでき、コードがよりシンプルで直感的になる。
どちらの方法(Shapes or 種類別コレクション)を使うかは好みの問題でもありますが、特定の種類のコントロールだけを操作することが分かっている場合は、こちらの専用コレクションを使う方が、コードの意図が明確になり、可読性も高まるためおすすめです。

 
			 
			 
			 
			 
			 
			 
			