和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セルのロックを設定/判定する-Range.Locked

セルのロックの設定/解除の方法と、
セルがロックされているかを調べる方法を解説します。

どちらもRangeオブジェクトのLockedプロパティで行うことができます。

セルのロックを設定/解除する

セルのロックを設定/解除するには、
RangeオブジェクトのLockedプロパティにTrue/Falseを代入します。

' セルをロックする
Range("A1").Locked = True

' セルのロックを解除する
Range("A1").Locked = False

 
Lockedプロパティへの代入は、手作業と同様、
セル範囲や複数のセルに一括で行うことができます。

' セル範囲をロックする
Range("A1:C3").Locked = True

' 複数セルをロックする
Range("A1,B2,C3").Locked = True

' シート内のすべてのセルのロックを解除する
Worksheets("○○").Cells.Locked = False

 
なお、この処理はシートが保護されているとエラーになりますのでご注意ください。

シートの保護も同時に設定/解除する場合は、
WorksheetオブジェクトのPtrotect/Unprotectメソッドを使用します。

www.limecode.jp

数式セルを一括ロックする/空値セルを一括ロック解除する

Lockedプロパティの「複数セルへ一括で代入できる」仕様は、
同じ種類のセルを取得するSpecialCellsメソッドと相性が良いです。


例えば数式セルを取得するSpecialCells(xlCellTypeFormulas)を用いると、

' 範囲内のすべての数式セルをロック
セル範囲.Locked = False
セル範囲.SpecialCells(xlCellTypeFormulas).Locked = True

と、非常に簡潔なコードで「全数式セルをロック」することができます。
(セルは初期状態でロックされているためまずは解除してから実行します)


SpecialCellsメソッドには他にも便利なものがたくさんあり、

' 空値セルの一括ロック解除
セル範囲.SpecialCells(xlCellTypeBlanks).Locked = False

' 条件付き書式が設定されているセルを一括ロック
セル範囲.SpecialCells(xlCellTypeAllFormatConditions).Locked = True

' 入力規則のあるセル(≒ドロップダウンリストが設定されたセル)の一括ロック解除
セル範囲.SpecialCells(xlCellTypeAllValidation).Locked = True

' 基準セルと同じ入力規則のシート内の全セルをロック解除
入力規則の基準セル.SpecialCells(xlCellTypeAllValidation).Locked = True

など、上記の処理を1行~数行で実行することができます。


SpecialCellsの各機能は手作業でも「F5:ジャンプ」で使うことができますが、
VBAでも簡単に実行できることは覚えておきましょう。

セルがロックされているか調べる

Lockedプロパティはプロパティですので、当然読み取ることもできます。

セルがロックされているかどうかは、
LockedプロパティがTrue/Falseかどうかを調べて判定します。

' 対象セルがロックされていなければセル値を書き換える
If Range("A1").Locked = False Then
    Range("A1") = 1
End If

 
簡単なコードなので特に迷う部分はないと思いますが、1つ注意点として、
「ロックされたセルとロックされていないセルが混じったRangeオブジェクト」のLockedプロパティは「Null」を返します。


If文の判定にNullが入るとややこしい(TrueのElseがFalseとは限らない)ため、
Lockedの判定は単セルに行うか、まずIsNull関数で判定するようにしてください。