数式や重要なデータが入力されているシートを、ユーザーに誤って変更されないように保護したい、という場面はよくあります。VBAを使えば、シートの保護と、その解除を自動的に行うことができます。
この記事では、ワークシートをパスワード付きで保護する.Protect
メソッドと、保護を解除する.Unprotect
メソッドの基本的な使い方、そしてマクロ実行の邪魔にならない保護の方法という応用テクニックまでを解説します。
ワークシートを保護する方法 (.Protect
)
.Protect
メソッドは、指定したワークシートを保護し、セルの編集などを制限します。
コードと解説
Sub ProtectSheetWithPassword()
' 変数を宣言します
Dim targetSheet As Worksheet
Dim sheetPassword As String
' 保護したいシートとパスワードを設定
Set targetSheet = ThisWorkbook.Worksheets("Report")
sheetPassword = "p@ssw0rd"
' --- シートをパスワード付きで保護 ---
targetSheet.Protect Password:=sheetPassword
MsgBox "「" & targetSheet.Name & "」シートを保護しました。"
End Sub
targetSheet.Protect
: 対象のシートを保護します。Password:=sheetPassword
: 保護を解除する際に必要となるパスワードを指定します。この引数を省略すると、パスワードなしで保護されます。
【応用】マクロからは編集可能にする保護方法
シートを保護すると、通常はVBAマクロからのセル編集もブロックされてしまいます。しかし、.Protect
メソッドの**UserInterfaceOnly
引数をTrue
に設定すると、「ユーザーによる手作業の編集は禁止するが、VBAマクロによる編集は許可する」**という、非常に便利な保護状態にできます。
Sub ProtectSheet_ForMacro()
Dim targetSheet As Worksheet
Set targetSheet = ThisWorkbook.Worksheets("Report")
' UserInterfaceOnly:=True を指定して保護
targetSheet.Protect Password:="p@ssw0rd", UserInterfaceOnly:=True
MsgBox "シートを保護しました。(マクロによる編集は可能です)"
' 保護したままでも、マクロからは書き込みができる
targetSheet.Range("A1").Value = "マクロからの書き込みテスト"
End Sub
この方法を使えば、シートの保護をいちいち解除・再設定することなく、マクロ処理を実行できるため、コードがシンプルになり、処理速度も向上します。
ワークシートの保護を解除する方法 (.Unprotect
)
.Unprotect
メソッドは、保護されたワークシートを編集可能な状態に戻します。
コードと解説
Sub UnprotectSheetWithPassword()
' 変数を宣言します
Dim targetSheet As Worksheet
Dim sheetPassword As String
' 保護解除したいシートとパスワードを設定
Set targetSheet = ThisWorkbook.Worksheets("Report")
sheetPassword = "p@ssw0rd" ' 保護時に設定したパスワードと一致させる
' --- パスワードを指定してシートの保護を解除 ---
targetSheet.Unprotect Password:=sheetPassword
MsgBox "「" & targetSheet.Name & "」シートの保護を解除しました。"
End Sub
targetSheet.Unprotect
: 対象シートの保護を解除します。Password:=sheetPassword
: 保護時に設定されたパスワードを指定します。パスワードが間違っていると、エラーが発生します。
まとめ
シートの保護と解除は、2つのシンプルなメソッドで実行できます。
- 保護する:
mySheet.Protect Password:="パスワード"
- 保護を解除する:
mySheet.Unprotect Password:="パスワード"
そして、マクロを運用する上で最も重要なテクニックは、UserInterfaceOnly:=True
引数です。 mySheet.Protect Password:="パスワード", UserInterfaceOnly:=True
これにより、ユーザーの誤操作は防ぎつつ、マクロの利便性は損なわない、という理想的な状態を作り出すことができます。