Excel VBA 逆引き集 | 隠しシート

Excel VBA
スポンサーリンク

ねらい:隠しシートを安全・計画的に扱う

業務ブックでは「見せたくない設定シート」「中間計算の結果」「操作ミスを防ぐための非表示」など、隠しシートの活用が欠かせません。初心者が混乱しやすいポイントは「通常の非表示」と「完全非表示(VeryHidden)」の違いと、解除・再設定の順序です。ここでは、現場で使える隠しシートのテンプレを、重要部分を深掘りして説明します。

  • 基本の考え方:
    • ラベル: 可視性は3段階(Visible / Hidden / VeryHidden)。
    • 要点: VeryHiddenはユーザーの「再表示」操作では戻せない。VBAからのみ制御可能。
    • 順序: 隠す前に保護・案内、解除する時は保護解除→表示→必要な調整→再保護。

可視性の種類(Visible/Hidden/VeryHidden)

  • Visible: 通常表示。ユーザーが閲覧・編集可能。
  • Hidden: 非表示。ユーザーが「再表示」で戻せる。
  • VeryHidden: 完全非表示。ユーザー操作では戻せない(VBAでのみ可)。
' 可視性の設定例
Sub SetVisibility()
    Dim ws As Worksheet: Set ws = Worksheets("Config")
    ws.Visible = xlSheetVisible     ' 表示
    ws.Visible = xlSheetHidden      ' 非表示(再表示可能)
    ws.Visible = xlSheetVeryHidden  ' 完全非表示(VBAからのみ戻せる)
End Sub
VB
  • 重要ポイント(深掘り):
    • VeryHiddenの強み: 誤操作や閲覧防止に有効。ただし「セキュリティ機能」ではない。マクロが動作すれば表示可能。
    • Hiddenとの違い: Hiddenはユーザーが再表示できるため、閲覧制御には向かない。

基本テンプレ:一括で隠す・再表示する

' 指定シート群を一括で隠す(Hidden)
Sub HideSheets()
    Dim names As Variant: names = Array("Config", "Lookup", "Log")
    Dim i As Long
    For i = LBound(names) To UBound(names)
        Worksheets(CStr(names(i))).Visible = xlSheetHidden
    Next
    MsgBox "指定シートを非表示にしました。"
End Sub

' 指定シート群を一括で再表示
Sub UnhideSheets()
    Dim names As Variant: names = Array("Config", "Lookup", "Log")
    Dim i As Long
    For i = LBound(names) To UBound(names)
        Worksheets(CStr(names(i))).Visible = xlSheetVisible
    Next
    MsgBox "指定シートを再表示しました。"
End Sub
VB
  • 重要ポイント(深掘り):
    • 名前の管理: 配列で一元管理。増減・順序変更が簡単。
    • 可視性のポリシー: 一般ユーザー向けはHidden、管理用はVeryHiddenに分けると運用が明確。

運用向け:VeryHiddenへの切替と戻し

' 管理者のみ使う設定シートをVeryHiddenへ
Sub ProtectConfigSheets()
    Dim names As Variant: names = Array("Config", "Secrets")
    Dim i As Long
    For i = LBound(names) To UBound(names)
        Worksheets(CStr(names(i))).Visible = xlSheetVeryHidden
    Next
    MsgBox "設定シートを完全非表示(VeryHidden)にしました。"
End Sub

' 作業前に一時的に表示(管理者操作)
Sub RevealConfigSheets()
    Dim names As Variant: names = Array("Config", "Secrets")
    Dim i As Long
    For i = LBound(names) To UBound(names)
        Worksheets(CStr(names(i))).Visible = xlSheetVisible
    Next
    MsgBox "設定シートを一時的に表示しました。"
End Sub
VB
  • 重要ポイント(深掘り):
    • 管理フロー: 作業時だけ表示→編集→即VeryHiddenへ戻す。
    • パスや権限の補助: シート保護や操作ログと併用すると品質が上がる。

一覧・判定:隠しシートを列挙して可視性を確認

' 隠しシートの一覧をLogシートへ出力
Sub ListHiddenSheets()
    Dim wsLog As Worksheet: Set wsLog = Worksheets("Log")
    Dim r As Long: r = wsLog.Cells(wsLog.Rows.Count, "A").End(xlUp).Row + 1
    
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible <> xlSheetVisible Then
            wsLog.Cells(r, 1).Value = Format(Now, "yyyy-mm-dd HH:NN:SS")
            wsLog.Cells(r, 2).Value = ws.Name
            wsLog.Cells(r, 3).Value = IIf(ws.Visible = xlSheetHidden, "Hidden", "VeryHidden")
            r = r + 1
        End If
    Next
    MsgBox "隠しシート一覧をLogへ出力しました。"
End Sub
VB
  • 重要ポイント(深掘り):
    • 透明性の確保: 何が隠れているか可視化すると、運用・監査で安心。
    • 誤設定の検知: 予定外にHidden/VeryHiddenになっているシートを素早く発見。

トグル操作:見せる/隠すをワンタッチ

' 指定シートの可視性をトグル(Visible⇔Hidden)
Sub ToggleSheetVisibility(ByVal sheetName As String)
    Dim ws As Worksheet: Set ws = Worksheets(sheetName)
    Select Case ws.Visible
        Case xlSheetVisible:      ws.Visible = xlSheetHidden
        Case xlSheetHidden:       ws.Visible = xlSheetVisible
        Case xlSheetVeryHidden:   ' 運用上は表示しない方針なら何もしない
                                  ' 管理者操作でのみ表示にする設計が安全
    End Select
    MsgBox sheetName & " の可視性を切り替えました。"
End Sub
VB
  • 重要ポイント(深掘り):
    • 方針の明示: VeryHiddenは基本トグル対象から外し、管理手順で扱う。
    • 操作ミス防止: UIボタンに紐付ける際は対象シートを限定。

連動設計:「ユーザーメニューのみ表示」運用

' ユーザーが触るメニューだけ残し、他は隠す
Sub ShowOnlyMenu()
    Dim keep As Variant: keep = Array("Menu", "Output")
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If Not IsIn(ws.Name, keep) Then
            ws.Visible = xlSheetVeryHidden
        Else
            ws.Visible = xlSheetVisible
        End If
    Next
    MsgBox "メニュー系だけ表示し、他は完全非表示にしました。"
End Sub

Private Function IsIn(ByVal name As String, ByRef arr As Variant) As Boolean
    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        If StrComp(name, CStr(arr(i)), vbTextCompare) = 0 Then IsIn = True: Exit Function
    Next
End Function
VB
  • 重要ポイント(深掘り):
    • ホワイトリスト設計: 「見せるものだけ指定」方式は漏れが起きにくい。
    • メンテ容易: 配列に追加・削除するだけで運用を変更可能。

解除テンプレ:すべてのシートを表示(緊急時・調査用)

' 全シートを一括表示(VeryHiddenも含む)
Sub UnhideAllSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Visible = xlSheetVisible
    Next
    MsgBox "全シートを表示しました。"
End Sub
VB
  • 重要ポイント(深掘り):
    • 用途限定: 調査・復旧時のみに使用。通常運用では誤操作のリスクが上がる。
    • 元に戻す手順: 調査後は「ShowOnlyMenu」などのポリシー関数で即再設定。

安全枠組み:最適化スイッチとメッセージ運用

Sub SafeVisibilityChange()
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    ' 例:運用ポリシー適用
    ShowOnlyMenu
    
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    MsgBox "可視性ポリシーを適用しました。"
    Exit Sub
ErrHandler:
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    MsgBox "可視性変更でエラー: " & Err.Description
End Sub
VB
  • 重要ポイント(深掘り):
    • Finally風復帰: 例外時でも環境を元に。画面のチラつきやイベント暴発を防ぐ。
    • ユーザー周知: 可視性変更時はメッセージで「今の状態」を伝えると混乱が減る。

例題で練習(貼って試せる)

  • 例1(基本隠す/表示):
    • 手順: HideSheets → UnhideSheets。Hiddenの動作を体感。
  • 例2(VeryHidden運用):
    • 手順: ProtectConfigSheets → RevealConfigSheets。完全非表示と表示の切替を確認。
  • 例3(一覧化):
    • 手順: Logシート作成 → ListHiddenSheets。隠し状態の棚卸し。
  • 例4(メニューだけ表示):
    • 手順: ShowOnlyMenuでユーザー画面に必要最小限だけを見せる。

実務の落とし穴と対策(ここが肝)

  • 落とし穴1:VeryHiddenを乱用して管理不能
    • 対策: ホワイトリスト運用(ShowOnlyMenu)で一括管理。配列にルールを集約。
  • 落とし穴2:設定シートがうっかり表示されたまま
    • 対策: マクロ終了時にポリシー適用(SafeVisibilityChange)を標準化。
  • 落とし穴3:ユーザーがHiddenを再表示して誤操作
    • 対策: 重要シートは最初からVeryHidden。Hiddenは軽微なものに限定。
  • 落とし穴4:名前変更でコードが壊れる
    • 対策: シート名の配列管理・IsInヘルパーで耐性強化。名前修正時は配列のみ更新。
  • 落とし穴5:可視性変更時のイベント暴発
    • 対策: EnableEventsをOFFにしてから操作→最後にONへ戻す。

スターター手順(最短導入)

  • 手順1: 基本のSetVisibilityで可視性の違いを理解。
  • 手順2: Hide/Unhideテンプレで日常運用を整える。
  • 手順3: VeryHiddenテンプレで重要シートを完全非表示に。
  • 手順4: ShowOnlyMenuで「見せるものだけ見せる」方針へ。
  • 手順5: ListHiddenSheetsで棚卸し・監査の透明性を確保。

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