🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA でシート保護を解除する — 安全な外し方とパスワードの罠

|

Excel VBA でシート保護を解除する — 安全な外し方とパスワードの罠

TL;DRWorksheet.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 ラベル(「誰が何を編集してよいか」の 判断)と、ProtectUnprotect(そのラベルを強制する、あるいは無視する スイッチ)です。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("...") の名前がタブと正確 に同じ綴りか確かめてください。

シート保護を解除すると、セルのロックは外れますか?

いいえ。UnprotectLocked ラベルの強制を OFF にするだけで、どのセルも持っていた Locked 状態を 寸分たがわず保ちます。もう一度シートを保護すると、同じセルが前と同じようにロックされます。どの セル を編集可能にするかを変えるには、シートが保護されていない間に Locked プロパティを設定してください — 解除だけでは、ロックについて何も変わりません。

ブック内のすべてのシートを解除するには?

コレクションをループし、共有パスワードで一枚ずつ解除します — For Each ws In ThisWorkbook.Worksheets: ws.Unprotect Password:="ac": Next wsUnprotect は保護され ていなかったシートでは空振りなので、一部のタブだけがロックされていてもループは安全です。これはブック全 体で一つのパスワードを前提とします。シートごとに違うパスワードなら、それぞれ自分の値が必要になります。

VBA は忘れたシート保護のパスワードを取り戻せますか?

いいえ。VBA は、あなたがすでに知っているパスワードを適用できるだけで、忘れたものを暴いたり取り戻したり するサポートされた方法はありません。自分のシートのパスワードをなくしたなら、バックアップか以前のバージ ョンからブックを復元してください。解除コードのそばの定数にパスワードを控えておけば、あなたが保守するフ ァイルで失われることはありません。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-11。

関連ガイド: VBA シートの保護 · VBA セルのロック · VBA エラー処理 · VBA Worksheets · VBA Workbook_Open