エクセル住所録や成績表などで誤って計算式が入っているセルを消されないように、シートの保護を設定していることありませんか?
これで安心と思ってユーザーフォームに配置された、テキストボックスの値をセルに転記しようとしたら、エラー表示!!


VBAの動作確認が終わり、仕上げにシートの保護したらエラーっていう経験思い出しますね。
まずは基本からおさらいしましょう。
シートを保護・解除する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(“S2”).Value = UserForm1.TextBox1.Value
MsgBox “本年度期間開始日が変更されました”
ActiveSheet.Unprotect
End Sub
- コマンドボタン1が押されたら
- 表示中のシートにシートの保護を解除をする
- セルS2の値はユーザーフォーム1のテキストボックス1の入力値とする
- 「本年度期間開始日を更新しました」とメッセージを表示する
- 表示中のシートにシートを保護設定をする
- マクロ終了
これは、セルS2にテキストボックスの値を書き込みメッセージ表示するのですが、シートが保護されているとセルS2に書き込めないので、まず解除して本来の作業を行い、保護を設定して終了するようになっています。

とても簡単なので、ぜひ活用してくださいね。
パスワード設定してシートの保護・解除をする方法
最初は使っていたのですが毎回パスワードを求められるので、 手間が面倒になり今は使っていないのですが、シートの保護・解除の時にパスワードを設定することができます。
パスワード付きシートの保護・解除
パスワードは「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の処理をする
- 表示中のシートでシートの保護を解除する
- 一旦処理終了
- エラー処理は
- パスワードが違いますとメッセージを表示する
- マクロ終了