シートの保護と解除の方法まとめ

今回の目標

「シートの保護の引数が多すぎる…」や「引数を設定したのに行を削除できない!」、「マクロだけ動かしたい…」と悩んでるあなたへ。 この記事では、VBAでシートの保護をする方法と様々な引数について、サンプルを用いて丁寧に解説します!

目標リスト

  • シートの保護の設定ができるようになる
  • シートの保護の解除ができるようになる
  • シートの保護の引数を理解する
  • セルのロックの解除が必要な引数を知る

説明

シートの保護とは?

シートの保護は、Excelシートのデータやグラフ、図形を変更できないようにロックをかけることです。シートの保護をかけると、デフォルトでは閲覧とコピーしかできなくなります。 これにより、誤操作や、データの改ざんを防ぐことができます。 なお、シートの保護の設定をする際、「行の挿入は可能」等、機能別にロックを掛けないこともできます。

VBAで、シートの保護を設定する

Protect でシートの保護をする

一番簡単なシートの保護の設定方法は次の通りになります。

シートオブジェクト.Protect

一番簡単なシートの保護の設定方法は次の通りになります。

シートオブジェクト.Protect Password, DrawingObjects, Contents, Scenarios, UserInterfaceOnly, AllowFormattingCells, AllowFormattingColumns, AllowFormattingRows, AllowInsertingColumns, AllowInsertingRows, AllowInsertingHyperlinks, AllowDeletingColumns, AllowDeletingRows, AllowSorting, AllowFiltering, AllowUsingPivotTables
Microsoftのリファレンス(構文)では最後の引数が「AllowUsingPivotTabless」となっていますが、誤記の可能性があります。
Protect 引数の一覧

下記、引数は全て省略可能です。

引数規定値説明
Passwordブランクシートの保護を解除する際、パスワードが必要となります。パスワードは大文字と小文字を区別します。設定を省略すると、シートの保護の解除をする時にパスワードを入力せず解除できます。
DrawingObjectsTrueFalseの時、保護をかけたシートにある図形・画像・グラフ・ボタンを編集・移動・削除できるようになります。
ContentsTrueFalseの時、ワークシートのセルの編集が可能となります。シートの保護の対象がグラフシートの場合、グラフ全体が保護されます。
ScenariosTrueFalseの時、What-If分析のシナリオの削除・編集の使用が可能となります。なお、データテーブルを使用したい場合は、セルのロックを解除する必要があります。
UserInterfaceOnlyFalseTrueの時、Excelのシート画面から変更は出来なくなりますが、マクロからの変更が可能となります。ただし、ブックを閉じるとマクロから変更できなくなります。
AllowFormattingCellsFalseTrueの時、ワークシートのセルを書式(フォント、背景色、罫線等)を変更することができます。
AllowFormattingColumnsFalseTrueの時、列の表示・非表示の切り替え、列の幅の変更を許可しますが、書式(フォントや背景色など)は設定できません。書式設定の変更を許可するには「AllowFormattingCells」を使用します。
AllowFormattingRowsFalseTrueの時、行の表示・非表示の切り替え、行の高さの変更を許可しますが、書式(フォントや背景色など)は設定できません。書式設定の変更を許可するには「AllowFormattingCells」を使用します。
AllowInsertingColumnsFalseTrueの時、列の挿入を許可します。
AllowInsertingRowsFalseTrueの時、行の挿入を許可します。
AllowInsertingHyperlinksFalseこの引数をTrueにするとハイパーリンクを設定できます。ただし、シートの保護をかける前にハイパーリンクを挿入したいセルのロックを解除している必要があります※。
AllowDeletingColumnsFalseTrueの時、列を削除することができます。ただし、シートの保護をかける前に削除したい列すべてのセルのロックを解除している必要があります※。
AllowDeletingRowsFalseTrueの時、行を削除することができます。ただし、シートの保護をかける前に削除したい行すべてのセルのロックを解除している必要があります※。
AllowSortingFalseTrueの時、保護されたワークシートで並べ替えを行うことができます。ただし、シートの保護を掛ける前にソートしたい表全てのセルのロックを解除している必要があります※。
AllowFilteringFalseTrueの時、ワークシートにフィルターで絞り込むことができます。
AllowUsingPivotTablesFalseTrueの時、ピボットテーブルの操作ができるようになります。ただし、シートの保護をかける前にセルのロックを解除している必要があります
※ ロックの解除をすると、解除されたセルはテキストを書き換えられるため注意が必要です。

VBAで、シートの保護を解除する

Unprotect でシートの保護を解除する

一番簡単なシートの保護の解除方法は次の通りになります。

シートオブジェクト.Unprotect
Unprotect 引数の一覧

下記、引数は全て省略可能です。

引数規定値説明
Passwordブランク既に設定されているシートの保護を解除するためのパスワードを入力します。パスワードは大文字と小文字を区別します。

実用サンプル

1.基本

1-1.シートの保護をする

シートの保護を設定するには、シートオブジェクトの「Protect」メソッドを使用します。
シートの保護の解除にパスワードが不要、かつユーザーにセルの変更や画像の追加等の操作を許可しない場合、引数が不要です。

サンプルコード

Sub SampleProtect1_1()
    'シートの保護をかける(解除のパスワードなし)
    ActiveSheet.Protect
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更、図形等への操作ができなくなります。 ただし、ロックが解除されたセルは入力・変更が可能です。
シートの保護の解除にパスワードの入力は不要です。

1-2.シートの保護を解除する

シートの保護を解除するには、シートオブジェクトの「Unprotect」メソッドを使用します。
シートの保護の解除にパスワードが入力不要の場合、引数が不要です。 パスワードが必要な場合で引数がない場合、マクロ実行中にパスワードが問われます。

サンプルコード

Sub SampleProtect1_2()
    'シートの保護を解除する
    ActiveSheet.Unprotect
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
ただし、シートの保護が解除され、セルへの入力や図形等の操作が可能となります。

1-3.パスワードをかけて、シートの保護をする

シートの保護の解除する際にパスワードを入力させたい場合、Protectメソッドの「Password」にパスワードを設定します。
パスワードを設定した場合、解除するにはパスワードが必須となります(当然です)。忘れてしまうと、原則、解除できなくなってしまうため管理はしっかりしましょう。

サンプルコード

Sub SampleProtect1_3()
    'パスワード「hoge」で、シートの保護をかける
    ActiveSheet.Protect "hoge"
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更、図形等への操作ができなくなります。 ただし、ロックが解除されたセルは入力・変更が可能です。
シートの保護の解除にパスワードの入力が必要です。正しいパスワードが入力されない限り、シートの保護が解除されることはありません。

1-4.パスワードのあるシートの保護を解除する

パスワードが設定されているシートの保護を解除する際、Unprotectメソッドの「Password」にパスワードを設定します。

引数のパスワードが正しくないと「実行時エラー1004」が発生します。正しいパスワードが入力されない限り、シートの保護が解除されることはありません。
余談ですが、パスワードのないシートの保護に対し、今回のようにシートの保護のパスワードの解除の引数を送ると、通常通りシートの保護が解除されます。

サンプルコード

Sub SampleProtect1_4()
    'シートの保護をパスワード「hoge」で解除する
    ActiveSheet.Unprotect "hoge"
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
ただし、シートの保護が解除され、セルへの入力や図形等の操作が可能となります。

2.操作の制限の許可

2-1.図形・画像・グラフ等の操作を許可する

図形・画像・グラフ等の操作を許可するには、Protectメソッドの「DrawingObjects」を『False』にします。

サンプルコード

Sub SampleProtect2_1()
    'シートの保護をかける(図形・画像・グラフ等の操作を許可する)
    ActiveSheet.Protect DrawingObjects:=False
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
セルへの入力や変更はできなくなりますが、図形・グラフ等の操作は可能です。

2-2.セルの編集を許可する

セルの編集を許可するには、Protectメソッドの「Contents」を『False』にします。 セルに入力、挿入・削除、書式設定の変更が可能となります。

サンプルコード

Sub SampleProtect2_2()
    'シートの保護をかける(セルの編集を許可する)
    ActiveSheet.Protect Contents:=False
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
セルの編集は可能ですが、図形・グラフ等の操作はできなくなります。

2-3.セルの書式設定の変更を許可する

セルの書式設定の変更を許可するには、Protectメソッドの「AllowFormattingCells」を『True』にします。
セルのフォントや背景色の変更が可能となります。なお、図形・グラフ等の文字の書式設定は変更できません。

サンプルコード

Sub SampleProtect2_3()
    'シートの保護をかける(セルの書式設定の変更を許可する)
    ActiveSheet.Protect AllowFormattingCells:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
セルのフォントの変更は可能ですが、セルへの入力や変更はできなくなります。

2-4.列の表示・非表示、幅の変更を許可する

列の表示・非表示、幅の変更を許可するには、Protectメソッドの「AllowFormattingColumns」を『True』にします。
書式(フォントや背景色など)は設定できません。書式設定の変更を許可するには「AllowFormattingCells」を使用します。

サンプルコード

Sub SampleProtect2_4()
    'シートの保護をかける(列の表示・非表示、幅の変更を許可する)
    ActiveSheet.Protect AllowFormattingColumns:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
列の表示・非表示の切り替え、列の幅の変更は可能ですが、セルへの入力や変更および図形・グラフ等の操作はできなくなります。
ただし、列の表示・非表示、列の幅の変更にともなう画像の幅の自動調整、表示位置の変更は行われます。

2-5.行の表示・非表示、高さの変更を許可する

行の表示・非表示、幅の変更を許可するには、Protectメソッドの「AllowFormattingRows」を『True』にします。
書式(フォントや背景色など)は設定できません。書式設定の変更を許可するには「AllowFormattingCells」を使用します。

サンプルコード

Sub SampleProtect2_5()
    'シートの保護をかける(行の表示・非表示、幅の変更を許可する)
    ActiveSheet.Protect AllowFormattingRows:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更が制限されます。
行の表示・非表示の切り替え、行の高さの変更は可能ですが、セルへの入力や変更および図形・グラフ等の操作はできなくなります。
ただし、行の高さの変更にともなう画像の高さの自動調整、表示位置の変更はされます。

3.挿入・削除の許可

3-1.列の挿入を許可する

列の挿入を許可するには、Protectメソッドの「AllowInsertingColumns」を『True』にします。

サンプルコード

Sub SampleProtect3_1()
    'シートの保護をかける(列の挿入を許可する)
    ActiveSheet.Protect AllowInsertingColumns:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
列の挿入は可能ですが、セルへの入力や変更および図形・グラフ等の操作はできなくなります。 ただし、列の挿入にともなう画像の幅の自動調整、表示位置の変更は行われます。

3-2.行の挿入を許可する

行の挿入を許可するには、Protectメソッドの「AllowInsertingRows」を『True』にします。
なお、誤って行を挿入した時、削除できません。元に戻す(Ctrl)操作をしましょう。

サンプルコード

Sub SampleProtect3_2()
    'シートの保護をかける(行の挿入を許可する)
    ActiveSheet.Protect AllowInsertingRows:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
行の挿入は可能ですが、セルへの入力や変更および図形・グラフ等の操作はできなくなります。 ただし、行の挿入にともなう画像の幅の自動調整、表示位置の変更は行われます。

3-3.列の削除を許可する

列の削除を許可するには、Protectメソッドの「AllowDeletingColumns」を『True』にします。
Excelの仕様上、シートをProtectで保護する前に、削除対象となる列のセルのロックを解除しておく必要があります。

サンプルコード

Sub SampleProtect3_3()
    '1列目のセル全てのロックを解除する
    ActiveSheet.Columns(1).Locked = False
    'シートの保護をかける(列の削除を許可する)
    ActiveSheet.Protect AllowDeletingColumns:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
列の削除は可能ですが、セルへの入力や変更および図形・グラフ等の操作はできなくなります。 ただし、列の削除にともなう画像の幅の自動調整、表示位置の変更は行われます。

3-4.行の削除を許可する

行の削除を許可するには、Protectメソッドの「AllowDeletingRows」を『True』にします。
Excelの仕様上、シートをProtectで保護する前に、削除対象となる行のセルのロックを解除しておく必要があります。

サンプルコード

Sub SampleProtect3_4()
    '1行目のセル全てのロックを解除する
    ActiveSheet.Rows(1).Locked = False
    'シートの保護をかける(行の削除を許可する)
    ActiveSheet.Protect AllowDeletingRows:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
行の削除は可能ですが、セルへの入力や変更はできなくなります。 図形・グラフ等の操作は、できなくなります。ただし、行の削除にともなう画像の高さの自動調整、表示位置の変更は行われます。

4.分析・その他

4-1.ソートを許可する

ソートを許可するには、Protectメソッドの「AllowSorting」を『True』にします。
Excelの仕様上、シートをProtectで保護する前に、ソートする表のセルのロックを解除しておく必要があります。

注意点

シートが保護されているときのソートは注意が必要です。
フィルターのボタンによるソートはできません。
compare の予測変換

リボンのホームタブにある「並び替えとフィルターボタン」から、並び替えが出来ます。

compare の予測変換

サンプルコード

Sub SampleProtect4_1()
    'セルB2の範囲のセルのロックを解除する
    Range("B2").CurrentRegion.Locked = False
    ' シートの保護をかける(ソートを許可する)
    ActiveSheet.Protect AllowSorting:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更、図形等への操作ができなくなります。
ただし、シート内のソートが可能です。

4-2.フィルターの絞り込みを許可する

フィルターの絞り込みを許可するには、Protectメソッドの「AllowFiltering」を『True』にします。
なお、フィルターを新規設置することは、原則できません。

サンプルコード

Sub SampleProtect4_2()
    ' シートの保護をかける(オートフィルターを許可する)
    ActiveSheet.Protect AllowFiltering:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更、図形等への操作ができなくなります。
ただし、フィルターによる絞り込みが可能です。

コラム:フィルターを新規設置する小技

AllowFilteringをTrueにするだけでは、フィルターを設置することが出来ません。 リボンのデータタブにあるフィルターのアイコンがグレーアウトされており、クリックすることができません。
リボンのフィルターのボタン
この、抜け道を説明します。
なお、Excelのバージョンや更新により仕様が変更される可能性があります。

1.フィルター を付けたい表を右クリックする
売上表を右クリックする
2.フィルター をクリックする
フィルターをクリックする
3.選択したセルの値でフィルター をクリックする
どれかでフィルターをかける
4.フィルター(絞り込み済) をクリックする
フィルターが設置されるが、絞り込みされているので解除する
5.(列名)からフィルターをクリア をクリックする
リボンのフィルターのボタン
6.フィルターのある表になりました!
リボンのフィルターのボタン

4-3.ピボットテーブルの操作を許可する

ピボットテーブルの操作を許可するには、Protectメソッドの「AllowUsingPivotTables」を『True』にします。
Excelの仕様上、シートをProtectで保護する前に、ピボットテーブルのセルのロックを解除しておく必要があります。

サンプルコード

Sub SampleProtect4_3()
    'セルB2の範囲のセルのロックを解除する
    Range("B2").CurrentRegion.Locked = False
    'シートの保護をかける(ピボットテーブルの一部操作を許可する)
    ActiveSheet.Protect AllowUsingPivotTables:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更、図形等への操作ができなくなります。
ただし、ピボットテーブルの操作が可能です。

4-4.マクロによる変更のみ許可する

マクロによる変更を許可するには、Protectメソッドの「UserInterfaceOnly」を『True』にします。

注意点

ブックを閉じると、シートの保護は有効ですが、マクロによる変更の許可が無効となります。
そのため、ブックを開いた際に再度マクロによる変更を許可する必要があります。 具体的にはブックを開いた直後に呼ばれるイベント「Workbook_Open」でシートの保護を解除した直後、マクロによる変更を許可してシートの保護をかけます。

シートの保護をかける(マクロによる変更を許可する)

サンプルコード
Sub SampleProtect4_4()
    'シートの保護をかける(マクロによる変更を許可する)
    ActiveSheet.Protect UserInterfaceOnly:=True
End Sub
出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更、図形等への操作ができなくなります。
ただし、マクロによるセルや図形等への操作は可能です。

ブックを開いた際に、マクロによる変更を許可して、シートを保護する

サンプルコード
'「ThisWorkbook」モジュールに記載すること!
Private Sub Workbook_Open()
    Worksheets("Sheet1").Unprotect
    Worksheets("Sheet1").Protect UserInterfaceOnly:=True
End Sub
出力結果

ブックを開くと自動的に実行されます。
初めて開くブックの場合は、マクロを有効化するか訊かれます。
「はい」をクリックしたときに実行されます。

4-5.ハイパーリンクの設定を許可する

ハイパーリンクの挿入を許可するには、Protectメソッドの「AllowInsertingHyperlinks」を『True』にします。
なお、Excelの仕様上、シートをProtectで保護する前に、ハイパーリンクを挿入するセルのロックを解除しておく必要があります。
※ セルのロックを解除しただけでは、URLをセルへ入力してもハイパーリンクが挿入できません。

サンプルコード

Sub SampleProtect4_5()
    'リンクを挿入するセル(今回はA1)のロックを解除する
    ActiveSheet.Range("A1").Locked = False
    'シートの保護をかける(ハイパーリンクの挿入を許可する)
    ActiveSheet.Protect AllowInsertingHyperlinks:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更、図形等への操作ができなくなります。
ただし、ハイパーリンクの挿入が可能です。

4-6.What-If分析のシナリオの変更を許可する

What-If分析のシナリオの変更・削除を許可するには、Protectメソッドの「Scenarios」を『False』にします。
なお、シナリオの追加は本引数を指定しなくても可能です。
シートにシナリオを「表示」させる場合には、「Contents:=False」の併用が必要です。

サンプルコード

Sub SampleProtect4_6()
    'シートの保護をかける(シナリオの変更を許可する)
    ActiveSheet.Protect Scenarios:=False
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となり、セルへの入力や変更、図形等への操作ができなくなります。
ただし、シナリオの変更・削除が可能です。

引数を設定しても機能しない?

【原因】Protect を2回以上行っている

【原因を理解する】
既にシートの保護が掛けられているシートへ、更にシートの保護を掛けようとすると無視されます。この時、最初にかけられた保護の設定のみ有効となり、2回目以降に保護を掛けた設定は無視されます。

サンプルコード

Sub SampleProtectMiss1_1()
    '全てを許可しないで、シートの保護をかける
    ActiveSheet.Protect    '←消し忘れ
    '既にシートが保護されているため、次の処理自体が無視される
    ActiveSheet.Protect AllowFormattingRows:=True
    '全てを許可されない状態のシートの保護のため、エラー
    ActiveSheet.Rows("1:1").Hidden   '←ここで、エラーが発生
End Sub

出力結果

実行時エラー '1004'
Range クラスの Hidden メソッドが失敗しました。

【対応方法を知る】
不要なProtectは削除すべきですが、何らかの理由で難しい場合があります。
シートを保護する前に「Unprotect」を使い、保護を解除してからProtect で保護をかける方法があります。なお、シートが保護されていない状態で「Unprotect」を使用してもエラーになりません。

サンプルコード

Sub SampleProtectMiss1_2()
    '全てを許可しないで、シートの保護をかける
    ActiveSheet.Protect    '← 消し忘れ?

    'シートの保護を許可する
    ActiveSheet.Unprotect
    '既にシートの保護がかかっているため、次の処理自体が無視される
    ActiveSheet.Protect AllowFormattingRows:=True
    '全てを許可されない状態のシートの保護のため、エラー
    ActiveSheet.Rows(1).Hidden = True   '←ここで、エラーが発生する
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。

特定の許可後、マクロの処理は可能だが、エクセル(GUI)からはできない?

【原因】セルのロックの解除を忘れている

エクセルの仕様で、次の操作はマクロからは操作ができますが、エクセルのシート上(GUI)の操作ができません。

  • セル(行・列)の削除

  • ソートによる並び替え

  • ハイパーリンクの挿入

  • ピボットテーブルの操作

エクセルのシート上による操作を行いたい場合、セルのロックの解除を行ったうえで、Protectのメソッドを指定する必要があります。
サンプルコードにロックの解除をするマクロを記載します。
セルのロックがかけられているかは、セルの書式設定の保護タブから確認できます。
compare の予測変換

サンプルコード

Sub SampleProtectMiss2()
    '1列目のセル全てのロックを解除する
    ActiveSheet.Columns(1).Locked = False  '←これがないとGUI操作ができない
    'シートの保護をかける(列の削除を許可する)
    ActiveSheet.Protect AllowDeletingColumns:=True
End Sub

出力結果

このマクロを実行しても、見た目の変化や出力はありません。
シートが保護された状態となります。
列の削除は可能ですが、セルや画像等の操作が出来なくなります。

関連リンク

ページの先頭へ