エクセルVBAを使ってシートの保護状態時にセルへの入力エラーを防ぐ方法

シートの操作

エクセルで作った住所録や成績表などで誤って計算式が消されないようにシートの保護設定をしている時に、テキストボックスから入力したらエラーになった経験ありませんか?

VBAコードの最初と最後にシートの保護・解除を指示するProtectメソッドを使えば、簡単に問題が解決できますよ。

VBAシートの保護エラー表示
シートの保護したらエラー表示!なぜ?
目次

シートを保護・解除するVBAコード

まずは一番シンプルで、いつも使っているシートの保護・解除するVBAコードで、ユーザーフォームに配置したコマンドボタンに書いているVBAコードです。

シートの保護するVBAコード

シートを保護するVBA

Private Sub CommandButton1_Click()
ActiveSheet.Protect
End Sub

解説
  1. コマンドボタン1が押されたら
  2. 表示中のシートにシートの保護を設定する
  3. マクロ終了

シートの保護解除するVBAコード

シートの保護解除するVBA

Private Sub CommandButton2_Click()
ActiveSheet.Unprotect
End Sub

解説
  1. コマンドボタン2が押されたら
  2. 表示中のシートにシートの保護を解除する
  3. マクロ終了

シートの解除で始まり保護で終える

VBAコードはSubで始まりEnd Subでプログラムが1行目から順番に作業を進めていきます。

シートの保護の状態では、セルにテキストボックスの値を書き写したり、並べ替えをしたりという作業(VBAコード)は一切できないのでエラーになってしまうので、下記のような手順でVBAコードを書きましょう。

  • シートの保護解除をする
  • 本来の作業を行うVBAコード
  • シートの保護をする

このように本来のVBAコードの1行前にシート保護解除コード、1行後にシート保護コードを入れるだけで、直感的には常にシートの保護状態になっているようにエクセルを操作できますよ。

シートの保護状態でもVBAでセル操作する

Private Sub CommandButton1_Click()
ActiveSheet.Protect
Range(“A1”).Value = UserForm1.TextBox1.Value
MsgBox “セルA1に入力されました”
ActiveSheet.Unprotect
End Sub

解説
  1. コマンドボタン1が押されたら
  2. 表示中のシートにシートの保護を解除をする
  3. セルA1の値はユーザーフォーム1のテキストボックス1の入力値とする
  4. 「セルA1に入力されました」とメッセージを表示する
  5. 表示中のシートにシートを保護設定をする
  6. マクロ終了

これは、セルA1にテキストボックスの値を書き込みメッセージ表示するのですが、シートが保護されているとセルA1に書き込めないので、まず解除して本来の作業を行い、保護を設定して終了するようになっています。

パスワード設定してシートの保護・解除をする方法

最初は使っていたのですが毎回パスワードを求められるので、 手間が面倒になり今は使っていないのですが、シートの保護・解除の時にパスワードを設定することができます。

パスワードは「tripbowl」にします。

パスワード付きシートの保護VBA

Private Sub CommandButton1_Click()
ActiveSheet.Protect Password:=”tripbowl”
End Sub

解説
  1. コマンドボタン1が押されたら
  2. 表示中のシートをパスワード「tripbowl」で設定し保護する
  3. マクロ終了

パスワードを入力してシートの保護を解除する

エラー防止の為、「パスワードが違います」とメッセージを表示準備します

パスワード付きシートの解除するVBA

Private Sub CommandButton1_Click()
On Error GoTo errhandler
ActiveSheet.Unprotect
Exit Sub
errhandler:
mggsgbox “パスワードが違います”
End Sub

解説
  1. コマンドボタン1が押されたら
  2. パスワードが違う時はerrhandlerの処理をする
  3. 表示中のシートでシートの保護を解除する
  4. 一旦処理終了
  5. エラー処理は
  6. パスワードが違いますとメッセージを表示する
  7. マクロ終了
目次