すべてのシートを一発で再表示するマクロを紹介します。
アクティブブックに実行するコードを用意しておき、
ツールバーやショートカットキーに登録しておけば、
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を出す/出さないを、呼び出し元で選択できるようにするのがおすすめです。