【ExcelVBA・マクロ】ワークシートの表示・非表示を切り替える方法|VisibleプロパティとxlSheetVeryHiddenの使い分け【コピペOK】

ExcelVBA

マクロ処理専用の作業用シートや、参照用のマスターシートを、ユーザーの目に触れないように隠したいことがあります。Excelには「右クリック→再表示」で見えてしまう通常の非表示のほかに、通常の操作では再表示できない「完全な非表示」機能もあります。

この記事では、Worksheet.Visibleプロパティの基本的な使い方から、xlSheetVeryHiddenを使ってマクロからしか再表示できない隠しシートを作る方法まで解説します。

スポンサーリンク
スポンサーリンク

Visibleプロパティの3つの状態

Worksheet.Visibleプロパティには3つの設定値があります。

設定値 状態 ユーザーの操作での再表示
xlSheetVisible(-1) 表示
xlSheetHidden(0) 非表示 右クリック→「再表示」で可能
xlSheetVeryHidden(2) 完全な非表示 不可(VBAからのみ再表示可能)

Falseを代入するとxlSheetHiddenと同じ扱いになりますが、意図を明確にするためにも定数名で指定するのがおすすめです。

基本の書き方:シートを非表示にする

Sub HideSheet()

    Worksheets("作業用").Visible = xlSheetHidden

    MsgBox "「作業用」シートを非表示にしました。"

End Sub

このコードを実行すると、「作業用」シートはシートタブから消えます。ただし、ユーザーがシートタブを右クリックして「再表示」を選べば、誰でも元に戻せてしまいます。

xlSheetVeryHiddenで完全に隠す

パスワードやマスターデータなど、ユーザーに絶対に見せたくないシートにはxlSheetVeryHiddenを使います。

Sub HideSheetCompletely()

    Worksheets("マスターデータ").Visible = xlSheetVeryHidden

    MsgBox "「マスターデータ」シートを完全に非表示にしました。"

End Sub

xlSheetVeryHiddenに設定すると、Excelの標準メニューの「再表示」ダイアログにもシート名が表示されなくなります。再表示するには、VBE(VBAエディタ)のプロパティウィンドウからVisibleを変更するか、以下のようにマクロで戻す必要があります。

Sub ShowHiddenSheet()

    Worksheets("マスターデータ").Visible = xlSheetVisible

End Sub

起動時に隠して終了時に再表示する

ブックを開いたときはマスターシートを隠し、マクロで参照するときだけ一時的に表示させたい場合は、Workbook_Openイベントと組み合わせます。

' ThisWorkbookモジュールに記述
Private Sub Workbook_Open()

    Worksheets("マスターデータ").Visible = xlSheetVeryHidden

End Sub
' 標準モジュールに記述
Sub UseMasterDataTemporarily()

    Dim ws As Worksheet
    Set ws = Worksheets("マスターデータ")

    ws.Visible = xlSheetVisible

    ' ここでマスターデータを参照した処理を行う
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    MsgBox "マスターデータは " & lastRow & " 行あります。"

    ws.Visible = xlSheetVeryHidden

End Sub

処理の前後で表示・非表示を切り替えることで、通常はユーザーの目に触れず、マクロが必要なときだけ内部的にシートへアクセスできる仕組みが作れます。

全シートを一括で表示・非表示にする

複数の作業用シートをまとめて操作したい場合は、For Eachでループ処理します。

Sub HideAllWorkSheetsExceptMain()

    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "メイン" Then
            ws.Visible = xlSheetVeryHidden
        End If
    Next ws

    MsgBox "「メイン」シート以外をすべて非表示にしました。"

End Sub

「メイン」シート以外の全シートを完全非表示にするコードです。ブックを配布する前に、内部処理用のシートを一括で隠したい場合に活用できます。

注意点:シートを1枚も表示状態にしないとエラーになる

Excelの仕様上、ブック内のすべてのシートを非表示(xlSheetHiddenまたはxlSheetVeryHidden)にすることはできません。最低1枚はxlSheetVisibleのシートが残っている必要があり、これに違反するとエラーになります。

Sub SafeHideAll()

    Dim ws As Worksheet
    Dim visibleCount As Long

    ' 表示中のシート数を数える
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible = xlSheetVisible Then visibleCount = visibleCount + 1
    Next ws

    If visibleCount <= 1 Then
        MsgBox "表示中のシートが1枚しかないため、これ以上非表示にできません。"
        Exit Sub
    End If

    ' 「メイン」以外を非表示にする処理など
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "メイン" And ws.Visible = xlSheetVisible Then
            ws.Visible = xlSheetVeryHidden
        End If
    Next ws

End Sub

事前に表示中のシート数をチェックしてから処理することで、実行時エラーを防げます。

まとめ

Worksheet.Visibleプロパティを使えば、シートの表示・非表示をVBAから自由にコントロールできます。xlSheetHiddenはユーザーの操作で再表示できる軽い非表示、xlSheetVeryHiddenはVBAからしか再表示できない完全な非表示です。

マスターデータや内部処理用のシートを隠したい場合はxlSheetVeryHiddenを使い、Workbook_Openイベントと組み合わせることで、ユーザーに見せたくない情報を安全に扱えるマクロを作成できます。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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