ワークシートの表示/非表示をVBAから切り替える方法を解説します。
WorksheetオブジェクトのVisibleプロパティを使用します。
シートを非表示にする
シートを非表示にするには以下のコードを実行します。
Worksheets("○○").Visible = False ' または Worksheets("○○").Visible = xlSheetHidden
WorksheetオブジェクトのVisibleプロパティを変更することで、
シートの非表示/表示状態を変更することができます。
代入できる値は以下の3種類です。
| 定数名 | 値 | 状態 |
|---|---|---|
| xlSheetVisible | -1 [True] | 表示 |
| xlSheetHidden | 0 [False] | 非表示 |
| xlSheetVeryHidden | 2 | 非表示(Excel上で再表示不可) |
通常の表示/非表示の定数値には「-1/0」が割り当てられているため、
上記コードの通り代入はTrue/Falseで行うことが可能です。
両者の実行内容に違いはなくコードも直感的でわかりやすいので、
わざわざ定数名を使わず、True/Falseで設定してOKです。
シートを再表示する
シートを再表示する場合は以下のコードを実行します。
Worksheets("○○").Visible = True ' または Worksheets("○○").Visible = xlSheetVisible
このコードは既に表示されているシートに対して実行してもエラーになりません。
よって「ブック内の全シートを表示するコード」は、
以下のように簡潔に書くことができます。
Sub すべてのシートを表示する() Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ws.Visible = True Next End Sub
Excel上で再表示できない非表示シートにする
上記の通りVisibleプロパティの設定には第3の値があり、
xlSheetVeryHiddenを設定することもできます。
この設定で非表示にしたシートはExcelのUI上で再表示できません。
- 非表示シートがひとつしかない場合は「再表示」自体がグレーアウト
- 他の非表示シートがある場合は「再表示」のリストは開けるが、
そのリスト内にVeryHiddenにしたシートは表示されない
この状態は保存することが可能ですので、
マクロでしか編集できないシートを設定することができます。
※ 同じような機能として、シートの保護「Protectメソッド」に、
ユーザー操作のみ禁止するUserInterfaceOnlyがありますが、
こちらは保存ができないためブックを開くたびに実行する必要があります。
Worksheet.Visibleがエラーとなる場合
Visibleプロパティを変更する際の主なエラーは以下の2つです。
ブックすべてのシートを非表示にはできない
ブック内のすべてのシートを非表示にすることはできないため、
最後の1枚を非表示にしようとしたとき、
| 実行時エラー '1004': Worksheet クラスの Visible プロパティを設定できません。 |
エラーとなります。
ブックの保護がかかっている場合は表示を変更できない
ブックの保護がかかっている場合もVisibleプロパティは変更できず、
| 実行時エラー '1004': Worksheet クラスの Visible プロパティを設定できません。 |
エラーとなります。
一旦保護を解除し、処理後に戻すようなコードを書いて対応してください。
' 非表示シートをコピーするために一旦表示するコード ThisWorkbook.Unprotect Worksheets("○○").Visible = True Worksheets("○○").Copy Worksheets("○○").Visible = False ThisWorkbook.Protect
シートの表示状態を調べる
Visibleはプロパティですので、もちろん読み取ることも可能です。
シートが表示されているかを判定するには以下のコードを使用します。
If Worksheets("○○").Visible = True Then
例えば「ブック内の表示シートのみをループする」場合は、
以下のようなFor Each文を使用すればOKです。
Sub 表示されているシートのみを処理する() Dim 処理シート As Worksheet For Each 処理シート In ThisWorkbook.Worksheets If 処理シート.Visible = True Then ' ここに表示シートへの処理 Debug.Print 処理シート.Name End If Next End Sub