[VBA] Excelの複数シートをループを使わず一行の処理で非表示・再表示にすることはできる??
概要
この記事について
Excelのシートに対する一括処理は、
次のようにシート名の配列としてSheetsオブジェクトを生成することで
ループを使わず一行の処理で実装することが可能。
1'社員シートと勤怠シートをまとめて削除する
2Call Sheets(Array("社員", "勤怠")).Delete
このようにして、
複数のシートの非表示・再表示(Visibleプロパティの変更)を、
ループを使わず一行の処理でできるかどうか?という命題がある。
探したけれど、これについて言及している日本語サイトは存在しなかったので、
検証した結果を記したい。
ちなみにstackoverflowなどには
これについていくつか記事が存在した。
- https://stackoverflow.com/questions/55776641/excel-vba-unhiding-sheets-in-array-run-time-error-13-type-mismatch
- https://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-msoffice_custom-mso_2007/hide-and-unhide-and-array-of-worksheets/d9e14ebe-eb5f-4339-bff8-8354afe79b64?auth=1
検証
非表示にすることはできる?
問題なくできる。
1Sub hideSheetArray()
2 ActiveWorkbook.Sheets(Array("accounting", "finance")).Visible = False
3End Sub
上の関数は、
現在開いているブックのaccountingシートとfinanceシートを非表示にする。
再表示することはできる?
こちらは できない 。
1Sub unHideSheetArray_notWorking()
2 ActiveWorkbook.Sheets(Array("accounting", "finance")).Visible = True
3End Sub
UI上でも再表示は一つずつしかできないので、
Visibleプロパティの特徴と考えるしかなさそう。

一括で再表示にするにはループを使うしかない
残念ながらそのようである。
1Sub unHideSheetArray()
2 Dim sh As Worksheet
3
4 For Each sh In ActiveWorkbook.Sheets(Array("accounting", "finance"))
5 sh.Visible = True
6 Next sh
7
8End Sub
関連記事
- [VBA] ブック内の図形内のテキストを検索・置換するマクロ(Qiitaの記事の拡張)
- [VBA] 関数の引数を変更した場合にコンパイルエラーが多発するのを防ぐテクニック
- [VBA] 例外処理の典型的なパターン&使用例サンプル
- [VBA] クラスを利用するメリットと方法について & 簡単なサンプル(1)
- [Excel VBA] 個人的に作業がはかどった自作Excelショートカット