記事ID: 132
タイトル: 特定セルだけ編集可能にして残りをロックする方法
カテゴリ: シート操作
一次キーワード: VBA セル ロック 編集制限 一部
想定読者: 入力用シートで「触ってほしくないセル」を保護したい実務担当者
検索意図: VBAで特定セルだけ編集可能にして、残りのセルをロック(保護)したい
読者の悩み(1文): シートを保護すると全セルが編集不可になり、入力欄まで操作できなくなる。
読了後にできること(1文): VBAで特定のセルだけ編集可能にして残りをロックし、入力ミスや数式の上書きを防げるようになる。
前提条件:
- Excel版: Excel 2016以降 / Microsoft 365
- OS: Windows 10/11
- 保存形式: .xlsm(マクロ有効ブック)
- 貼り付け場所: 標準モジュール
- 実行方法: Alt+F8 → マクロ実行 / ボタン割り当て
更新日: 2026-03-24
—
この記事でわかること
- VBAで特定セルだけ編集可能にして、残りを一括ロックできる
Cells.LockedとSheet.Protectの組み合わせで入力欄以外を保護できる- 名前定義で入力セルを管理し、パスワード付き保護で安全にシートを運用できる
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
どんな場面で使う?
- 入力シートの数式や見出しをユーザーに書き換えられないよう保護したいとき
- 入力欄だけ編集可能にして残りをすべてロックしたいとき
- パスワード付きで保護して配布時のセキュリティを高めたいとき
- VBAからの操作は許可しつつ手動操作だけ制限したいとき
—
完成イメージ(Before / After)
Before(手作業): 「セルの書式設定 → 保護 → ロック」をセルごとに切り替え → シート保護。セルが多いと漏れが出る。
After(VBA実行後): ボタン1つで「入力セルだけ編集可能、残りはすべてロック」が完了。保護の掛け忘れや解除し忘れがなくなる。
—
自分も以前、入力シートを配布するたびに「数式が消された」「見出しが書き換わった」とトラブルが起きていた。シート保護を手動で設定していたが、入力欄のロック解除が漏れて「入力できません」と問い合わせが来る。正直めんどくさかった。VBAで入力セルだけ自動でロック解除→保護するようにしてからは、配布前の作業が30秒で終わるようになった。同じように「一部だけ入力可能にしたい」と思っている人が、この記事でサクッと設定できるようになればうれしい。
VBAの
Lockedプロパティ+Protectメソッドを使えば、特定セルだけ編集可能にして残りをロックできる。
なお、シート保護・解除の基本操作は 特定シートだけ保護・解除する方法 を参照。入力規則(ドロップダウンリスト)と組み合わせれば入力制限をさらに強化できる。詳しくは 入力規則(ドロップダウンリスト)をVBAで一括設定する方法 を参照。
—
実行前の準備
バックアップを取る
シートの保護状態を変更する操作です。データは消えませんが、既存の保護設定が上書きされるため、念のためファイルのコピーを別フォルダに保存してから実行してください。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
Alt + F8→ マクロ名を選んで「実行」
ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。
—
コード(最小版)– 固定範囲だけ編集可能にする
B2:B10だけ入力可能にして、残りをすべてロックする。まずはこれで動きを確認する。
'============================================================
' ■ 特定セルだけ編集可能にして残りをロックする(最小版)
' → B2:B10だけ入力可能、残りはすべてロック
'============================================================
Sub LockSheetExceptInputCells()
Dim ws As Worksheet
Set ws = ActiveSheet
'--- 既存の保護を解除(保護されていない場合もエラーにならない)
ws.Unprotect
'--- 全セルをロック
ws.Cells.Locked = True
'--- 入力セルだけロック解除
ws.Range("B2:B10").Locked = False
'--- シートを保護
ws.Protect
MsgBox "B2:B10以外をロックしました。", vbInformation
End Sub
ポイント
Cells.Locked = Trueで全セルをロック状態にしてから、入力させたい範囲だけLocked = Falseにする- 最後に
Protectでシート保護をかける。この順番が重要 Lockedプロパティはシートが保護されていないと効果がない。Protectとセットで使う
保護を解除するコード(セットで使う)
'============================================================
' ■ シート保護を解除する
'============================================================
Sub UnlockSheet()
ActiveSheet.Unprotect
MsgBox "シートの保護を解除しました。", vbInformation
End Sub
—
コード(実務版)– 名前定義で入力セルを管理+パスワード付き保護
自分はこの方法を覚えてからは、入力シートの配布作業が格段にラクになった。名前定義で管理するので、入力欄が増えてもコードを修正する必要がない。
'============================================================
' ■ 特定セルだけ編集可能にして残りをロックする(実務版)
' → 名前定義「入力範囲」で管理+パスワード付き保護
' → 複数の不連続範囲にも対応
'============================================================
Sub LockSheetWithNamedRange()
Dim ws As Worksheet
Dim inputRange As Range
Dim pw As String
Set ws = ActiveSheet
'--- パスワード(運用に合わせて変更)
pw = "pass1234"
'--- 既存の保護を解除(パスワード付きの場合に備える)
On Error Resume Next
ws.Unprotect Password:=pw
On Error GoTo 0
'--- 名前定義「入力範囲」が存在するか確認 -----【ここが追加】
On Error Resume Next
Set inputRange = ws.Range("入力範囲")
On Error GoTo 0
If inputRange Is Nothing Then
MsgBox "名前定義「入力範囲」が見つかりません。" & vbCrLf & _
"名前の管理で「入力範囲」を定義してから実行してください。", _
vbExclamation
Exit Sub
End If
'--- 全セルをロック
ws.Cells.Locked = True
'--- 入力範囲だけロック解除 -----【ここが追加】
inputRange.Locked = False
'--- 入力範囲のセルを薄い黄色にして視認性アップ -----【ここが追加】
inputRange.Interior.Color = RGB(255, 255, 204)
'--- パスワード付きでシート保護 -----【ここが追加】
' UserInterfaceOnly:=True → VBAからは保護中でも操作可能
ws.Protect Password:=pw, _
UserInterfaceOnly:=True, _
AllowFiltering:=True
MsgBox "入力範囲以外をロックしました(パスワード保護)。", vbInformation
End Sub
実務版のポイント
- 名前定義「入力範囲」で管理するため、入力欄が変わってもExcel上で名前の参照先を変えるだけ。コードの修正不要
UserInterfaceOnly:=Trueを指定すると、VBAからはシート保護中でも値の書き込みが可能。Worksheet_Changeイベントなどと併用するときに便利AllowFiltering:=Trueで保護中もオートフィルタ操作を許可。実務では必須級のオプション- 入力セルに薄い黄色をつけて「ここに入力してください」と視覚的に伝える
名前定義「入力範囲」の作り方
- 入力させたいセルを選択(Ctrlキーを押しながら複数選択可能)
- 名前ボックス(数式バーの左にあるセル番地が表示される欄)に「入力範囲」と入力してEnter
名前定義の一括管理については 名前定義(名前の管理)を一括作成・削除する方法 を参照。
保護を解除するコード(実務版)
'============================================================
' ■ パスワード付きシート保護を解除する(実務版)
'============================================================
Sub UnlockSheetWithPassword()
Dim pw As String
pw = "pass1234"
On Error Resume Next
ActiveSheet.Unprotect Password:=pw
On Error GoTo 0
If ActiveSheet.ProtectContents = False Then
MsgBox "シートの保護を解除しました。", vbInformation
Else
MsgBox "パスワードが一致しないため解除できませんでした。", vbExclamation
End If
End Sub
—
落とし穴
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 「保護されているシートに対して〜」エラーが出る | Protect 済みのシートに Locked を変更しようとした |
Protect の前に必ず Unprotect を入れる。実務版コードではこの順番を守っている |
| 2 | 入力セルなのに編集できない | Locked = False にした後に Cells.Locked = True を実行してしまい上書きされた |
全セルロック → 入力セルだけ解除 の順番を守る。逆にすると入力セルもロックされる |
| 3 | VBAからセルに値を書き込めない | Protect に UserInterfaceOnly:=True を指定していない |
実務版のように UserInterfaceOnly:=True を必ず指定する。ただしブックを閉じると設定がリセットされるので注意(後述FAQ参照) |
| 4 | パスワードなしで保護を解除されてしまう | Protect にパスワードを指定していない |
ws.Protect Password:="pass1234" のようにパスワードを指定する。ただしVBAのパスワードは簡易的な保護であり、完全なセキュリティ対策にはならない |
| 5 | 名前定義「入力範囲」がエラーになる | 名前定義がシートスコープではなくブックスコープで定義されている、または名前が全角/半角で異なる | 名前の管理(Ctrl + F3)で名前のスコープと綴りを確認する。自分もこれで30分溶かした。「入力範囲」と「入力範囲 」(末尾にスペース)で別物扱いになる |
| 6 | 保護中にオートフィルタが使えない | Protect で AllowFiltering を指定していない |
ws.Protect AllowFiltering:=True を追加する。AllowSorting:=True も併せて指定すると並び替えも許可できる |
| 7 | ブックを開き直すと UserInterfaceOnly が無効になる |
UserInterfaceOnly はブックを閉じるとリセットされる仕様 |
ブックを開くたびに保護をかけ直す必要がある。Workbook_Open イベントで自動実行するのがおすすめ。詳しくは ブックを開いたとき・保存時に自動実行するイベント処理の方法 を参照 |
—
VBAでシート保護後に入力セルまで操作できなくなるときの対処法
「Protectを実行したら入力欄まで編集できなくなった」という場合、原因は入力セルのLockedプロパティがTrueのままになっていること。Protect前に入力セルだけ Locked = False を設定する。既定ではすべてのセルがLocked=Trueなので、解除したいセルだけ明示的にFalseにする必要がある。
VBAでProtectしたシートでマクロが動かないときの対処法
「シート保護をかけたらマクロからのセル書き込みもエラーになる」という場合、原因はUserInterfaceOnlyオプションの未指定だ。Protect UserInterfaceOnly:=True を付ければ、手動操作は制限しつつVBAからの操作は許可される。ただしブックを閉じるとリセットされるのでWorkbook_Openで再設定する。
FAQ
Q1. 入力セルが複数の離れた範囲にある場合はどうする?
最小版の場合は、Range にカンマ区切りで複数範囲を指定できる。
ws.Range("B2:B10, D2:D10, F2:F5").Locked = False
実務版なら、名前定義「入力範囲」に不連続範囲を登録すればOK。Ctrlキーを押しながら複数範囲を選択して名前を付ける。
Q2. UserInterfaceOnlyの設定をブックを開くたびに自動で適用したい
ThisWorkbook モジュールに以下を記述する。
Private Sub Workbook_Open()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.ProtectContents Then
ws.Unprotect Password:="pass1234"
ws.Protect Password:="pass1234", _
UserInterfaceOnly:=True, _
AllowFiltering:=True
End If
Next ws
End Sub
ブックを開くたびに自動で保護をかけ直す。自分はこの設定で落ち着いた。
Q3. 保護中にセルの書式変更やコメント追加を許可したい
Protect メソッドのオプション引数で細かく制御できる。
ws.Protect Password:="pass1234", _
AllowFormattingCells:=True, _
AllowInsertingHyperlinks:=True, _
AllowFiltering:=True
主なオプション:AllowFormattingCells(書式変更)、AllowFormattingColumns(列幅変更)、AllowFormattingRows(行高さ変更)、AllowInsertingHyperlinks(ハイパーリンク挿入)、AllowSorting(並び替え)。
Q4. セルの入力チェックも同時に入れたい
入力規則と組み合わせると効果的。入力セルにドロップダウンリストや数値制限を設定すれば、入力ミスをさらに減らせる。
Q5. シートの保護とブックの保護は何が違う?
シートの保護(Worksheet.Protect)はセル単位の編集制限。ブックの保護(Workbook.Protect)はシートの追加・削除・移動・名前変更の制限。両方かけることで、シートの構造と中身の両方を守れる。
—
まとめ
この記事では、VBAで特定セルだけ編集可能にして残りをロックする方法を紹介した。
- 基本の流れ:
Cells.Locked = True→ 入力セルだけLocked = False→Protect - 実務では: 名前定義で入力セルを管理し、パスワード+
UserInterfaceOnlyで安全に運用 - 注意点:
UserInterfaceOnlyはブックを閉じるとリセットされるため、Workbook_Openで再設定する
—
次にやりたくなること
- 特定シートだけ保護・解除する方法: 複数シートの保護をまとめて管理したい場合
- 入力フォーム(UserForm)で手入力ミスを防ぐ方法: セルのロックだけでなくフォームで入力を制御したい場合
- ブックを開いたとき・保存時に自動実行するイベント処理の方法: ブックを開くたびに自動で保護を適用したい場合
- 入力欄にドロップダウンリストも設定したい → 入力規則(ドロップダウンリスト)をVBAで一括設定する方法 で入力制限をさらに強化できる
- 入力値が正しいかVBAでチェックしたい → セルの入力値をVBAでチェック・制限する方法(数値のみ・日付のみ等) で数値のみ・日付のみなどの検証を自動化できる
- 入力フォーム(UserForm)で安全に入力させたい → 入力フォーム(UserForm)で手入力ミスを防ぐ方法 で保護シートへの入力をフォーム経由に切り替えられる
—
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "VBAで入力セルが複数の離れた範囲にある場合はどう指定する?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Range にカンマ区切りで複数範囲を指定できます(例:ws.Range(\"B2:B10, D2:D10\").Locked = False)。実務では名前定義に不連続範囲を登録すると管理が楽になります。"
}
},
{
"@type": "Question",
"name": "UserInterfaceOnlyの設定がブックを開き直すとリセットされるのはなぜ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "UserInterfaceOnly はExcelの仕様でブックを閉じるとリセットされます。ThisWorkbook モジュールの Workbook_Open イベントで Protect を再実行することで、開くたびに自動で設定できます。"
}
},
{
"@type": "Question",
"name": "VBAでシート保護中にオートフィルタや並び替えを許可するには?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Protect メソッドのオプション引数で AllowFiltering:=True(フィルタ許可)や AllowSorting:=True(並び替え許可)を指定します。"
}
},
{
"@type": "Question",
"name": "VBAでセルのロックと入力チェックを同時に設定できる?",
"acceptedAnswer": {
"@type": "Answer",
"text": "はい。Locked プロパティでロック制御し、Validation.Add で入力規則(ドロップダウンリストや数値制限)を同時に設定できます。"
}
},
{
"@type": "Question",
"name": "シートの保護とブックの保護の違いは?",
"acceptedAnswer": {
"@type": "Answer",
"text": "シートの保護(Worksheet.Protect)はセル単位の編集制限です。ブックの保護(Workbook.Protect)はシートの追加・削除・移動・名前変更を制限します。両方かけることでシートの構造と中身の両方を守れます。"
}
}
]
}


コメント