以前、EXCELの「シートの保護」についての設定手順を紹介致しました。
数式やタイトルなど、入力をして欲しくないセルに対して、変更をさせない様にするという処理です。
以前の設定については、手動の設定の方法について紹介致しました。
それでは、シートの保護をVBAのプログラムで行うとしたらどうなるかを、今回はご紹介致します。
考え方
ポイントは、以下の流れになります。
②選択した範囲のロックプロパティをtrueにする
③シートに保護をかける
以前のシートの保護の手順と流れは同じです。では、上記のポイントをプログラムに落とし込んでいきましょう。
セルの範囲を選択してLockedプロパティをTrueにする
ポイントの①と②の部分になります。
Rangeオブジェクトは「Locked」プロパティを持っています。選択したRangeオブジェクトに、「Locked」を加筆しましょう。
セルをロックする場合はtrue、セルのロックを解除する場合はfalseにします。
Range("範囲").Locked = True
これで選択範囲に対して、シートの保護をかけたらロックされるようになりました。(※この段階では、まだ保護されていません。)
シートの保護
続いて、シートの保護を行います。これはポイントの③の部分になります。シートの保護はProtectメソッドを使います。
'パスワードを指定しない場合 worksheets("シート名").Protect 'パスワードを指定する場合 worksheets("シート名").Protect Password:="パスワード"
※シート名とパスワードは任意の値です。また、上記は、シートを指定していますが、ActiveSheetでも可能です。
この処理で、ロックをかけたセルに対して保護がかかります。これでセルのロックからシートの保護の流れは完了です。
解除する場合(シートの保護解除)
シートの保護を行う上で押さえておきたいのが、シートの保護の解除です。解除する場合は、以下の様に記述します。
'パスワードを指定しない場合 worksheets("シート名").Unprotect 'パスワードを指定する場合 worksheets("シート名").Unprotect Password:="パスワード"
注意点
シートが保護された状態で、ロックのかかったセルに値を入力しようすると、メッセージが表示されます。
プログラム上でロックのかかったセルに対して処理を行おうとすると、エラーになります。
そのため、処理を行う際には、必ずシートの保護を解除しましょう。また、処理の完了後は再びシートの保護をかけましょう。
予めロックをかける範囲が決まっている場合は、手作業orプログラムでセルのロックを行い、シートの保護と保護解除を行う関数を作っておくと楽です。
そして、処理の前後にシートの保護と保護解除の関数を呼び出すとメンテナンスしやすいと思います。
サンプル
以下のサンプルは、保護と保護の解除を行う処理を関数化して使用する例です。参考にしてみてください。
'------------------------------------------------------------
' メイン処理
'------------------------------------------------------------
Private Sub CommandButton1_Click()
'処理前にシートの保護の解除をします。
Call SheetProtect(False)
'任意の処理がここに入ります
'処理後はシートを保護します。
Call SheetProtect(True)
End Sub
'------------------------------------------------------------
' シートの保護/保護解除の関数
' 引数:ProtectFlg (True:保護/False:保護解除)
'------------------------------------------------------------
Private Sub SheetProtect(ByVal ProtectFlg As Boolean)
'パスワードの定義
Dim password As String
password = "password"
'ProtectFlgがTrueなら保護
If (ProtectFlg) Then
Worksheets("sheet1").Protect password:=password
'ProtectFlgがFalseなら保護解除
Else
Worksheets("sheet1").Unprotect password:=password
End If
End Sub