Excelシートを保護する。 記述方法とプロテクトされない操作

vbasheetprotecteyecatch

エクセルVBAでシートの保護を記述します。使用するメソッドはProtectとUnprotectになります。
保護しない操作もあり誤解ないようにしましょう。
スッキリしたコードの書き方も紹介します。

こんにちは じゅんぱ店長 (@junpa33) です。

大事なデータが入っているエクセルシート、時間をかけて作り込んだテンプレートシート、入力内容を指示する項目文字などなど、他の人に壊してほしくないものがたくさんあります。

シートの保護とは、そういった時に利用するエクセルの機能です。

エクセルを管理する立場になる人は、安心安全のためにも、この保護機能について知っておくことが必要です。

シートの保護を行うVBAコード

シートの保護は、エクセルシート上から実行することが出来ます。

また、VBAから実行した場合は、エクセルシート上でのセル操作は保護機能で拒否されるだけでなく、VBE(ビジュアルベーシックエディタ)上からでも、セルの操作についてのVBAコードの実行は拒否されることになります。

シートの保護に関与するメソッド

シートの保護には、Protectメソッド(保護)とUnprotectメソッド(保護解除)を使用します。

さらに保護するProtectメソッドにはパスワード(Password)という引数を指定することが出来ます。

保護の構文

シートオブジェクト.Protect

例.

Activesheet.Protect

Worksheets(“Sheet1”).Protect

保護解除の構文

シートオブジェクト.Unprotect

例.

Activesheet.Unprotect

Worksheets(“Sheet1”).Unprotect

パスワード保護の構文

シートオブジェクト.Protect Password:= ” パスワード “

例.

Activesheet.Protect Password := “9999”

Worksheets(“Sheet1”).Protect Password := “abcd”

パスワード保護解除の構文

シートオブジェクト.Unprotect Password:= ” パスワード “

例.

Activesheet.Unprotect Password := “9999”

Worksheets(“Sheet1”).Unprotect Password := “abcd”

パスワードで使用できる文字は、” 英数字と記号 ”が推奨されています。

では日本語入力は不可かというと、そうではありません。VBAコードで日本語パスワードも設定可能です。

たとえば、 Activesheet.Protect Password := “シートロック” とか

日本語パスワードが推奨されない理由

保護されたシートの利用者は、シート上からの操作で「シート保護の解除」によりパスワード入力ボックスから、ワード入力をしてシート保護解除を行います。

(校閲タブからシートの保護解除を選択)

パスワード入力ボックス

問題はこの入力ボックスにキーボードから入力できる文字は、” 英数字と記号 ”のみ。キーボードから日本語変換しての日本語入力は出来ません。

ただし、コピペからの日本語入力は可能です。なのでその分操作に、ふた手間かかります。

この日本語パスワード設定の不便さを、逆にパスワード解除難易度を上げるための方法にするという考えも出来ます。

シート上では保護かつVBEでは保護解除できるVBAコード

Protectメソッドで、引数UserInterfaceOnly を設定すれば、シート上からはセルの操作は保護され、VBAからのセル操作は保護されずに変更が可能になります。

VBA
Sub シート保護VBE解除1()
    ActiveSheet.Protect UserInterfaceOnly:=True
    Range("B3") = "テスト"
End Sub
VBEからは入力可能

シート上からの操作は保護されますが、VBEからはセル入力が可能になります。

シート上でセル操作は出来ない

VBEからセルに追記入力する場合は次の方法で可能です。

同じプロシージャーに追記する方法

VBA
Sub シート保護VBE解除1()
    ActiveSheet.Protect UserInterfaceOnly:=True
    Range("B3") = "テスト"
    Range("B5") = "サンプル"
End Sub
同じプロシージャーに追記

別のプロシージャーで追記する方法

VBA
Sub シート保護VBE解除2()
    Range("B7") = "例題"
End Sub
別のプロシージャーに追記
シート保護の状態でエクセルを終了。再起動すると・・・

シートを、” UserInterfaceOnly:=True ” の状態で終了。エクセルを再度立ち上げます。

シート上からは保護か継続されていますが、VBEも保護された状態に変更されます。

続きでVBA記述でセルに追記しようとした時、エラーが発生します。

VBA
Sub シート保護VBE解除2()
    Range("B7") = "例題"
End Sub
エクセル再起動後はエラーとなる

この場合のエラー回避方法としては、再度、” UserInterfaceOnly:=True ” を記述することで解決します。

VBA
Sub シート保護VBE解除3()
    ActiveSheet.Protect UserInterfaceOnly:=True
    Range("B7") = "例題"
End Sub

VBA記述でのオススメのシート保護コードの書き方

VBAコードを書く時にどの部分でシートの保護コードを記述しようかと迷うことがあります。

そんな時は、迷わず一番最初、変数の宣言前(Dimの上)に記述しましょうと言いたいです。

  1. 一番最初に保護解除のコード
  2. 一番最後に保護開始のコード

をオススメします。

書き方のサンプルとしては、このような感じでしょうか。

VBA
Sub 何かを実行()
'************
Dim PassWd As String
PassWd = "△△△△"
Worksheets("□□□").Unprotect Password:=PassWd
'************
    Dim i As Long
    
        ・・・・・・
        
        ・・・・・・
        
        ・・・・・・
    
    Worksheets("□□□").Protect Password:=PassWd

End Sub

UnprotectとProtect内でVBAの実行コードを記述するという方法です。

パスワード変更は、はじめの PassWd = “△△△△” を変更するだけです。

シートの保護では保護できない操作

以下の項目はいずれもシート保護に関係なく実行することが出来ます。

これらの操作を保護するのはブックの保護の範疇になるということです。

これらの操作を止める(不可)にするためには、エクセルBOOK自体を保護する必要があります。

保護されたシートを選択する

「シートの選択」の操作は保護の機能とは切り離された操作です。どのような保護状態でも操作可能です。

VBA
Sub シート保護外1()
    ActiveSheet.Protect
    Worksheets("Sheet1").Select
End Sub
シートを選択する

指定のシートのセルに値を入力する

保護対象外のシートのセルへの操作なので実行可能です。

VBA
Sub シート保護外2()
    ActiveSheet.Protect
    Worksheets("Sheet2").Range("B3") = "テスト"
End Sub
Sheet2のセルに文字入力

保護されたシートを移動する

シートのセルに対しての変更操作ではないので実行可能です。

VBA
Sub シート保護外3()
    ActiveSheet.Protect
    ActiveSheet.Move after:=Worksheets(Worksheets.Count)
End Sub
保護されたシートも移動可能

保護されたシートの名前を変更する

シート名を変更することも可能です。

VBA
Sub シート保護外4()
    ActiveSheet.Protect
    ActiveSheet.Name = "TESTsheet"
End Sub
シート名の変更が出来る

保護されたシートをコピーする

シートをコピーすることも出来ます。ただし、この場合はコピーされたシートの保護状態は引き継がれません。

VBA
Sub シート保護0外5()
    ActiveSheet.Protect
    ActiveSheet.Copy after:=Worksheets(1)
End Sub
保護されたシートもコピーできる
VBA
Sub シート保護0外5_1()
    ActiveSheet.Protect
    ActiveSheet.Cells.Copy Destination:= _
                        Worksheets("Sheet3").Range("A1")
End Sub

こちらのコードでも同様に、Sheet3にコピーが実行されますがシートの保護は引き継がれません。

保護されたシートを削除する

保護されたシートを削除することも出来ます。

VBA
Sub シート保護外6()
    ActiveSheet.Protect
    ActiveSheet.Delete
End Sub
保護されたシートを削除した

まとめ

シートの保護とは、保護対象のシートのセルの変更に対してプロテクトするということです。

さらに関連項目としてセルの保護についても知っておく必要があります。

vbacellsprotecteyecatch「セルの保護」の設定VBAを最速理解

テンプレートシートなどの場合は、入力要求のための項目のセルを保護したいとか、自動計算表示のセルを保護したいとかあると思います。

こうしたケースでは、セルの保護とシートの保護は1セットで考える必要があります。

また、セルを編集変更しなければ、シートをコピーしたり移動したり削除さえしてもプロテクトの対象の変更とはなりません。

セルの保護がシートの保護を有効にしないといけないのと同じように、これらのシート自体の変更への保護はブックの保護を有効にするようにしてください。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

「エクセルVBA最速理解」の記事一覧を開く

「エクセルVBA業務ツール」の記事一覧を開く

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。