シートの表示/非表示をもっと簡単に の続きの続き
昨日はシートの表示/非表示を、チェックボックスを用いてコントロールする方法を
紹介しました。
infoment.hatenablog.com
このテーマについては更に、はたけさんから Worksheet の Change イベントを用いた
別解を紹介いただきました。
www.excelspeedup.com
またthomさんからは、シート名に紐づく CheckBox を自動生成することで、シート名と CheckBox の整合性を保つコードを紹介していただきました。
このように様々な手法や考え方に触れることは興味深く大変刺激的で、とても勉強になります。お二人とも、ありがとうございます。
さて一昨日の顛末として、依頼者に見せたところ次のような遣り取りになりました。
「こんな感じで、どうです?」
「お~、良い感じですね!じゃあ、こんなことはできませんか?」
「というと?」
「これでシート名を選択して、そのシートに移動できないでしょうか?」
リスト内のシート名を選択して非表示化している関係上、リストボックスで選択した
シートには移動しようがありません。さて、どうしたものか・・・。
考えあぐねた結果、結局この時は安直に、リストボックスを二つ並べることにしました。
二つ目(右側)のリストボックスには、表示中のシート名のみ表示されます。そして、
同シート名を選択すると、そのシートに移動する仕掛けになっています。
Dim Lb(2) As Object Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Dim i As Long Lb(2).Clear For i = 0 To Lb(1).ListCount - 1 If Lb(1).Selected(i) = True Then Sheets(Lb(1).List(i)).Visible = False Else Sheets(Lb(1).List(i)).Visible = True Lb(2).AddItem Lb(1).List(i) End If Next End Sub Private Sub ListBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) On Error GoTo er: Sheets(Lb(2).List(Lb(2).ListIndex)).Select Exit Sub er: MsgBox "シート名が正しく選択されていません。" End Sub Private Sub Worksheet_Activate() Dim Ws As Worksheet Set Lb(1) = ActiveSheet.OLEObjects("ListBox1").Object Set Lb(2) = ActiveSheet.OLEObjects("ListBox2").Object Lb(1).Clear Lb(2).Clear For Each Ws In Worksheets If Ws.Name <> "Sheet1" Then Lb(1).AddItem Ws.Name If Ws.Visible = False Then Lb(1).Selected(Lb(1).ListCount - 1) = True Else Lb(2).AddItem Ws.Name End If End If Next End Sub
シートが表示されている場合に限り、ListBox2 にシート名を追加していきます。非表示のシート名は現れないため、移動可能なシートのみ選択できる訳です。
なお、MouseUpのイベントでは、項目を選択できていない場合も「マウスがクリックされてボタンが上がった」ことに変わりはないため、シート名が空っぽの状態で移動しようとします。これではエラーになるため、メッセージを表示して再選択を促しています。
リストボックスを二つ並べるのは、あまりスマートな方法とは言えないかもしれません。ただ、直感的に理解しやすいということで、今回は採用されたのでした。
参考まで。