はじめに
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 種類別コレクション)を使うかは好みの問題でもありますが、特定の種類のコントロールだけを操作することが分かっている場合は、こちらの専用コレクションを使う方が、コードの意図が明確になり、可読性も高まるためおすすめです。