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

Excel VBA でセルをロックする — それ単体では何もしない Locked プロパティ

|

Excel VBA でセルをロックする — それ単体では何もしない Locked プロパティ

TL;DRRange.Lockedラベル であって、ロックではありません。Locked = True にしても、目 に見えるものも手ざわりも何も変わりません。セルが編集できなくなるのは、シートが 保護 された瞬間だけ で、そのとき Excel はすべてのセルのラベルを読み、Locked と記されたものを凍らせます。だから定番の不 満 — 「Locked = True にしたのにユーザーがまだセルを編集できる」 — はバグではありません。シートが一 度も保護されていなかっただけです。そして、すべてのセルが最初から Locked = True なので、本当の手順は 逆さまです — 入力セルの ロックを外しLocked = False)、それから保護し、残りすべてには既定のロッ クを受け継がせます。

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

    ws.Cells.Locked = True                 ' どのセルもすでにそうなっている - あえて明示する
    ws.Range("C4:C12").Locked = False      ' 入力セルが例外
    ws.Range("C4:C12").FormulaHidden = False
    ws.Protect Password:="ac"              ' これでラベルが意味を持ち始める
End Sub

Locked は、セルの書式設定 ▸ 保護 のチェックボックス(「ロック」)で、Excel 自動化で最も誤解される プロパティです — 設定しても何も起きないように見えるからです。cell.Locked = True を実行し、そのセルを クリックすると、まだ入力できてしまいます。すべては設計どおりに動いています。あなたはただ、Locked は それ単体では効かない、と気づいたところです。Locked は「ロックする行為」ではなく「保護システムへのメ モ」だと腹に落ちた瞬間、この機能全体が予測可能になります。

この記事で学べること

  • 考え方の軸 — Locked は保護スイッチが読むラベルであって、それ自体はロックではない
  • 一番多いバグを説明する唯一のルール — Locked はシートを保護するまで何もしない
  • なぜすべてのセルが最初からロックされているのか、そこから導かれる「入力セルのロックを外す」逆さまの手順
  • なぜ Locked は混在した選択範囲で Null を返すのか、そしてそれをどう判定するか
  • FormulaHidden — 数式を数式バーから隠す相棒のラベル
  • なぜ Locked はシートが保護されていない間に設定しなければならないのか

考え方の軸:ロックではなく、ラベル

Locked を、各セルに貼られた「保護が ON になったら私を凍らせて」と書かれた付箋だと思ってください。付 箋を書いても、何も凍りません。ただ意図を記録するだけです。実際の凍結はあとで、別の誰か — Worksheet.Protect — によって起こります。それはシートを歩き回り、各付箋を読み、それを強制します。二つのセルが同じ Locked ラベルを持っていても、そのシートが保護されているかどうかだけで、まったく違う振る舞いをします。

だから LockedProtect は、セットで理解しなければならない対です。 Locked は「誰が何を編集してよいか」の 地図Protect はその地図を尊重し始める スイッチ です。ど ちらも単体では仕事をしません。誰も強制しない地図は何も変えず、地図のないスイッチはすべてをロックするだ けです(既定の地図は、すべてのセルをロックと記しているからです)。

一番多いバグを説明するルール:Locked は保護するまで効かない

この話題の背後で最も検索される不満は「セルを Locked = True にしたのにユーザーがまだ編集できる」です。 これは決して Locked のバグではありません。シートが保護されておらず、ラベルを強制するものが何もない、 という意味です。Locked プロパティは、保護されていないシートでは何の効果もありません — ブック内のすべ てのセルに設定しても、誰が何を入力できるかは何も変わりません。

ws.Range("A1").Locked = True    ' A1 はいまロックと記された...
' (シートは保護されていない)    ' ...それでも完全に編集できる
ws.Protect                      ' これで A1 が凍る

だから Locked は常に二段構えの半分で、人が忘れるのは二段目です。セルが編集に抵抗しなければならないな ら、Locked = True にするのは必要ですが十分ではありません — ラベルが噛みつくには、シートが保護されて いなければなりません。ロックが「効かない」ときにまず確認すべきは、そもそも ws.ProtectContentsTrue かどうかです。

すべてのセルは最初からロックされている — だから例外のロックを外す

手順全体をひっくり返す事実がこれです — 新しいシートのすべてのセルは、すでに Locked = True です。つま り「保護したいセルをロックする」はほとんど正しい一手ではありません — それらはもうロックされているので す。正しいパターンは です。既定をそのままにして、人に編集させたい少数のセルの ロックを外す ので す。

ws.Cells.Locked = True              ' 既定値 - 次に読む人のために明示
ws.Range("C4:C12").Locked = False   ' 入力セルのロックを外す - これが例外
ws.Protect Password:="ac"           ' 残りすべてはロックを受け継ぐ

「どのセルが 入力 か?」で考え、それらのロックを外します。残りすべて — ラベル、数式、見出し — は既定 のロックを保ち、保護した瞬間に凍ります。これは、読み取り専用にすべきセルを一つずつ数え上げようとするよ りも、はるかにうまくスケールします。だからよくできたテンプレートは、小さく分かりやすい入力領域のロック を外し、残りは何もしないことでロックするのです。

Null の罠:混在した選択範囲で Locked を読む

Locked がきれいに読み返せるのは、範囲が一様なときだけです。範囲がロックされたセルとされていないセルの 両方 を含むと、.LockedTrue でも False でもなく Null を返します。だから素朴な判定は吹き飛 びます。

If ws.Range("A1:A10").Locked Then      ' 範囲が混在(Null)だと実行時エラー

A1:A10 にロックされたセルとされていないセルが混じっていると、.LockedNull で、If Null Then は 「Invalid use of Null」を出します。範囲が混在しうるときは IsNull で守ってください。

Dim state As Variant
state = ws.Range("A1:A10").Locked
If IsNull(state) Then
    ' 混在 - セルごとに判断する
ElseIf state Then
    ' すべてロック
Else
    ' すべてロック解除
End If

これは WrapText やその他のセルプロパティで見られるのと同じ三状態の振る舞いで す。一様な範囲は Boolean を、混在した範囲は Null を返します。確実さが必要なときは、一度に一つのセルを 読んでください。

FormulaHidden:セルをロックし、レシピを隠す

Locked には相棒のラベル FormulaHidden があり、二つ合わせて、渡すモデルにたいてい欲しい二つのこと — ユーザーが数式を変えられず、見る ことさえできない — をカバーします。Locked と同じく、FormulaHidden はシートが保護されるまで何もしません。保護されると、FormulaHidden = True のセルは、グリッドには結果を 表示しますが、選択したときの数式バーは空白になります。

ws.Range("D4:D100").Locked = True
ws.Range("D4:D100").FormulaHidden = True   ' 計算式を数式バーから隠す
ws.Protect Password:="ac"

計算をブラックボックスとして出荷するとき — 価格モデル、採点式 — に使い、フードを開けずに数字を信頼して ほしいときに向いています。いつものように、これは 利便性と知的財産 のしぐさであって、セキュリティでは ありません。保護パスワードと同じく、簡単に破られます。ですが、数式を何気ない視線から外しておくには、ま さに正しいラベルです。

なぜ Locked はシートが保護されていない間に設定しなければならないのか

Locked の地図は、シートが開いている間に描かなければなりません。保護された シートで cell.Locked = False を試みると、実行時エラー 1004 を出します — 強制するスイッチが ON の間は、地図を書き換えられないからで す。だから順序は固定で、交渉の余地はありません — Unprotect(必要なら)、すべ ての LockedFormulaHidden ラベルを設定、それから Protect。マクロが実行時にどのセルを編集可能に するかを変える必要があるなら、まず解除し、ラベルを調整し、再保護しなければなりません — アクティブなロッ ク越しにラベルを編集することは、決してできません。

ExcelMaster の活用

Locked は、考えうる限り最も紛らわしい形で静かに失敗します — シートが保護されるまで、エラーもなく、ま さしく何もしないのです。だから人はそれを設定し、ユーザーが「ロックされた」セルをそれでも編集するのを見 て、プロパティが壊れていると思い込みます。次に逆さまの手順につまずいたり、混在範囲の読み取りが「Invalid use of Null」を投げたり、アクティブな保護越しにセルを貼り替えようとして 1004 に当たったりします。

ExcelMaster には、目標を伝える だけでよいのです — 「黄色い入力セルだけ人に編集させて、数式は隠して」 — すると、LockedFormulaHidden を正しい順序で設定し、残りすべてをロックしようとするのではなく入力セルのロックを外し、 ラベルを、実際にそれらを強制する Protect 呼び出しと対にし、混在範囲の読み取りを Null から守ります。 ブックとコードはあなたの手元に残ります。

よくある質問

VBA で Locked を True にしてもユーザーがまだセルを編集できるのはなぜ?

Locked はシートが保護されるまで何もしないからです。それは保護システムが読むラベルにすぎません — 保護 されていないシートは、それを完全に無視します。セルを Locked = True にし(または既定のまま)、それから ws.Protect を呼んでください。そのあとでもまだ編集できるなら、ws.ProtectContents でシートが本当に保 護されているか確かめましょう。

一部のセルだけロックし、残りは編集可能にするには?

逆さまの手順を使います。すべてのセルは最初から Locked = True なので、狙いをロックするのではなく、例外 のロックを外します — ws.Cells.Locked = True、それから入力セルに ws.Range("C4:C12").Locked = False、 そして ws.Protect。ロックを外さなかったものはすべて既定のロックを受け継ぎ、シートを保護すると凍りま す。

Locked プロパティを読むとエラーになるのはなぜ?

範囲が混在しているからです。Locked は、ロックされたセルとされていないセルの両方を含む範囲では Null を返し、Null に対する If Range.Locked Then は「Invalid use of Null」を出します。まず IsNull で判 定するか、一度に一つのセルを読んでください — 一様な範囲は Boolean を、混在した範囲は Null を返します。

Locked と FormulaHidden の違いは?

Locked は、シートが保護されると、セルが 編集 されるのを止めます。FormulaHidden は、シートが保護さ れると、その数式が数式バーで 見られる のを止めます。どちらも、保護のもとでのみ効くラベルです。二つを 一緒に使えば、ユーザーが変更も検分もできない計算を出荷できます — セルをロックし、数式を隠して、それから 保護する、です。

シートが保護されている間にセルの Locked 状態を変えられますか?

いいえ。保護されたシートで Locked(や FormulaHidden)を設定すると、実行時エラー 1004 を出します。地 図は強制が OFF の間に描かなければなりません — 必要なら UnprotectLocked ラベルを設定、それから Protect。実行時に編集可能性を変えるマクロは、解除し、調整し、再保護しなければなりません。

検証環境

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

関連ガイド: VBA シートの保護 · VBA シート保護の解除 · VBA 折り返し表示 · VBA Range · VBA Formula