エクセルVBAを使ってシートの保護状態時にセルへの入力エラーを防ぐ方法
エクセルで作った住所録や成績表などで誤って計算式が消されないようにシートの保護設定をしている時に、テキストボックスから入力したらエラーになった経験ありませんか?
VBAコードの最初と最後にシートの保護・解除を指示するProtectメソッドを使えば、簡単に問題が解決できますよ。
シートを保護・解除するVBAコード
まずは一番シンプルで、いつも使っているシートの保護・解除するVBAコードで、ユーザーフォームに配置したコマンドボタンに書いているVBAコードです。
シートの保護するVBAコード
Private Sub CommandButton1_Click()
ActiveSheet.Protect
End Sub
- コマンドボタン1が押されたら
- 表示中のシートにシートの保護を設定する
- マクロ終了
シートの保護解除するVBAコード
Private Sub CommandButton2_Click()
ActiveSheet.Unprotect
End Sub
- コマンドボタン2が押されたら
- 表示中のシートにシートの保護を解除する
- マクロ終了
シートの解除で始まり保護で終える
VBAコードはSubで始まりEnd Subでプログラムが1行目から順番に作業を進めていきます。
シートの保護の状態では、セルにテキストボックスの値を書き写したり、並べ替えをしたりという作業(VBAコード)は一切できないのでエラーになってしまうので、下記のような手順でVBAコードを書きましょう。
- シートの保護解除をする
- 本来の作業を行うVBAコード
- シートの保護をする
このように本来のVBAコードの1行前にシート保護解除コード、1行後にシート保護コードを入れるだけで、直感的には常にシートの保護状態になっているようにエクセルを操作できますよ。
Private Sub CommandButton1_Click()
ActiveSheet.Protect
Range(“A1”).Value = UserForm1.TextBox1.Value
MsgBox “セルA1に入力されました”
ActiveSheet.Unprotect
End Sub
- コマンドボタン1が押されたら
- 表示中のシートにシートの保護を解除をする
- セルA1の値はユーザーフォーム1のテキストボックス1の入力値とする
- 「セルA1に入力されました」とメッセージを表示する
- 表示中のシートにシートを保護設定をする
- マクロ終了
これは、セルA1にテキストボックスの値を書き込みメッセージ表示するのですが、シートが保護されているとセルA1に書き込めないので、まず解除して本来の作業を行い、保護を設定して終了するようになっています。
パスワード設定してシートの保護・解除をする方法
最初は使っていたのですが毎回パスワードを求められるので、 手間が面倒になり今は使っていないのですが、シートの保護・解除の時にパスワードを設定することができます。
パスワードは「tripbowl」にします。
Private Sub CommandButton1_Click()
ActiveSheet.Protect Password:=”tripbowl”
End Sub
- コマンドボタン1が押されたら
- 表示中のシートをパスワード「tripbowl」で設定し保護する
- マクロ終了
パスワードを入力してシートの保護を解除する
エラー防止の為、「パスワードが違います」とメッセージを表示準備します
Private Sub CommandButton1_Click()
On Error GoTo errhandler
ActiveSheet.Unprotect
Exit Sub
errhandler:
mggsgbox “パスワードが違います”
End Sub
- コマンドボタン1が押されたら
- パスワードが違う時はerrhandlerの処理をする
- 表示中のシートでシートの保護を解除する
- 一旦処理終了
- エラー処理は
- パスワードが違いますとメッセージを表示する
- マクロ終了