
結論
Excelには全シート保護を一括解除する機能はありませんが、VBAなら数秒で解除できます。
おすすめは「解除失敗シートも表示する実務版」です。
💡Excelで複数のシートに保護がかかっていて、編集のたびに1枚ずつ解除している——シート数が多いブックほど、この手作業はじわじわ時間を奪います。Excelの標準機能には「全シートの保護を一括解除する」ボタンがありませんが、VBAマクロを使えば数秒でまとめて解除できます。
しかも、ネット上でよく見かける一括解除コードには落とし穴があります。多くが On Error Resume Next でエラーを握りつぶすため、「実は数枚だけパスワードが違って解除できていなかった」ことに気づけないのです。この記事では、解除に失敗したシートを最後に一覧表示する実務向けコードを主役に紹介します。
その前に:Excelの「ロック」は3種類ある
「解除できない」という相談の多くは、コードの問題ではなく対象の保護の種類を取り違えていることが原因です。下の表で、自分が解除したいものがどれかを先に確認してください。このマクロが対象にするのは一番上の「シート保護」です。
| 種類 | かかっている状態 | 手動の解除メニュー | このマクロで解除できる? |
|---|---|---|---|
| シート保護 | セルやオブジェクトの編集ができない | 校閲タブ →「シート保護の解除」 | ◎ 対象(本記事のコード) |
| ブックの保護 | シートの追加・削除・移動・名前変更ができない | 校閲タブ →「ブックの保護」をオフ | △ 別コード(後述の Workbook.Unprotect) |
| ファイルを開く/書き込みパスワード | ファイルを開く時点でパスワードを要求される | ファイル → 情報 → ブックの保護 → パスワードで暗号化 | × VBAでは解除不可(開く前に必要なため) |
「シート上のセルが編集できない/灰色のメッセージが出る」ならシート保護です。そのまま読み進めてください。
STEP1:VBAエディタを開く
- 保護を解除したいExcelファイルを開く
- Alt + F11 キーでVBAエディタ(VBE)を起動する
- メニューの「挿入」→「標準モジュール」を選ぶ
- 右側に開いた白いウィンドウに、下のコードを貼り付ける
実行方法は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 でこのマクロを呼び出せます。
- 開発タブ →「マクロの記録」をクリック(保存先を「個人用マクロブック」に設定して記録開始 → すぐ記録停止)。これでPERSONAL.XLSBが自動作成されます。
- VBE(Alt+F11)の左側に表示された
PERSONAL.XLSBに標準モジュールを追加し、上の実務版コードを貼り付ける。 - Excelを閉じるとき「個人用マクロブックの変更を保存しますか」に「保存」を選ぶ。
上のコードがすべて ActiveWorkbook を対象にしているのは、PERSONAL.XLSBからその時アクティブなファイルに対して実行できるようにするためです。
編集が終わったら一括でかけ直す
実務では「解除した → 編集した → 保護を戻し忘れた」がよく起こります。再保護もマクロにしておきましょう。解除側と同じく Sheets/Object で統一しているので、グラフシートが混ざっていてもエラーになりません。
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 SubUserInterfaceOnly:=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 から数秒で保護解除できるようになります。












コメント