Excelシート保護を一括解除するVBA|解除できないシートも特定【コピペOK】

Excelシート保護を一括解除するVBA

結論

Excelには全シート保護を一括解除する機能はありませんが、VBAなら数秒で解除できます。

おすすめは「解除失敗シートも表示する実務版」です。

 

💡Excelで複数のシートに保護がかかっていて、編集のたびに1枚ずつ解除している——シート数が多いブックほど、この手作業はじわじわ時間を奪います。Excelの標準機能には「全シートの保護を一括解除する」ボタンがありませんが、VBAマクロを使えば数秒でまとめて解除できます。

しかも、ネット上でよく見かける一括解除コードには落とし穴があります。多くが On Error Resume Nextエラーを握りつぶすため、「実は数枚だけパスワードが違って解除できていなかった」ことに気づけないのです。この記事では、解除に失敗したシートを最後に一覧表示する実務向けコードを主役に紹介します。

コードだけ欲しい方へ

解除できなかったシートも特定できる → 実務版コードへジャンプ

その他の選び方:

まず確認

このコードで解除できるのは「シート保護」です。シートの追加・削除・移動ができない場合は「ブック保護」の可能性があり、解除方法が異なります(後述)。

 

その前に:Excelの「ロック」は3種類ある

「解除できない」という相談の多くは、コードの問題ではなく対象の保護の種類を取り違えていることが原因です。下の表で、自分が解除したいものがどれかを先に確認してください。このマクロが対象にするのは一番上の「シート保護」です。

種類かかっている状態手動の解除メニューこのマクロで解除できる?
シート保護セルやオブジェクトの編集ができない校閲タブ →「シート保護の解除」◎ 対象(本記事のコード)
ブックの保護シートの追加・削除・移動・名前変更ができない校閲タブ →「ブックの保護」をオフ△ 別コード(後述の Workbook.Unprotect
ファイルを開く/書き込みパスワードファイルを開く時点でパスワードを要求されるファイル → 情報 → ブックの保護 → パスワードで暗号化× VBAでは解除不可(開く前に必要なため)

「シート上のセルが編集できない/灰色のメッセージが出る」ならシート保護です。そのまま読み進めてください。

 

STEP1:VBAエディタを開く

  1. 保護を解除したいExcelファイルを開く
  2. Alt + F11 キーでVBAエディタ(VBE)を起動する
  3. メニューの「挿入」→「標準モジュール」を選ぶ
  4. 右側に開いた白いウィンドウに、下のコードを貼り付ける

実行方法は2通りあります。

  • VBE内で実行: コード内をクリックしてから F5 キー(または上部の「▶」ボタン)。
  • Excel画面に戻って実行: VBEを閉じ、Excelの画面で Alt + F8 キーを押すとマクロ一覧が開きます。目的のマクロ名を選んで「実行」。普段はこちらが手軽です。

パターンA:解除できなかったシートも特定できる【実務版・おすすめ】

実務で常用してほしいのがこの実務版です。次の工夫をすべて盛り込んでいます。

  • 失敗シートの特定:パスワードが合わずに解除できなかったシート名を、最後にまとめて表示します。
  • キャンセル対応:パスワード入力で「キャンセル」を押したら、空欄扱いで進まずその場で中断します。
  • グラフシート対応:Sheets を対象にしているので、通常シートに加えグラフシートなども処理します。
  • 高速化&安全な後処理:画面更新を止めて高速化し、途中でエラーが起きても画面更新を必ず元に戻します

実行前の必須チェック

  • ファイルのバックアップを作成する(解除後の編集ミスは元に戻しにくい)。
  • ② このマクロはパスワードが分かっているファイルが対象です。共有ファイルや業務ファイルは、管理者の許可を得たうえで実行してください。
  • ③ 解除後は再保護の手順(後述)もあわせて確認しておく。
Sub UnprotectAllSheets_Perfect()
    Dim sh As Object        ' WorksheetもChart(グラフシート)も対象にするためObject型
    Dim pw As Variant
    Dim okCount As Long
    Dim ngList As String

    ' Application.InputBoxはキャンセル時にFalse(Boolean)を返す
    pw = Application.InputBox( _
            Prompt:="シート保護のパスワードを入力してください" & vbCrLf & _
                    "(パスワードが無い場合は空欄のままOK)", _
            Title:="一括保護解除", Type:=2)

    ' キャンセルが押されたら中断(空欄OKと取り違えないようVarTypeで判定)
    If VarType(pw) = vbBoolean Then Exit Sub

    On Error GoTo ExitHandler        ' 予期しないエラーでも必ず後処理へ
    Application.ScreenUpdating = False

    For Each sh In ActiveWorkbook.Sheets
        If sh.ProtectContents Then    ' 保護されているシートだけ処理
            On Error Resume Next       ' 解除失敗は記録して続行
            sh.Unprotect Password:=pw
            On Error GoTo ExitHandler  ' 通常のエラー処理に戻す
            If sh.ProtectContents Then ' まだ保護されている=解除失敗
                ngList = ngList & "・" & sh.Name & vbCrLf
            Else
                okCount = okCount + 1
            End If
        End If
    Next sh

    Application.ScreenUpdating = True
    If ngList = "" Then
        MsgBox okCount & " 枚のシートの保護を解除しました。", vbInformation, "完了"
    Else
        MsgBox okCount & " 枚を解除しました。" & vbCrLf & vbCrLf & _
               "次のシートはパスワードが一致せず解除できませんでした:" & vbCrLf & _
               ngList, vbExclamation, "一部解除失敗"
    End If
    Exit Sub

ExitHandler:
    Application.ScreenUpdating = True   ' エラー時も画面更新を必ず復帰
    MsgBox "予期しないエラーが発生しました:" & vbCrLf & Err.Description, vbExclamation
End Sub

このコードの肝は、解除を試みた後に ProtectContentsまだTrueかどうかを直接チェックしている点です。エラーの有無に頼らないので、「成功したつもりで失敗していた」を確実に防げます。さらに On Error GoTo ExitHandler を入れることで、万一の異常終了でも ScreenUpdating が止まったまま画面が固まる事故を防いでいます。

パスワードを設定せずに保護したシートに対しては、入力したパスワードは無視されてそのまま解除されるので、パスワード有り・無しのシートが混在していても問題ありません。逆にパスワードが1文字でも違うと、そのシートは「解除できなかったシート」として一覧に表示されます。パスワードは大文字・小文字・全角半角、前後のスペースまで区別される点に注意してください(コピペ時に余分なスペースが入ると一致しません。失敗一覧に出たら、まずスペースの混入を疑ってください)。

パターンB:パスワードなしの最小コード

「パスワードは設定していない」と分かっていて、とにかく短いコードで済ませたい場合はこれだけでも動きます。仕組みを理解する入口としてもどうぞ。

Sub UnprotectAllSheets()
    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        ws.Unprotect
    Next ws
End Sub

ただしパスワード付きのシートにこれを実行すると、シートごとにパスワード入力ダイアログが出てしまいます。パスワードがある場合や、混在している可能性がある場合は実務版を使ってください。

パターンC:解除結果を記録する【解除ログ付き版】

「いつ・どのシートを解除したか」を記録に残したい運用では、結果をログシートに書き出すこの版が便利です。実行すると 「解除ログ」シート が作られ、処理日時・シート名・結果(参考としてExcelに設定されたユーザー名)が追記されます。

Sub UnprotectAllSheets_WithLog()
    Dim sh As Object
    Dim pw As Variant
    Dim logWs As Worksheet
    Dim r As Long

    pw = Application.InputBox( _
            Prompt:="シート保護のパスワード(無ければ空欄)", _
            Title:="一括保護解除(ログ付き)", Type:=2)
    If VarType(pw) = vbBoolean Then Exit Sub

    On Error GoTo ExitHandler
    Application.ScreenUpdating = False

    ' ログ用シートを用意(無ければ追加)
    On Error Resume Next
    Set logWs = ActiveWorkbook.Worksheets("解除ログ")
    On Error GoTo ExitHandler
    If logWs Is Nothing Then
        Set logWs = ActiveWorkbook.Worksheets.Add
        logWs.Name = "解除ログ"
        logWs.Range("A1:D1").Value = Array("日時", "実行者", "シート名", "結果")
    End If
    r = logWs.Cells(logWs.Rows.Count, 1).End(xlUp).Row + 1

    For Each sh In ActiveWorkbook.Sheets
        If sh.Name <> logWs.Name And sh.ProtectContents Then
            On Error Resume Next
            sh.Unprotect Password:=pw
            On Error GoTo ExitHandler
            logWs.Cells(r, 1).Value = Now
            logWs.Cells(r, 2).Value = Application.UserName
            logWs.Cells(r, 3).Value = sh.Name
            logWs.Cells(r, 4).Value = IIf(sh.ProtectContents, "失敗", "解除")
            r = r + 1
        End If
    Next sh

    Application.ScreenUpdating = True
    MsgBox "処理が完了しました。結果は「解除ログ」シートをご確認ください。", vbInformation
    Exit Sub

ExitHandler:
    Application.ScreenUpdating = True
    MsgBox "予期しないエラーが発生しました:" & vbCrLf & Err.Description, vbExclamation
End Sub

「実行者」列に入る Application.UserName は、Excelのオプションで自由に変更できる名前です。本人確認の証跡にはならないため、あくまで参考情報として扱ってください。ログをファイルに残したくない場合は、後で「解除ログ」シートを削除してください。

 

一度設定すれば今後ずっと使える:個人用マクロブック

このマクロの本当の価値は「コードを手に入れること」ではなく、今後どのファイルでもワンクリックで使える状態にすることです。毎回ファイルにコードを貼り付けるのは面倒なので、個人用マクロブック(PERSONAL.XLSB)に登録しておきましょう。Excelを起動しているあいだは、開いているどのファイルからでも Alt + F8 でこのマクロを呼び出せます。

  1. 開発タブ →「マクロの記録」をクリック(保存先を「個人用マクロブック」に設定して記録開始 → すぐ記録停止)。これでPERSONAL.XLSBが自動作成されます。
  2. VBE(Alt+F11)の左側に表示された PERSONAL.XLSB に標準モジュールを追加し、上の実務版コードを貼り付ける。
  3. Excelを閉じるとき「個人用マクロブックの変更を保存しますか」に「保存」を選ぶ。

上のコードがすべて ActiveWorkbook を対象にしているのは、PERSONAL.XLSBからその時アクティブなファイルに対して実行できるようにするためです。

編集が終わったら一括でかけ直す

実務では「解除した → 編集した → 保護を戻し忘れた」がよく起こります。再保護もマクロにしておきましょう。解除側と同じく SheetsObject で統一しているので、グラフシートが混ざっていてもエラーになりません。

Sub ProtectAllSheets()
    Dim sh As Object        ' 解除側と型をそろえる(グラフシート等も対象)
    Dim pw As Variant

    pw = Application.InputBox( _
            Prompt:="設定するパスワード(無しなら空欄)", _
            Title:="一括保護", Type:=2)
    If VarType(pw) = vbBoolean Then Exit Sub

    Application.ScreenUpdating = False
    For Each sh In ActiveWorkbook.Sheets
        sh.Protect Password:=pw, UserInterfaceOnly:=True
    Next sh
    Application.ScreenUpdating = True
End Sub

UserInterfaceOnly:=True は「手動の編集は禁止するが、マクロからの変更は許可する」という設定です。集計マクロを動かしつつ、人の手による誤操作だけ防ぎたいときに便利です。ただしこの設定はファイルを閉じると保持されません。再度開くとマクロからの変更も保護対象に戻るため、ブックを開くたびにこの保護を実行する(または Workbook_Open イベントに仕込む)必要があります。

開いているすべてのブックをまとめて処理する

複数ファイルを開いた状態で、すべてのシート保護を一度に外したいときはこちらです。If wb.Visible Then を入れて、裏で開いている個人用マクロブックなどの非表示ファイルを巻き込まないようにしています。

Sub UnprotectAllOpenWorkbooks()
    Dim wb As Workbook
    Dim sh As Object
    Dim pw As Variant

    pw = Application.InputBox(Prompt:="パスワード(無い場合は空欄)", _
                              Title:="全ブック一括解除", Type:=2)
    If VarType(pw) = vbBoolean Then Exit Sub

    Application.ScreenUpdating = False
    For Each wb In Application.Workbooks
        ' 目に見える(編集対象の)ブックだけを処理
        If wb.Visible Then
            For Each sh In wb.Sheets
                If sh.ProtectContents Then
                    On Error Resume Next
                    sh.Unprotect Password:=pw
                    On Error GoTo 0
                End If
            Next sh
        End If
    Next wb
    Application.ScreenUpdating = True
End Sub

ブックの保護を解除したい場合

冒頭の表でいう「ブックの保護」(シートの追加・削除ができない状態)は、シートではなくブックに対して解除します。

Sub UnprotectWorkbookStructure()
    ActiveWorkbook.Unprotect                          ' パスワード無し
    ' ActiveWorkbook.Unprotect Password:="your_pw"    ' パスワード有りはこちら
End Sub

こちらはシート保護と違い、パスワード付きのブック保護にパスワードを指定せず実行するとエラーになる点に注意してください。

こんな場面で便利

具体的な業務シーンに当てはめると、使いどころがイメージしやすくなります。

  • 30枚のシートがある月次報告書を、まとめて編集できる状態にしたい
  • 店舗ごとに分かれた大量のシートを、一括で修正したい
  • 保護を外してから、複数シートに一括置換やレイアウト変更をかけたい
  • 配布用テンプレートを改修するため、いったん全保護を解除して作業したい

いずれも「1枚ずつ手作業」だと数分〜数十分かかる作業が、マクロなら数秒で済みます。

動作確認とマクロの取り扱い

はじめて使うときは、テスト用のブックで動作確認してから本番ファイルに使うと安心です。「保護なし」「パスワードなしの保護」「パスワードありの保護」の3枚を用意して実行すると、失敗一覧の挙動まで確認できます。

マクロを保存するときは .xlsm(マクロ有効ブック) 形式にし、開く際は「コンテンツの有効化」をクリックします。社内で配布する場合は、会社のITポリシーに従い、必要に応じてデジタル署名を付けるとセキュリティ警告を抑えられます。

よくあるエラーと対処(実行時のトラブル)

症状原因と対処
「入力したパスワードが間違っています」と表示されるパスワード不一致。大文字・小文字・全角半角・前後スペースを確認。実務版なら、どのシートで失敗したかが一覧表示されます。
シートごとにパスワード入力ダイアログが出るパスワード付きシートに最小版(引数なし)を実行している状態。実務版に切り替える。
「コンパイルエラー:構文エラー」になるコピペ時に余分な空白や全角スペースが混入した可能性。コードを貼り直し、インデントが半角スペースか確認する。
マクロが実行できない・保存できないファイルを .xlsm 形式で保存し、開く際に「コンテンツの有効化」をクリックする。
解除したのにまだ編集できない別途「ブックの保護」がかかっている、または UserInterfaceOnly でかかり直している可能性。冒頭の表で種類を再確認。

よくある質問(FAQ)

Q. 非表示シートも解除されますか?

はい。For Each ... In Sheets はすべてのシートを対象にするため、非表示シートも解除されます。

Q. 「表示しない(VeryHidden)」シートも対象ですか?

対象です。VBAからは VeryHidden のシートにもアクセスできるため、保護があれば解除されます。

Q. 保護されていないシートはどうなりますか?

何も起きません。実務版では ProtectContents で保護の有無を判定しているので、そのままスキップされます。

Q. パスワードを忘れてしまいました。解除できますか?

このマクロは正しいパスワードを入力する前提のため、不明な場合は解除できません。設定した本人またはファイルの管理者に確認するのが正攻法です。総当たりで突破する方法は、ファイル破損のリスクや不正利用の問題があるため扱いません。

Q. マクロを使わずに解除できますか?

シートが数枚なら、各シートで「校閲」タブ →「シート保護の解除」を手動で行うのが確実です。標準機能には一括解除のボタンが無いため、枚数が多い場合にマクロのメリットが大きくなります。

まとめ:用途別のコード早見表

やりたいこと使うコード
確実に解除+失敗シートも確認(おすすめ)実務版 UnprotectAllSheets_Perfect
パスワードなしを最小コードで解除最小版 UnprotectAllSheets
解除結果を記録として残すログ付き版 UnprotectAllSheets_WithLog
編集後にまとめて保護をかけ直すProtectAllSheets
開いている全ブックを一括処理UnprotectAllOpenWorkbooks

1枚ずつ手作業で解除していた時間は、マクロを一度用意しておけば数秒に短縮できます。

まずは実務版を個人用マクロブック(PERSONAL.XLSB)に登録してみてください。一度登録してしまえば、今後どのExcelファイルでも Alt + F8 から数秒で保護解除できるようになります。

著者
古見遊 正

流通業で働きながら、2004年からWindowsを使い続けている80年代生まれのサラリーマン。ExcelとPowerPointを極め、仕事の効率化を追求中。苦手だったWordも克服中!Excelを使いこなせるだけで周囲から『神扱い』されるけれど、そのせいで『システムに詳しい人』だと勘違いされがち。でも、それが新しい知識を得るきっかけになった。そんな経験を活かして、Excel・PowerPoint・Word・Windowsの時短ワザ&仕事術を発信中!

古見遊 正をフォローする
マクロ・VBA

コメント

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