記事ID: 120
タイトル: シートの非表示・再表示をVBAで一括制御する方法
カテゴリ: シート操作
一次キーワード: VBA シート 非表示 表示 一括
想定読者: シートが多いブックで非表示・再表示を手作業で繰り返している実務担当者
検索意図: VBAで複数シートの非表示・再表示を一括で切り替えたい
読者の悩み(1文): シートが多いブックで、非表示・再表示を1枚ずつ右クリックで切り替えるのが面倒で時間がかかる。
読了後にできること(1文): VBAでシートの非表示・再表示(xlSheetHidden / xlSheetVeryHidden / xlSheetVisible)を一括制御できるようになる。
前提条件:
- Excel版: Excel 2016以降 / Microsoft 365
- OS: Windows 10/11
- 保存形式: .xlsm(マクロ有効ブック)
- 貼り付け場所: 標準モジュール
- 実行方法: Alt+F8 → マクロ実行 / ボタン割り当て
更新日: 2026-03-18
—
この記事でわかること
- VBAでシートの非表示・再表示を一括で切り替えられる
xlSheetHidden(通常の非表示)とxlSheetVeryHidden(右クリックでも戻せない完全非表示)を使い分けられる- 「全シート非表示エラー」を回避しながら安全に一括操作できる
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
どんな場面で使う?
- 月次報告ブックで提出前に不要シートを一括非表示にしたいとき
- xlSheetVeryHiddenで一般ユーザーからマスタシートを完全に隠したいとき
- 非表示忘れで社外に内部シートを送ってしまうリスクを防ぎたいとき
- ボタン1つで提出用と作業用のシート表示を切り替えたいとき
—
完成イメージ(Before / After)
Before(手作業): シートタブを1枚ずつ右クリック →「非表示」を繰り返す。10枚あれば10回。再表示も1枚ずつ。
After(VBA実行後): ボタン1つで「見せたいシート」だけ表示、残りは一括非表示。再表示もボタン1つで元通り。
—
自分も以前、月次報告用のブックにシートが20枚以上あって、提出前に「見せたくないシート」を1枚ずつ右クリック → 非表示にしていた。毎月これだけで10分以上。しかも一度、非表示にし忘れたまま社外に送りそうになって正直ヒヤッとした。VBAで一括非表示にするようにしてからは、ボタン1つで提出用の状態が作れるようになった。非表示忘れの心配もなくなった。同じように「毎回シートを隠す手間」に悩んでいる人が、この記事でサクッと自動化できればうれしい。
VBAの
Visibleプロパティを使えば、シートの非表示・再表示を一括で制御できる。
なお、複数シートにまとめて同じ処理を実行するFor Eachループの基本は 複数シートに同じ処理を一括実行する方法 を参照。
—
実行前の準備
バックアップを取る
シートの表示状態を変更する操作です。データは消えませんが、全シート非表示にしようとするとエラーが出るため、念のためファイルのコピーを別フォルダに保存してから実行してください。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
Alt + F8→ マクロ名を選んで「実行」
ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。
—
コード(最小版)– 指定シート以外を一括非表示にする
「メイン」シートだけ表示して、それ以外を全部非表示にする。まずはこれで動きを確認する。
'============================================================
' ■ 指定シート以外を一括非表示にする(最小版)
' → 「メイン」シートだけ残して、他を全部非表示
'============================================================
Sub HideSheetsExceptMain()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Name = "メイン" Then
ws.Visible = xlSheetVisible '← 表示のまま
Else
ws.Visible = xlSheetHidden '← 非表示にする
End If
Next ws
MsgBox "「メイン」以外を非表示にしました。", vbInformation
End Sub
一括再表示コード(セットで使う)
'============================================================
' ■ 全シートを一括再表示する(最小版)
' → 非表示にしたシートをすべて表示に戻す
'============================================================
Sub ShowAllSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws
MsgBox "全シートを表示に戻しました。", vbInformation
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
ws.Name = "メイン" |
表示のまま残すシート名 | "メイン" を自分のシート名に変更 |
xlSheetHidden |
非表示の種類 | 通常の非表示(右クリックで再表示可能) |
ポイント: xlSheetHidden を xlSheetVeryHidden に変えると、右クリックメニューの「再表示」に出てこない完全な非表示になる。一般ユーザーが勝手に戻せないので、マスタデータを隠す用途に使える。
シート名の取得・確認方法は シート名の取得・一括変更・存在チェックする方法 を参照。
—
コード(実務版)– シート名リストで非表示・再表示・VeryHiddenを一括制御
実務では「非表示にするシート」が固定ではないことが多い。シート名を配列で指定し、非表示の種類も選べるようにした版。エラー処理付き。
この方法を覚えてからは、報告書ブックに「提出用に整える」ボタンと「編集用に戻す」ボタンを付けて運用している。誰が操作しても同じ状態になるので、引き継ぎも楽になった。
※ シートの表示状態が変更されます。実行前にバックアップを取ってください。
'============================================================
' ■ シート名リストで一括非表示にする(実務版)
' → 配列に指定したシートを非表示にする
' → 非表示の種類: xlSheetHidden / xlSheetVeryHidden を選択可
' → エラー処理: 全シート非表示防止 / 存在しないシート名スキップ
'============================================================
Sub HideSheetsByList()
'--- ★書き換えポイント ---
'非表示にしたいシート名を配列で指定
Dim hideNames As Variant
hideNames = Array("作業用", "マスタ", "計算シート", "ログ")
'非表示の種類を選ぶ(xlSheetHidden または xlSheetVeryHidden)
Dim hideType As Long
hideType = xlSheetHidden '← xlSheetVeryHidden に変えると完全非表示
'--- ★ここまで ---
Dim ws As Worksheet
Dim targetWs As Worksheet
Dim visibleCount As Long
Dim hideCount As Long
Dim skipList As String
'--- 現在の表示シート数を数える
visibleCount = 0
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVisible Then
visibleCount = visibleCount + 1
End If
Next ws
'--- 非表示対象をループ
hideCount = 0
Dim i As Long
For i = LBound(hideNames) To UBound(hideNames)
'--- 表示シートが1枚しか残っていなければ中断
If visibleCount <= 1 Then
MsgBox "表示シートが1枚しか残っていないため、" & vbCrLf & _
"これ以上非表示にできません。" & vbCrLf & _
hideCount & " 枚を非表示にしました。", vbExclamation
Exit Sub
End If
'--- シートの存在チェック
Set targetWs = Nothing
On Error Resume Next
Set targetWs = ThisWorkbook.Worksheets(hideNames(i))
On Error GoTo 0
If targetWs Is Nothing Then
'--- シートが見つからない場合はスキップ
skipList = skipList & " - " & hideNames(i) & "(見つかりません)" & vbCrLf
ElseIf targetWs.Visible <> xlSheetVisible Then
'--- 既に非表示のシートはスキップ
skipList = skipList & " - " & hideNames(i) & "(既に非表示)" & vbCrLf
Else
targetWs.Visible = hideType
hideCount = hideCount + 1
visibleCount = visibleCount - 1
End If
Next i
'--- 結果報告
Dim msg As String
msg = hideCount & " 枚のシートを非表示にしました。"
If Len(skipList) > 0 Then
msg = msg & vbCrLf & vbCrLf & "【スキップ】" & vbCrLf & skipList
End If
MsgBox msg, vbInformation
End Sub
一括再表示コード(実務版 — セットで使う)
'============================================================
' ■ 非表示シートを一括再表示する(実務版)
' → xlSheetHidden / xlSheetVeryHidden のシートも含めて全て再表示
'============================================================
Sub ShowAllSheetsEx()
Dim ws As Worksheet
Dim showCount As Long
showCount = 0
For Each ws In ThisWorkbook.Worksheets
If ws.Visible <> xlSheetVisible Then
ws.Visible = xlSheetVisible
showCount = showCount + 1
End If
Next ws
If showCount = 0 Then
MsgBox "非表示のシートはありませんでした。", vbInformation
Else
MsgBox showCount & " 枚のシートを再表示しました。", vbInformation
End If
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
hideNames |
非表示にするシート名の配列 | Array("作業用", "マスタ", "計算シート", "ログ") |
hideType |
非表示の種類 | xlSheetHidden(xlSheetVeryHidden に変更可) |
xlSheetHidden と xlSheetVeryHidden の使い分け
| 項目 | xlSheetHidden | xlSheetVeryHidden |
|---|---|---|
| 値 | 0 | 2 |
| 右クリック「再表示」 | 表示される(戻せる) | 表示されない(戻せない) |
| VBAで再表示 | できる | できる |
| VBEのプロパティで再表示 | できる | できる |
| 用途 | 一時的な非表示(提出用整理など) | マスタデータ・計算シートの保護 |
xlSheetVeryHiddenの注意: 右クリックでは戻せないため、再表示コード(ShowAllSheetsEx)を必ずセットで用意しておくこと。コードを消してしまうとVBEのプロパティウィンドウから手動で戻すしかなくなる。
シートの保護と組み合わせたい場合は 特定シートだけ保護・解除する方法 を参照。さらにパスワードで二重防御したい場合は ブックにパスワードを自動で設定・解除する方法 が参考になる。
—
よくある落とし穴5選
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 全シート非表示でエラー1004 | Excelの仕様で表示シートが最低1枚必要 | 「残すシート」をスキップ or visibleCountでチェック |
| 2 | VeryHiddenシートが「再表示」に出ない | xlSheetVeryHiddenの仕様 | VBAコード or VBEプロパティで戻す |
| 3 | シート名指定で「インデックスが有効範囲にありません」 | シート名の全角半角・スペース違い | On Error Resume Nextで存在チェック |
| 4 | ブック構造保護でVisibleを変更できない | Protect Structureが有効 | ThisWorkbook.Unprotectで先に解除 |
| 5 | 別のブックのシートを操作してしまった | ActiveWorkbookとThisWorkbookの混同 | ThisWorkbookを明示 |
1. 全シート非表示でエラー1004が発生する
自分もこれでハマった。テスト用に全シートを非表示にしようとしたら「ブックには、少なくとも1つの表示されているシートが必要です」というエラー(実行時エラー1004)で止まった。最低1枚は表示状態にしないといけないことを知らなくて、原因に気づくまで無駄に悩んだ。
原因: Excelの仕様で、ブック内に表示シートが最低1枚は必要。全シートを非表示にする操作はExcelが拒否する。
対策: ループ前に「残すシート」を先に表示状態にするか、実務版コードのようにvisibleCountで残り枚数をチェックしてから非表示にする。
2. xlSheetVeryHiddenにしたシートが「再表示」に出てこない
原因: xlSheetVeryHidden で非表示にしたシートは、シートタブの右クリック →「再表示」の一覧に表示されない。これはExcelの仕様。
対策: VBAコード(ws.Visible = xlSheetVisible)で戻すか、VBE(Alt+F11)→ プロジェクトエクスプローラーでシートを選択 → プロパティウィンドウの Visible を -1 - xlSheetVisible に変更する。VeryHiddenにする場合は、必ず再表示用のコードもセットで用意する。
3. シート名の指定ミスで「インデックスが有効範囲にありません」エラー
原因: Worksheets("シート1") のように指定したシート名が、実際のシート名と1文字でも違うとエラーになる。全角スペース、半角スペース、前後の空白が原因になりやすい。
対策: 実務版コードのように On Error Resume Next でシートの存在をチェックしてからVisibleを変更する。
4. ブックの構造保護がかかっていて非表示にできない
原因: ブックの「構造の保護」(Protect Structure)がオンになっていると、シートの表示/非表示/追加/削除が制限される。
対策: ThisWorkbook.Unprotect でブック保護を解除してから操作する。パスワード付きの場合は ThisWorkbook.Unprotect Password:="パスワード" が必要。
5. ActiveWorkbookとThisWorkbookを間違えて別のブックを操作してしまう
原因: ActiveWorkbook は「今アクティブなブック」を指すため、複数ブックを開いている場合に意図しないブックのシートを非表示にしてしまうことがある。
対策: マクロが書かれているブックを操作する場合は ThisWorkbook を使う。別のブックを操作する場合は Workbooks("ファイル名.xlsx") で明示的に指定する。
—
VBAでシートを非表示にしたら全シート非表示エラーが出るときの対処法
「全シートを非表示にしようとしてエラーが出た」という場合、原因はExcelの仕様で最低1枚のシートを表示状態にしておく必要があるためだ。ループ処理の前に必ず1枚を表示状態に固定し、残りを非表示にする。
VBAでxlSheetVeryHiddenにしたシートが再表示できないときの対処法
「右クリックの再表示メニューに出てこない」という場合、それは正常動作だ。xlSheetVeryHiddenはVBAかVBEのプロパティウィンドウからしか再表示できない。VBAで Sheets("シート名").Visible = xlSheetVisible を実行する。
FAQ
Q1: xlSheetHiddenとxlSheetVeryHiddenの違いは?
最大の違いは「右クリックで再表示できるかどうか」。
xlSheetHidden: シートタブの右クリック →「再表示」で元に戻せる。一時的にシートを隠したい場合に使うxlSheetVeryHidden: 右クリックの「再表示」一覧に出てこない。VBAまたはVBEでしか戻せない。マスタデータや計算シートを一般ユーザーから完全に隠したい場合に使う
Q2: 非表示にしたシートのデータは削除される?
されない。非表示はあくまで「見えなくする」だけで、データはそのまま残る。他のシートからの数式参照(=作業用!A1 など)もそのまま動く。
Q3: 非表示シートの一覧を確認する方法は?
以下のコードをイミディエイトウィンドウ(VBEで Ctrl+G)に貼り付けて Enter を押すと、全シートの表示状態が出力される。イミディエイトウィンドウではOption Explicitが適用されないため、変数宣言なしで実行できる。
For Each ws In ThisWorkbook.Worksheets: Debug.Print ws.Name, ws.Visible: Next
出力例: xlSheetVisible = -1、xlSheetHidden = 0、xlSheetVeryHidden = 2
Q4: 保護されたシートでも非表示にできる?
できる。シート保護(Protect)と表示状態(Visible)は独立したプロパティなので、保護中のシートでも Visible の変更は可能。ただし、ブックの構造保護(Protect Structure)がかかっている場合は、先にブック保護を解除する必要がある。
Q5: シートの非表示状態を保存するには?
ブックを保存すれば、シートの表示状態もそのまま保存される。.xlsm で保存すればマクロも含めて保存される。マクロなしの .xlsx で保存した場合も表示状態は保持されるが、再表示用のマクロは失われるので注意。
—
まとめ
- xlSheetVisible(-1): 表示状態
- xlSheetHidden(0): 通常の非表示(右クリックで再表示可能)
- xlSheetVeryHidden(2): 完全な非表示(VBA/VBEでのみ再表示可能)
- 全シート非表示はエラー: 最低1枚は表示状態にしておく
- 非表示と再表示はセットで用意: 特にxlSheetVeryHiddenは戻し方も必ず併記する
関連記事
- 複数シートに同じ処理を一括実行する方法 — For Eachでシートをループする基本技術
- 特定シートだけ保護・解除する方法 — 非表示+保護で二重のセキュリティ
- ブックにパスワードを自動で設定・解除する方法 — さらにパスワードで三重防御
- エラー処理(On Error)で止まらないマクロを作る方法 — 存在しないシート名のエラー回避
- 画面更新・再計算を止めてマクロを高速化する方法 — 大量シート処理の高速化
—
次にやりたくなること
- 複数シートに同じ処理を一括実行する方法: 非表示/再表示だけでなく一括で書式設定や印刷設定を適用したい場合
- 特定シートだけ保護・解除する方法: 非表示+シート保護で二重のセキュリティをかけたい場合
- ブックにパスワードを自動で設定・解除する方法: さらにパスワードで三重の保護をかけたい場合


コメント