【VBA】シートの非表示・再表示を一括で切り替える方法(コピペOK)

VBA
スポンサーリンク

記事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

スポンサーリンク
  1. この記事でわかること
    1. どんな場面で使う?
  2. 完成イメージ(Before / After)
  3. 実行前の準備
    1. バックアップを取る
    2. Excelをマクロ有効ブック(.xlsm)で保存する
  4. 手順(コピペ → 実行まで約5分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  5. コード(最小版)– 指定シート以外を一括非表示にする
    1. 一括再表示コード(セットで使う)
    2. 書き換えポイント
  6. コード(実務版)– シート名リストで非表示・再表示・VeryHiddenを一括制御
    1. 一括再表示コード(実務版 — セットで使う)
    2. 書き換えポイント
    3. xlSheetHidden と xlSheetVeryHidden の使い分け
  7. よくある落とし穴5選
    1. 1. 全シート非表示でエラー1004が発生する
    2. 2. xlSheetVeryHiddenにしたシートが「再表示」に出てこない
    3. 3. シート名の指定ミスで「インデックスが有効範囲にありません」エラー
    4. 4. ブックの構造保護がかかっていて非表示にできない
    5. 5. ActiveWorkbookとThisWorkbookを間違えて別のブックを操作してしまう
    6. VBAでシートを非表示にしたら全シート非表示エラーが出るときの対処法
    7. VBAでxlSheetVeryHiddenにしたシートが再表示できないときの対処法
  8. FAQ
    1. Q1: xlSheetHiddenとxlSheetVeryHiddenの違いは?
    2. Q2: 非表示にしたシートのデータは削除される?
    3. Q3: 非表示シートの一覧を確認する方法は?
    4. Q4: 保護されたシートでも非表示にできる?
    5. Q5: シートの非表示状態を保存するには?
  9. まとめ
    1. 関連記事
  10. 次にやりたくなること

この記事でわかること

  • 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 のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. 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 非表示の種類 通常の非表示(右クリックで再表示可能)

ポイント: xlSheetHiddenxlSheetVeryHidden に変えると、右クリックメニューの「再表示」に出てこない完全な非表示になる。一般ユーザーが勝手に戻せないので、マスタデータを隠す用途に使える。

シート名の取得・確認方法は シート名の取得・一括変更・存在チェックする方法 を参照。

コード(実務版)– シート名リストで非表示・再表示・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 非表示の種類 xlSheetHiddenxlSheetVeryHidden に変更可)

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 = -1xlSheetHidden = 0xlSheetVeryHidden = 2

Q4: 保護されたシートでも非表示にできる?

できる。シート保護(Protect)と表示状態(Visible)は独立したプロパティなので、保護中のシートでも Visible の変更は可能。ただし、ブックの構造保護(Protect Structure)がかかっている場合は、先にブック保護を解除する必要がある。

Q5: シートの非表示状態を保存するには?

ブックを保存すれば、シートの表示状態もそのまま保存される。.xlsm で保存すればマクロも含めて保存される。マクロなしの .xlsx で保存した場合も表示状態は保持されるが、再表示用のマクロは失われるので注意。

まとめ

  • xlSheetVisible(-1): 表示状態
  • xlSheetHidden(0): 通常の非表示(右クリックで再表示可能)
  • xlSheetVeryHidden(2): 完全な非表示(VBA/VBEでのみ再表示可能)
  • 全シート非表示はエラー: 最低1枚は表示状態にしておく
  • 非表示と再表示はセットで用意: 特にxlSheetVeryHiddenは戻し方も必ず併記する

関連記事

次にやりたくなること

コメント

タイトルとURLをコピーしました