シートの表示/非表示をもっと簡単に の続きの続き

昨日はシートの表示/非表示を、チェックボックスを用いてコントロールする方法を
紹介しました。
infoment.hatenablog.com

このテーマについては更に、はたけさんから Worksheet の Change イベントを用いた
別解を紹介いただきました。
www.excelspeedup.com

またthomさんからは、シート名に紐づく CheckBox を自動生成することで、シート名と CheckBox の整合性を保つコードを紹介していただきました。

このように様々な手法や考え方に触れることは興味深く大変刺激的で、とても勉強になります。お二人とも、ありがとうございます。


さて一昨日の顛末として、依頼者に見せたところ次のような遣り取りになりました。

「こんな感じで、どうです?」
「お~、良い感じですね!じゃあ、こんなことはできませんか?」
「というと?」
「これでシート名を選択して、そのシートに移動できないでしょうか?」
リスト内のシート名を選択して非表示化している関係上、リストボックスで選択した
シートには移動しようがありません。さて、どうしたものか・・・。


考えあぐねた結果、結局この時は安直に、リストボックスを二つ並べることにしました。

f:id:Infoment:20180725001151p:plain

二つ目(右側)のリストボックスには、表示中のシート名のみ表示されます。そして、
同シート名を選択すると、そのシートに移動する仕掛けになっています。

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 にシート名を追加していきます。非表示のシート名は現れないため、移動可能なシートのみ選択できる訳です。

f:id:Infoment:20180725002112p:plain

なお、MouseUpのイベントでは、項目を選択できていない場合も「マウスがクリックされてボタンが上がった」ことに変わりはないため、シート名が空っぽの状態で移動しようとします。これではエラーになるため、メッセージを表示して再選択を促しています。

リストボックスを二つ並べるのは、あまりスマートな方法とは言えないかもしれません。ただ、直感的に理解しやすいということで、今回は採用されたのでした。

参考まで。