TL;DR —
Worksheet.Unprotectは、大元のスイッチを OFF にしたものです。Excel にLockedラベ ルの強制をやめさせますが、ラベルそのものには触れません — シート保護を解除しても、セルの ロックは外 れません。ただ、今はロックを尊重するのをやめるだけです。シートがパスワードで保護されていたなら、まっ たく同じものを渡さなければならず、さもないと実行時エラー 1004(パスワード違い)か、無人のマクロを止め るモーダルダイアログに遭います。ほとんどすべての編集マクロは、作業を 解除 ▸ 変更 ▸ 保護 のサンドイ ッチで包みます — そして肝心なルールはただ一つ、エラーハンドラーで再保護すること。クラッシュしてもシー トを開けっ放しにしないためです。
Sub UpdateAndReLock()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Form")
ws.Unprotect Password:="ac" ' 強制を OFF にする(正確なパスワード)
On Error GoTo ReLock ' このあと何が起きても...
ws.Range("C4:C12").ClearContents ' ...作業をして...
ReLock:
ws.Protect Password:="ac" ' ...必ず ON に戻す
End Sub
Unprotect は、校閲 ▸ シート保護の解除 のコード版で、ロックダウンしたシートにマクロが書き込まなけ
ればならないときに必ず必要な最初の一手です。一行、省略可能な引数一つ — 些細に見えますし、実際そうです。
シートにパスワードが付いていたり、マクロが途中でエラーになったりするまでは。そのどちらもが、一行のコー
ドをサポートチケットに変えます。あなたをトラブルから守る考え方は、Unprotect は一時的で、対になってい
る、というものです — 仕事のためにロックを外したら、それを戻す責任はあなたにあります。
この記事で学べること
- 考え方の軸 —
Unprotectは強制を無効化するだけで、Lockedラベルは変えない - 肝心なルール — エラーハンドラーで再保護し、クラッシュしてもシートを開けっ放しにしない
- パスワードの罠 — 間違ったパスワードや渡し忘れが、なぜ 1004 を投げるかダイアログで止まるのか
- なぜ、すでに開いているシートに
Unprotectを呼ぶのは、頼っていい無害な空振りなのか - ブック内のすべてのシートを一つのループで解除する方法
- 正直な限界 — 忘れたパスワードは VBA では取り戻せない
考え方の軸:スイッチは OFF、ラベルはそのまま
保護は二層です。セルごとの Locked ラベル(「誰が何を編集してよいか」の 判断)と、Protect/
Unprotect(そのラベルを強制する、あるいは無視する スイッチ)です。Unprotect はスイッチだけを操作
します。どのセルも、持っていた Locked 状態を寸分たがわず保ちます。あなたはただ、Excel に強制をやめる
よう伝えただけです。
これが大事なのは、人は Unprotect が「セルを開ける」と期待し、そのあと再び Protect して同じセルが前
と同じようにロックされているのを見て驚くからです。何もロックは外れていません — 強制が一時停止され、そ
して再開されただけです。どの セルを編集可能にするかを変えたいなら、それはシートが保護されていない間の
Locked プロパティの仕事であって、Unprotect 自身の仕事ではありません。
最も大事なルール:エラーハンドラーで再保護する
保護されたシートを編集するマクロの標準の形はサンドイッチです — 解除し、作業をし、また保護する。危険は
真ん中の一枚に潜みます。「作業」のステップがエラーを出すと — 参照ミス、消えたシート、型の不一致 — 実行
はそこで止まり、締めの Protect は決して走らず、シートは大きく開いたまま残されます。ユーザーは何も知
らずにファイルを閉じ、丁寧にロックしたテンプレートは、いまや誰でも編集できてしまいます。
対処は、エラーハンドラーで再保護を無条件にし、作業が成功しても吹き飛んでも走るようにすることです。
Sub SafeEdit()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Form")
ws.Unprotect Password:="ac"
On Error GoTo CleanExit
' ... 失敗するかもしれない本当の作業 ...
ws.Range("C4:C12").ClearContents
CleanExit:
ws.Protect Password:="ac", UserInterfaceOnly:=True
If Err.Number <> 0 Then MsgBox "更新に失敗しました: " & Err.Description
End Sub
これは、ファイルを閉じたり ScreenUpdating を復元したりするために、信頼できるマクロがどれも使う、あの
CleanExit の規律と同じです — 「元に戻す」コードが宿る、ただ一つの出口ラベル。完全な型は
エラー処理 にあります。判断はシンプルです。シートを再保護する行が、うま
くいった経路でしか到達できない、という状態にしてはいけません。
パスワードの罠
シートがパスワードで保護されていたなら、Unprotect はその正確なパスワードを必要とし、間違えると二つの
異なる、しかし等しく厄介な形で失敗します。間違った パスワードを渡すと、実行時エラー 1004「The
password you supplied is not correct」になります。パスワード保護されたシートに 何も パスワードを渡さ
ないと、対話的なセッションでは Excel が パスワード入力ダイアログ を出します — これが、無人やスケジ
ュール実行のマクロを永遠に、静かに止めます。入力する人が誰もいないからです。
ws.Unprotect Password:="ac" ' 正しい:正確なパスワード、きれいに走る
ws.Unprotect ' パスワード付きシートでは:モーダルダイアログが出る - バッチ処理が止まる
ws.Unprotect Password:="wrong" ' 実行時エラー 1004
そこから導かれるルール — 自動化されたマクロは、常にパスワードを明示的に渡さなければならず、ダイアログ に答える人間がそこにいることに決して頼ってはいけません。どこかでパスワード付きの保護をするなら、解除コ ードが読める定数に格納し、二つが食い違わないようにします。
開いているシートへの Unprotect は安全な空振り
守りのコードをすっきりさせる小さな事実 — 保護されていない シートに Unprotect を呼んでも、何も起き
ず、エラーも出ません。つまり、先に ws.ProtectContents を確認しなくても、ルーチンの先頭で Unprotect
してよいということです — シートがすでに開いていたなら、呼び出しは無害な素通り、ロックされていたなら、
開けます。これは VBA にしては珍しく寛容で、ガードなしに解除ステップを書かせてくれます。(逆は対称では
ありません。すでに保護されたシートへの Protect は エラーを出す ので、盲目的な再保護にはもっと注意
が要ります。)
ブック内のすべてのシートを一つのループで解除する
よくある実務は、一括で作り直す前に、ブック全体の保護を外すことです。Worksheets コレクションをループ
し、共有パスワードを渡して一枚ずつ解除します。
Sub UnprotectAllSheets()
Const PW As String = "ac"
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Unprotect Password:=PW ' 保護されていなかったシートでは空振り
Next ws
End Sub
Unprotect は保護されていないシートでは空振りなので、一部のタブだけがロックされていても、このループは
安全です。作り直しの最後に、対になる 全保護 ループと組み合わせてください。もしシートごとに違うパスワ
ードを使っていたら、この単純なループは動きません — これは、自動化しなければならないブックでは、一つの
パスワード(またはゼロ)で通すべきだという、よい論拠です。コレクションを反復する方法は
Worksheets を参照してください。
正直な限界:忘れたパスワード
はっきり述べておく価値があります。この話題の背後で最もよく検索されることの一つだからです — Unprotect
は、設定されたパスワードを必要とします。VBA は、あなたが本当に忘れてしまったパスワードを 取り戻す ま
たは 暴く サポートされた方法を、一切くれません — この言語は、あなたがすでに知っているパスワードを適用
できるだけです。自分のシートを保護してパスワードをなくしたなら、現実的な道は、バックアップかファイルの
以前のバージョンから復元することです。使うコードのそばの定数にパスワードを控えておく習慣をつけ、あなた
が保守するブックで「忘れた」が決して起きないようにしましょう。
ExcelMaster の活用
解除は「ほぼ 正しく」やってしまい、そのあと噛みつかれやすいものです — マクロが解除と再保護の間でエラ ーになり、静かにテンプレートを開けっ放しにする、スケジュール実行が誰にも見えないパスワードダイアログで 永遠に止まる、あるいはループがシートごとに違うパスワードでつまずく。
ExcelMaster には、仕事を説明する
だけでよいのです — 「ロックされたシートのこれらのセルを更新して、保護を元に戻して」 — すると、クラッシ
ュしてもシートを決して開けっ放しにしないよう再保護を CleanExit ハンドラーに入れて「解除 ▸ 作業 ▸ 保
護」のサンドイッチを書き、何もダイアログで止まらないようパスワードを明示的に渡し、忘れたパスワードはコ
ードから取り戻せないと念を押します。ブックとコードはあなたの手元に残ります。
よくある質問
VBA でパスワード付きのシートを解除するには?
Password 引数に正確なパスワードを渡します — ws.Unprotect Password:="ac"。シートを保護したときに使
ったパスワードと一致しなければなりません。間違ったパスワードは実行時エラー 1004 を出し、パスワード保護
されたシートでパスワードを省くと、無人のマクロを止めるモーダルダイアログが出ます。自動化コードでは、常
にパスワードを明示的に渡してください。
シート解除で 1004 エラーが出るのはなぜ?
最も多い原因は間違ったパスワードです — 「The password you supplied is not correct」。Unprotect のパス
ワードが Protect に使ったものと一致するか確認してください。理想は両方を一つの定数に格納することです。
1004 は、存在しないシートを参照したときにも出ることがあります。Worksheets("...") の名前がタブと正確
に同じ綴りか確かめてください。
シート保護を解除すると、セルのロックは外れますか?
いいえ。Unprotect は Locked ラベルの強制を OFF にするだけで、どのセルも持っていた Locked 状態を
寸分たがわず保ちます。もう一度シートを保護すると、同じセルが前と同じようにロックされます。どの セル
を編集可能にするかを変えるには、シートが保護されていない間に Locked プロパティを設定してください —
解除だけでは、ロックについて何も変わりません。
ブック内のすべてのシートを解除するには?
コレクションをループし、共有パスワードで一枚ずつ解除します —
For Each ws In ThisWorkbook.Worksheets: ws.Unprotect Password:="ac": Next ws。Unprotect は保護され
ていなかったシートでは空振りなので、一部のタブだけがロックされていてもループは安全です。これはブック全
体で一つのパスワードを前提とします。シートごとに違うパスワードなら、それぞれ自分の値が必要になります。
VBA は忘れたシート保護のパスワードを取り戻せますか?
いいえ。VBA は、あなたがすでに知っているパスワードを適用できるだけで、忘れたものを暴いたり取り戻したり するサポートされた方法はありません。自分のシートのパスワードをなくしたなら、バックアップか以前のバージ ョンからブックを復元してください。解除コードのそばの定数にパスワードを控えておけば、あなたが保守するフ ァイルで失われることはありません。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-11。
関連ガイド: VBA シートの保護 · VBA セルのロック · VBA エラー処理 · VBA Worksheets · VBA Workbook_Open
