🚀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.Protectどのセルをロックするか を決めるわけではありません。すべてのセ ルにすでに付いている Locked ラベルを有効にする 大元のスイッチ であり、そのラベルは既定でどの セルも Locked = True です。だから下準備なしにシートを保護すると、ユーザーが入力するはずのセルまで 含めて すべて が凍りつきます。正しい手順は逆さまです — まず入力セルの ロックを外しそれから シートを保護します。保護は UserInterfaceOnly:=True を渡さない限り自分のマクロも止め、しかもその フラグはファイルに保存されないので、Workbook_Open のたびに付け直します。

Sub LockDownForm()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Form")

    ws.Cells.Locked = True                 ' どうせ最初は全セルがロック済み - あえて明示する
    ws.Range("C4:C12").Locked = False      ' 入力セルだけロックを外す
    ws.Protect Password:="ac", AllowFiltering:=True   ' ここで大元のスイッチを ON にする
End Sub

Protect は、校閲 ▸ シートの保護 のコード版です。フォームやレポートを組み立てるマクロで最もよく使 われる仕上げの一行であり、同時に最も誤解される一行でもあります。人は「自分が気にかけているセル」をロ ックしてくれると期待しますが、実際には Locked ラベルを持つ すべての セルをロックし、しかも Excel はシートが生まれた瞬間にそのラベルを全セルに付けているからです。Protect を「判断を 下す もの」では なく「セルがすでに抱えている判断を 強制する スイッチ」と捉えた瞬間、意外に見えた挙動はすべて腑に落 ちます。

この記事で学べること

  • 考え方の軸 — ProtectLocked ラベルを強制するスイッチであって、それを選ぶわけではない
  • ほとんどのバグを防ぐ唯一のルール — 入力セルのロックを 先に 外し、それから保護する
  • なぜ引数なしの Protect はフィルター・並べ替え・書式設定まで止めるのか
  • なぜ保護されたシートは自分のマクロを壊すのか、そして UserInterfaceOnly:=True が本当にすることは何か
  • なぜそのフラグは保存すると消えるのか、そしてどこで付け直すのか
  • なぜパスワードは本物のセキュリティではなく事故防止のガードなのか

考え方の軸:判断ではなく、スイッチ

保護は、人がひとつに混同しがちな二つの別々のものだと考えてください。判断 — 「どのセルをユーザーが編 集してよいか」 — は、各セルの Locked プロパティとして宿ります。強制 — 「その判断を今から尊重し始 めよ」 — が Worksheet.Protect です。スイッチはあなたの意図を読みません。すべてのセルにすでに付いてい る Locked フラグを読み、既定ではそのフラグはどこも True です。

このたった一つの事実が、シート保護に対する一番多い不満を説明します — しかもそれは初心者が予想するのと 正反対です。人は、下準備なしの ws.Protect は何もロックしない、あるいは「重要なセル」だけをロックす ると思い込みます。実際には すべて をロックします。すべてが最初からロックされて生まれているからです。 だから驚きは決して「保護が効かなかった」ではありません — 「保護が効きすぎて、もう誰も何も入力できな い」なのです。

最も大事なルール:まず入力セルのロックを外し、それから保護する

すべてのセルが既定で Locked = True なので、正しいパターンは「保護したいセルをロックする」では あり ません。「開けておきたい少数のセルのロックを外し、残りを保護する」です。狙いではなく、例外に印を付け ます。

ws.Cells.Locked = True              ' 既定値 - 次に読む人のために明示
ws.Range("C4:C12").Locked = False   ' 入力列 - 唯一編集できるセル
ws.Protect Password:="ac"           ' これを強制する

逆の順序でやると、定番の失敗になります。まっさらなシートで ws.Protect を呼び、そのあと ws.Range("C4").Locked = False を試すと、二行目が実行時エラー 1004 を出します — シートが保護されてい る間は、セルの Locked 状態を変えられないからです。Locked ラベルはシートが 保護されていない うち に設定しなければならず、Protect は常に最後のステップ、「誰が何を編集できるか」の地図を描き終えたあと に置きます。このクラスター全体を一文で言えばこうです — Locked が地図で、 Protect が強制を ON にする、です。

引数なしの Protect は思った以上に多くをロックする

ws.Protect はただの ON/OFF に見えますが、長い引数のリストを取り、その 既定値 は制限的です。引数な しだと、保護されたシートはユーザーの並べ替え・フィルター・書式設定・行や列の挿入や削除も止めます — ロ ックが外れているセルでさえもです。これが二番目に多い不満の正体です — 「シートを保護したら AutoFilter のドロップダウンが死んだ」。

引数は権限のメニューです。シートに必要なものだけを、正確に付け直しましょう。

ws.Protect Password:="ac", _
    AllowFiltering:=True, _
    AllowSorting:=True, _
    AllowFormattingCells:=True

知っておく価値のある落とし穴があります。AllowFiltering:=True は、すでに存在する AutoFilter のドロ ップダウンを 使う ことは許しますが、新しく作ることは許しません — だから AutoFilter は保護の に適用してください。ここでの判断は「意図を持って保 護する」ことです。「すべてが止まっている」状態から始め、このシートが許すべき特定の操作だけを ON にする — 制限的な既定値のまま出荷して不満を受け止めるのではなく。

すべてのマクロ作者を刺す罠:保護は自分のコードも止める

保護を足した翌日に、動いていたマクロを実行時エラー 1004 に変えるのがこれです。保護されたシートは、ユー ザーの入力とあなたの VBA の書き込みを区別しません — 両方 を止めます。だから ws.Range("A1").Value = 42 を機嫌よくやっていたルーチンが、シートを保護した瞬間から失敗し始めます。あなた自身のコードが、いまや侵 入者のように扱われるからです。

対処は UserInterfaceOnly 引数です。

ws.Protect Password:="ac", UserInterfaceOnly:=True

UserInterfaceOnly:=True を付けると、シートは ユーザーインターフェイス — クリックと入力 — に対して 保護されますが、あなたのマクロは、書き込みのたびに UnprotectProtect を踊らなくても自由に変更でき ます。人に対してシートをロックしたまま、コードは動き続けさせる、最もきれいな方法です。ただし、尻尾に毒 があります — それが次の節です。

なぜ UserInterfaceOnly は保存すると消えるのか

UserInterfaceOnly:=Trueブックには保存されません。 ファイルを閉じて開き直すと、シートは完全に 保護された状態で戻ってきます — あなたのマクロに対してもです — まるでそのフラグを一度も渡さなかったかの ように。保護は残りますが、「でもコードだけは通して」の部分は残りません。これが、マクロがセッション中は ずっと動いたのに、翌朝には 1004 を投げて全員を困惑させる理由です。

対処は、ブックが開くたびにフラグ付きで保護を付け直すことです。

' ThisWorkbook モジュールに置く
Private Sub Workbook_Open()
    Worksheets("Form").Protect Password:="ac", UserInterfaceOnly:=True
End Sub

これは、何もロックを外さず Locked の地図もかき乱さずに、読み込み時に「人には保護、コードには開放」の 状態を再確立します。UserInterfaceOnly を使うどんな保護でも、必須の相棒として扱ってください — このフ ラグに少しでも頼るなら、それを復元する Workbook_Open に頼ることになります。イベントの仕組みは Workbook_Open を参照してください。

パスワードは施錠ではなく、ガードレール

Password 引数はセキュリティのように感じられますが、それが 何でないか を正直に語る価値があります。 シート保護のパスワードは、弱く、よく文書化された暗号化を使っています。無数のツールで簡単に外せますし、 Excel の外で丸ごとリセットもできます。パスワードは ガードレール として扱ってください — 同僚が何気なく あなたの数式にクリックで入り込んだり、テンプレートを上書きしたりするのを止めるもの — 機密を守る金庫と してではありません。データが本当に秘密でなければならないなら、シート保護は誤った道具です。そもそもファ イルに入れないことです。そしてパスワードは安全な場所に控えておいてください。VBA は、あなたが知っている パスワードで ProtectUnprotect もできますが、忘れたものを取り戻すことは できません。

ExcelMaster の活用

保護は逆さまに読む二段構えの仕組みなので、間違えたその瞬間にはエラーを出さない形で失敗します — セルが 既定でロックされているせいで全入力を締め出す、フィルターが死んだ「読み取り専用」シートを出荷する、 UserInterfaceOnly が保存で失われて翌朝に自分のマクロが 1004 を投げる。

ExcelMaster には、本当に望む ことをそのまま伝えられます — 「このテンプレートはロックするけれど、黄色いセルには入力させて、フィルタ ーも使えるままにして」 — すると、ロックを外してから保護する手順を正しい順序で書き、シートに必要な AllowXxx 権限を ON にし、保存をまたいで生かすために Workbook_Open 付きで UserInterfaceOnly:=True を足し、パスワードは事故を防ぐもので本気の読み手を防ぐものではないと率直に伝えます。ブックとコードはあ なたの手元に残ります。

よくある質問

VBA でシートを保護すると誰も入力できなくなるのはなぜ?

すべてのセルが既定で Locked = True だからです。だから ws.Protect はシート全体をロックします。保護 は「重要なセル」を選びません — すべてのセルにすでに付いている Locked ラベルを強制するだけです。保護 の に入力範囲を Locked = False にしてください — ws.Range("C4:C12").Locked = False、それから ws.Protect です。例外のロックを外し、それからスイッチを入れる、です。

VBA でパスワード付きでシートを保護するには?

Password 引数を渡します — ws.Protect Password:="ac"。保護を外すには同じパスワードを渡します — ws.Unprotect Password:="ac"。パスワードはコードか安全な場所に控えてください — VBA は忘れたものを取り 戻せません。そして事故防止のガードとして扱い、セキュリティとしては扱わないでください。シート保護のパス ワードは簡単に外せるので、機密を隠しておく用途を任せてはいけません。

保護されたシートでマクロが 1004 エラーになるのはなぜ?

保護されたシートは、ユーザーを止めるのとまったく同じように、あなたの VBA の書き込みも止めます。 UserInterfaceOnly:=True で保護すれば、シートは人に対してロックされたまま、コードは変更を続けられます。 このフラグはブックに保存されないので、Workbook_Open イベントで付け直してください — Worksheets("Form").Protect Password:="ac", UserInterfaceOnly:=True — さもないとファイルを開き直した あとマクロが失敗します。

保護されたシートでフィルターと並べ替えを使えるようにするには?

既定では Protect がそれらを止めます。引数で付け直しましょう — ws.Protect AllowFiltering:=True, AllowSorting:=TrueAllowFiltering:=True は、すでに存在する AutoFilter のドロップダウンを操作させますが、新しく作ることは許しません。だから AutoFilter は保護の に適用してください。シートにまだ必要な操作があれば、AllowFormattingCells:=True やその他の AllowXxx フラグを足します。

シートの保護とブックの保護の違いは?

Worksheet.Protect は、一枚のシート上の セル が編集されるのを止めます。Workbook.Protect はブックの 構造 をロックします — シートの追加・削除・リネーム・移動・非表示を止めます — が、セルの内容には何も しません。両者は別の問題を解きます。シート保護はデータ入力を守り、ブック保護はタブのレイアウトを守りま す。仕上げたテンプレートでは、両方を使うことがよくあります。

検証環境

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

関連ガイド: VBA シート保護の解除 · VBA セルのロック · VBA Workbook_Open · VBA AutoFilter · VBA Range