📊 Excel VBA Top100
📋

ProtectSheet

シート管理

シートを保護する(編集禁止)

ワークシートをVBAでパスワード保護するマクロです。Worksheet.Protectメソッドでセルの編集・行列の挿入削除・書式変更などの操作を制限できます。Passwordパラメータでパスワードを設定し、UserInterfaceOnlyパラメータをTrueにするとVBAからの変更は許可しつつ手動編集のみを禁止できます。特定セルだけ編集可能にするLocked/UnlockedのCells設定と組み合わせると高度な保護が実現します。内部ではWorksheet.Protectメソッドを呼び出す前にCells.LockedやRange.Lockedで編集可否をセル単位に設定しておくのが定石で、これによりシート全体の保護と特定セルの編集許可を両立できます。UnprotectSheetと対になる関係にあり、マクロ処理の前後で「解除→処理→再保護」というフローに組み込むことで、自動化と安全性を両立させられます。

ProtectSheet デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 実行するとシート名とパスワードを入力するダイアログが表示される

🎯 活用シーン

  • ✓入力フォームで指定セルのみ編集可能にして誤操作を防止
  • ✓月次レポートの確定後にシートを保護して数値の改ざんを防ぐ
  • ✓共有ブックで担当者ごとに編集可能なセルを制限する
  • ✓確定済みの決算数値シートを保護し、うっかり上書きしてしまうミスを防ぎたいとき
  • ✓入力担当者には特定セルだけを開放し、それ以外の数式や書式を保護して壊れないようにしたいとき

💡 実装のヒント

  • ▸UserInterfaceOnly:=Trueでマクロからの変更は許可できます
  • ▸Cells.Locked = TrueのあとProtectで全セルをロックできます
  • ▸特定範囲だけ編集許可にするにはRange.Locked = Falseを先に設定します
  • ▸UserInterfaceOnly:=Trueを指定しておくと、保護中でもマクロからの自動更新は正常に動作します。
  • ▸パスワードを設定する場合は、コード内に平文で書かず、設定ファイルや環境変数から読み込む方式を検討してください。

💻 VBAコード

' ProtectSheet
' -----------------
' Macro Name: ProtectSheet
' Description: シートを保護する(編集禁止)
' Parameters: なし
' Returns: なし
' Usage: 実行するとシート名とパスワードを入力するダイアログが表示される
' -----------------

Sub ProtectSheet()
    Dim ws As Worksheet
    Dim sheetName As String
    Dim password As String
    Dim usePassword As VbMsgBoxResult

    On Error GoTo ErrorHandler

    sheetName = InputBox("保護するシート名を入力:", "シート保護", ActiveSheet.Name)

    If sheetName = "" Then
        Exit Sub
    End If

    On Error Resume Next
    Set ws = Worksheets(sheetName)
    On Error GoTo ErrorHandler

    If ws Is Nothing Then
        MsgBox "「" & sheetName & "」は存在しません。", vbExclamation
        Exit Sub
    End If

    usePassword = MsgBox("パスワードを設定しますか?", vbYesNoCancel + vbQuestion, "シート保護")

    If usePassword = vbCancel Then
        Exit Sub
    ElseIf usePassword = vbYes Then
        password = InputBox("パスワードを入力:", "シート保護")
        If password = "" Then
            MsgBox "パスワードが空です。保護をキャンセルします。", vbInformation
            Exit Sub
        End If
    End If

    If password <> "" Then
        ws.Protect Password:=password
    Else
        ws.Protect
    End If

    If usePassword = vbYes Then
        MsgBox "「" & sheetName & "」をパスワード付きで保護しました。", vbInformation
    Else
        MsgBox "「" & sheetName & "」を保護しました。", vbInformation
    End If
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub