Excel VBA 逆引き集 | 保護/解除

Excel VBA
スポンサーリンク

シートの保護/解除

初心者でも迷わないように、「保護(Protect)」「解除(Unprotect)」の基本から、よく使うオプション、実務で安全なテンプレート、まとめて保護/解除、編集可能にする設定まで、動くコードで丁寧に解説します。


基本:1枚のシートを保護/解除する

Sub ProtectSheet_Basic()
    ThisWorkbook.Worksheets("設定").Protect
End Sub

Sub UnprotectSheet_Basic()
    ThisWorkbook.Worksheets("設定").Unprotect
End Sub
VB
  • ポイント:
    • Protect/Unprotect: シートの編集を禁止/解除します。
    • パスワードなし: 引数を省略するとパスワードなしで保護されます。

パスワード付き保護と解除

Sub ProtectSheet_WithPassword()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("機密")
    ws.Protect Password:="secret123"
End Sub

Sub UnprotectSheet_WithPassword()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("機密")
    ws.Unprotect Password:="secret123"
End Sub
VB
  • ポイント:
    • 解除に必要: パスワード付きで保護したら、解除時にも同じパスワードが必要。
    • 見せたくない設定: パスワードはコード直書きより、入力や外部管理が安全。

実務テンプレート:一時解除して処理→再保護

Sub EditUnderProtection()
    Dim ws As Worksheet, pwd As String
    Set ws = ThisWorkbook.Worksheets("レポート")
    pwd = "secret123"

    '一時解除
    ws.Unprotect Password:=pwd

    '必要な処理(例:値の更新)
    ws.Range("A1").Value = "更新日"
    ws.Range("B1").Value = Date

    '再保護
    ws.Protect Password:=pwd
End Sub
VB
  • ポイント:
    • 安全手順: 解除→編集→再保護をワンセットに。
    • 解除忘れ対策: 例外が出ても再保護されるように構造化すると安心。

よく使うオプション:操作を一部許可する

Sub ProtectSheet_WithOptions()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")
    ws.Protect Password:="1234", _
               DrawingObjects:=False, _
               Contents:=True, _
               Scenarios:=False, _
               AllowFormattingCells:=True, _
               AllowFormattingColumns:=True, _
               AllowFormattingRows:=True, _
               AllowInsertingRows:=False, _
               AllowDeletingRows:=False, _
               AllowSorting:=True, _
               AllowFiltering:=True, _
               AllowUsingPivotTables:=True
End Sub
VB
  • ポイント:
    • 柔軟運用: 並べ替え・フィルタ・書式など、許可したい操作だけ開放。
    • Contents:=True: セル内容の編集を保護する設定の中心です。

VBAからは編集可能にする(UserInterfaceOnly)

Sub Protect_UserInterfaceOnly()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("入力")
    'マクロからは編集可能、ユーザーの手操作は保護
    ws.Protect Password:="1234", UserInterfaceOnly:=True
End Sub
VB
  • ポイント:
    • 自動処理と両立: マクロはセル変更できるが、ユーザー手操作は守られる。
    • 起動時設定: 一部環境ではブック再オープンで無効化されるため、ThisWorkbook.Openイベントで毎回設定する運用が安定。

まとめて保護/解除(全シート・指定シート)

Sub ProtectAllSheets(Optional pwd As String = "")
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Protect Password:=pwd, AllowFiltering:=True, AllowSorting:=True
    Next
End Sub

Sub UnprotectAllSheets(Optional pwd As String = "")
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Unprotect Password:=pwd
    Next
End Sub

Sub ProtectByList()
    Dim names As Variant, i As Long, ws As Worksheet
    names = Array("設定", "機密", "集計")
    For i = LBound(names) To UBound(names)
        On Error Resume Next
        Set ws = ThisWorkbook.Worksheets(CStr(names(i)))
        On Error GoTo 0
        If Not ws Is Nothing Then ws.Protect Password:="lock"
        Set ws = Nothing
    Next
End Sub
VB
  • ポイント:
    • 一括操作: 実務でよくある「全体を守る/解く」。
    • 指定名で管理: 重要シートだけ保護する運用に合う。

ブック構造の保護(シート追加・削除・並べ替えを禁止)

Sub ProtectWorkbookStructure()
    ThisWorkbook.Protect Password:="book", Structure:=True
End Sub

Sub UnprotectWorkbookStructure()
    ThisWorkbook.Unprotect Password:="book"
End Sub
VB
  • ポイント:
    • Structure保護: シートの追加・削除・並べ替えを禁止。
    • シート保護とは別: シート内編集の保護と、ブック構造の保護は目的が違う。

入力と解除のユースケース(パスワードを見せない)

Sub UnprotectWithInputBox()
    Dim pwd As String, ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("機密")
    pwd = InputBox("機密シートのパスワードを入力してください")
    If Len(pwd) = 0 Then Exit Sub
    ws.Unprotect Password:=pwd
End Sub
VB
  • ポイント:
    • 見せない配慮: パスワードをコードに書かず、入力で対応。
    • 運用負担: 入力のたびに必要なので、頻用シーンは外部設定や暗号化保管も検討。

実務の落とし穴と対策

  • 解除忘れ/再保護漏れ:
    • 対策: 必ず「解除→処理→再保護」をひとまとまりに。例外時にも再保護される構造にする。
  • フィルタや並べ替えが使えない:
    • 対策: Protect時にAllowFiltering/AllowSortingを有効化。
  • UserInterfaceOnlyが消える:
    • 対策: ブックを開くたびに再設定(ThisWorkbook.OpenでProtectを呼ぶ)。
  • 保護されていても書き換えたい(マクロだけ):
    • 対策: UserInterfaceOnly:=True、または一時Unprotect→処理→Protect。
  • ブック構造まで守りたい:
    • 対策: ThisWorkbook.Protect Structure:=True を併用。

例題で練習

例題1:全シートを、フィルタ・並べ替えは可能な保護に

Sub Example_ProtectAllFriendly()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Protect Password:="lock", AllowFiltering:=True, AllowSorting:=True
    Next
    MsgBox "全シートを保護(フィルタ・並べ替え可)にしました。"
End Sub
VB

例題2:レポート更新時だけ一時解除→更新→再保護

Sub Example_UpdateReportSafely()
    Dim ws As Worksheet, pwd As String
    Set ws = ThisWorkbook.Worksheets("レポート")
    pwd = "rpt"

    ws.Unprotect Password:=pwd
    ws.Range("B2").Value = Date
    ws.Range("B3").Value = Environ$("Username")
    ws.Protect Password:=pwd

    MsgBox "レポートを更新して再保護しました。"
End Sub
VB

例題3:ブック構造保護+目次と機密をVeryHiddenにして表示面を整理

Sub Example_SecureLayout()
    'ブック構造保護
    ThisWorkbook.Protect Password:="book", Structure:=True
    'シート保護
    ThisWorkbook.Worksheets("目次").Protect
    ThisWorkbook.Worksheets("機密").Protect Password:="key"
    '完全非表示
    ThisWorkbook.Worksheets("機密").Visible = xlSheetVeryHidden
    MsgBox "構造を保護し、表示面を整理しました。"
End Sub
VB
タイトルとURLをコピーしました