和風スパゲティのレシピ

日本語でコーディングするExcelVBA

すべてのシートを一括で再表示するマクロ

すべてのシートを一発で再表示するマクロを紹介します。


アクティブブックに実行するコードを用意しておき、
ツールバーやショートカットキーに登録しておけば、
xlsxファイル含めてどんなブックにも実行できるようになり便利です。

Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。

アクティブブックのすべてのシートを再表示する

ソースコード

Sub アクティブブックのすべてのシートを再表示する()

    If ActiveWorkbook.ProtectStructure = True Then
        MsgBox "保護されたブックには実行できません。"
        Exit Sub
    End If

    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        ws.Visible = True
    Next
    
End Sub

解説

コードの中身は単純で、For Each ステートメントですべてのシートをループして、
ワークシート.Visible = True によって再表示していくコードです。


.Visible = True は既に表示されたシートに対しても実行できるため、
現在表示されているかどうかを調べる必要はありません。


ただし、「ブックの保護」がかかっている場合は、
シートの表示/非表示/削除/追加/並び替えができないため、
.Visible = True はエラーになってしまします。

それを回避するために、メインコードのForEach文に入る前に、
ワークブック.ProtectStructureでブックの保護を判定しています。


もしブックの保護を解除して強制的に実行したいときは、
↓以下の通り、Unprotectメソッドを実行してからメインコードに入ればOKです。

Sub アクティブブックのすべてのシートを再表示する()

    ActiveWorkbook.Unprotect

    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        ws.Visible = True
    Next
    
End Sub

UnprotectメソッドもVisible=Trueと同様、
保護されていないブックに実行してもエラーにはなりませんので、
特に判定なく実行して問題ありません。
(パスワードがかかっていればもちろん失敗しますが)


ブックの保護についてはこちらご参考ください。
www.limecode.jp

イミディエイトウィンドウを活用する

上記のマクロをツールバーに設置しておけば、
xlsxファイルも含めてどんなファイルにも使用できます。


また同様に「すべてのブックで利用可能」な便利マクロとして使用する方法として、
イミディエイトウィンドウを活用する方法もあります。


Ctrl+Gなどでイミディエイトウィンドウを開き、

For Each ws in Worksheets:ws.Visible=True:Next

このコードを実行すると、すべてのシートを再表示することができます。


「:」で1行にしているだけで、コードの中身は前述のコードのそのままですね。


あとはこのコードをユーザー辞書に変換登録しておけば、
イミディエイトウィンドウを開いてサッと実行することができます。

こちらの方法も覚えておくとよいでしょう。

指定ブックのすべてのシート再表示するマクロ

ツールバーにセットして実行する便利マクロではなく、
他のマクロに組み込んで使用したい場合は、
以下のようにコードを書き換えてください。

' 関数化
Sub 指定ブックのすべてのシートを再表示する(指定ブック As Workbook)
    Dim ws As Worksheet
    For Each ws In 指定ブック.Worksheets
        ws.Visible = True
    Next
End Sub
' 実行例

' マクロを実行しているブックの全シートを再表示
Call 指定ブックのすべてのシートを再表示する(ThisWorkbook)

' ブックを指定して全シートを再表示
Call 指定ブックのすべてのシートを再表示する(Workbooks("Book1.xlsx"))

' 関数化していれば冒頭の便利マクロをこう書くこともできる
If ActiveWorkbook.ProtectStructure = True Then
    MsgBox "保護されたブックには実行できません。"
Else
    Call 指定ブックのすべてのシートを再表示する(ActiveWorkbook)
End If

指定ブックの全シートを再表示する場合は、
冒頭のコードを引数「指定ブック」に実行するよう書き換えればOKです。

この関数を用意しておけば、あとはブックを渡すだけでこの処理を実行できるようになります。


単純なFor Each文でも、書くとなると結構面倒ですので、
こういった処理をよく行う場合は、関数化して持っておきましょう。


なお、こういった関数にMsgBoxを入れると使いづらくなります。

実行例の通り、関数化した場合は判定は関数の外で行い、
MsgBoxを出す/出さないを、呼び出し元で選択できるようにするのがおすすめです。