シートの表示/非表示をもっと簡単に の続き
昨日はシートの表示/非表示を、リストボックスを用いてコントロールする方法を
紹介しました。
これについてはけたさんから、クラスモジュールによるコントロールの参考記事を
紹介していただきました。
そこで今日は、CheckBox による表示/非表示の操作について、クラスモジュールを用いて挑戦してみます。
まず、クラスモジュールを一つ準備します。
CheckBox の イベントをコントロールするので、CBEventControl と命名しました。
中身は、こんな感じです。
Public WithEvents cb As MSForms.CheckBox Private Sub cb_click() Dim mySheetName As String mySheetName = Split(cb.Name, "_")(1) Sheets(mySheetName).Visible = Not cb.Value End Sub
CheckBoxで発生したイベントを捉えるため、変数 cb を準備します。そのクリックイベントとして、クリックされた CheckBox の名前に紐づくシートの表示/非表示を切り替えるわけです。
なお、この方法で行う場合に、以下二つの条件を満たしておく必要があります。
- CheckBox の名前は、「〇〇_シート名」であること。
- 上記 CheckBox に含まれる名前のシートが、必ず存在すること。
今回、シートが存在しない場合のエラー処理は行っていません。実際に使用する場合は、その辺りの考慮も必要になると思います。
ところで今回は、CheckBox がチェックされた場合、つまり値が True の場合に、非表示(つまり Visible = False )となります。CheckBox の値とシートの表示状態は、True と False が逆転しているため、Not cb.Value としました。
次に標準モジュール側へ、次のように記述します。
Public cl() As CBEventControl Sub Auto_Open() Call CheckBox_Set End Sub Sub CheckBox_Set() Dim iMax As Long iMax = ActiveSheet.OLEObjects.Count ReDim cl(1 To iMax) Dim i As Long Dim OLEObj As OLEObject i = 1 For Each OLEObj In ActiveSheet.OLEObjects If TypeName(OLEObj.Object) = "CheckBox" Then Set cl(i) = New CBEventControl Set cl(i).cb = OLEObj.Object i = i + 1 End If Next End Sub
各 CheckBox を Set するために、配列 cl を設けました。インデックス番号の最大値は、シート内にある OLEObject 全ての数としています。この時点で、OLEObject が CheckBox かどうかは気にしていません。とにかく箱を準備することが目的なので。
最後に、シート内の OLEObject 全てに対して、それが CheckBox である場合に限り、変数 cl にセットしていきます。セットし終われば完了です。後は、どの CheckBox がクリックされても、全て cb_click が拾ってくれます。
繰り返しになりますが、この方式には前述の二つの条件を満たさなければならないという課題があります。CheckBox とシートを名前以外で紐づけることが出来れば解消できるかもしれませんが、今のところ思いつけませんでした。
個人的には、この方式も割と好みだったりします。管理の煩雑さがある一方で、名前をキッチリ管理してシステムに編み込んでいく楽しさのようなものがあるからです。
ただし、
- CheckBox の増減にマクロの知識が必要
- 名前を管理する時間も「コスト」であること
などを考えると、最終的に「今回のケース」では採用しないかもしれません。
・・・次回に続く(かもしれない)。
参考まで。