【VBA】特定セルだけ編集可能にして残りをロックする方法(コピペOK)

VBA
スポンサーリンク

記事ID: 132
タイトル: 特定セルだけ編集可能にして残りをロックする方法
カテゴリ: シート操作
一次キーワード: VBA セル ロック 編集制限 一部
想定読者: 入力用シートで「触ってほしくないセル」を保護したい実務担当者
検索意図: VBAで特定セルだけ編集可能にして、残りのセルをロック(保護)したい
読者の悩み(1文): シートを保護すると全セルが編集不可になり、入力欄まで操作できなくなる。
読了後にできること(1文): VBAで特定のセルだけ編集可能にして残りをロックし、入力ミスや数式の上書きを防げるようになる。
前提条件:
  - Excel版: Excel 2016以降 / Microsoft 365
  - OS: Windows 10/11
  - 保存形式: .xlsm(マクロ有効ブック)
  - 貼り付け場所: 標準モジュール
  - 実行方法: Alt+F8 → マクロ実行 / ボタン割り当て
更新日: 2026-03-24

スポンサーリンク

この記事でわかること

  • VBAで特定セルだけ編集可能にして、残りを一括ロックできる
  • Cells.LockedSheet.Protect の組み合わせで入力欄以外を保護できる
  • 名前定義で入力セルを管理し、パスワード付き保護で安全にシートを運用できる

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

どんな場面で使う?

  • 入力シートの数式や見出しをユーザーに書き換えられないよう保護したいとき
  • 入力欄だけ編集可能にして残りをすべてロックしたいとき
  • パスワード付きで保護して配布時のセキュリティを高めたいとき
  • VBAからの操作は許可しつつ手動操作だけ制限したいとき

完成イメージ(Before / After)

Before(手作業): 「セルの書式設定 → 保護 → ロック」をセルごとに切り替え → シート保護。セルが多いと漏れが出る。

After(VBA実行後): ボタン1つで「入力セルだけ編集可能、残りはすべてロック」が完了。保護の掛け忘れや解除し忘れがなくなる。

自分も以前、入力シートを配布するたびに「数式が消された」「見出しが書き換わった」とトラブルが起きていた。シート保護を手動で設定していたが、入力欄のロック解除が漏れて「入力できません」と問い合わせが来る。正直めんどくさかった。VBAで入力セルだけ自動でロック解除→保護するようにしてからは、配布前の作業が30秒で終わるようになった。同じように「一部だけ入力可能にしたい」と思っている人が、この記事でサクッと設定できるようになればうれしい。

VBAの Locked プロパティ+ Protect メソッドを使えば、特定セルだけ編集可能にして残りをロックできる。

なお、シート保護・解除の基本操作は 特定シートだけ保護・解除する方法 を参照。入力規則(ドロップダウンリスト)と組み合わせれば入力制限をさらに強化できる。詳しくは 入力規則(ドロップダウンリスト)をVBAで一括設定する方法 を参照。

実行前の準備

バックアップを取る

シートの保護状態を変更する操作です。データは消えませんが、既存の保護設定が上書きされるため、念のためファイルのコピーを別フォルダに保存してから実行してください。

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. 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 で保護中もオートフィルタ操作を許可。実務では必須級のオプション
  • 入力セルに薄い黄色をつけて「ここに入力してください」と視覚的に伝える

名前定義「入力範囲」の作り方

  1. 入力させたいセルを選択(Ctrlキーを押しながら複数選択可能)
  2. 名前ボックス(数式バーの左にあるセル番地が表示される欄)に「入力範囲」と入力して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からセルに値を書き込めない ProtectUserInterfaceOnly:=True を指定していない 実務版のように UserInterfaceOnly:=True を必ず指定する。ただしブックを閉じると設定がリセットされるので注意(後述FAQ参照)
4 パスワードなしで保護を解除されてしまう Protect にパスワードを指定していない ws.Protect Password:="pass1234" のようにパスワードを指定する。ただしVBAのパスワードは簡易的な保護であり、完全なセキュリティ対策にはならない
5 名前定義「入力範囲」がエラーになる 名前定義がシートスコープではなくブックスコープで定義されている、または名前が全角/半角で異なる 名前の管理(Ctrl + F3)で名前のスコープと綴りを確認する。自分もこれで30分溶かした。「入力範囲」と「入力範囲 」(末尾にスペース)で別物扱いになる
6 保護中にオートフィルタが使えない ProtectAllowFiltering を指定していない 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 = FalseProtect
  • 実務では: 名前定義で入力セルを管理し、パスワード+UserInterfaceOnly で安全に運用
  • 注意点: UserInterfaceOnly はブックを閉じるとリセットされるため、Workbook_Open で再設定する

次にやりたくなること

コメント

タイトルとURLをコピーしました