Excelで複数人がファイルを共有していると、「シートの構成を勝手に変更されたくない」「重要なブックを誤って上書き保存されたくない」といった悩みが出てきます。この記事では、Workbook.Protectメソッドを使ってブックの構造(シートの追加・削除・並び替えなど)をVBAで保護する方法と、パスワードを設定する方法を解説します。あわせて保護の解除方法や、複数ブックをまとめて保護する実務向けのマクロも紹介します。
Workbook.Protectとは
Workbook.Protectは、ブック(ファイル)全体の構造を保護するメソッドです。シートの保護(Worksheet.Protect)がセルの編集を制限するのに対し、ブックの保護はシートの追加・削除・移動・非表示解除・名前変更といった「ブックの構成」を変更できないようにします。
基本の書き方は次の通りです。
Sub ProtectWorkbookStructure()
Dim wb As Workbook
Set wb = ThisWorkbook
wb.Protect Structure:=True
End Sub
Structure:=Trueを指定すると、シート見出しを右クリックしたときの「削除」「移動またはコピー」「再表示」などのメニューがグレーアウトし、シート構成を変更できなくなります。
パスワード付きでブックを保護する方法
保護にパスワードを設定すれば、解除できるのは知っている人だけになります。Password引数にパスワード文字列を渡します。
Sub ProtectWorkbookWithPassword()
Dim wb As Workbook
Set wb = ThisWorkbook
wb.Protect Password:="P@ssw0rd123", Structure:=True
End Sub
パスワードを設定した場合、解除時(Unprotect)にも同じパスワードを渡す必要があります。パスワードを忘れるとVBAからも解除できなくなるため、コード内にベタ書きせず、InputBoxで入力させたり、設定ファイルから読み込んだりする運用がおすすめです。
Sub ProtectWorkbookByInput()
Dim wb As Workbook
Dim pwd As String
pwd = InputBox("設定するパスワードを入力してください")
If pwd = "" Then
MsgBox "パスワードが入力されなかったため処理を中止します。"
Exit Sub
End If
Set wb = ThisWorkbook
wb.Protect Password:=pwd, Structure:=True
End Sub
ウィンドウ位置も一緒に保護する
ProtectメソッドにはWindows引数もあり、Trueにするとウィンドウのサイズや位置の変更も禁止できます(ブックを開くたびに毎回同じウィンドウ配置にしたい場合などに便利です)。
Sub ProtectWorkbookFull()
ThisWorkbook.Protect Password:="P@ssw0rd123", Structure:=True, Windows:=True
End Sub
なお、シート自体の中身(セルの編集)まで保護したい場合は、Workbook.Protectだけでは足りません。各シートに対してWorksheet.Protectを個別に実行する必要がある点に注意してください。
保護を解除する方法(Unprotect)
保護を解除するにはUnprotectメソッドを使います。パスワード付きで保護した場合は、同じパスワードを指定しないとエラーになります。
Sub UnprotectWorkbook()
Dim wb As Workbook
Set wb = ThisWorkbook
On Error Resume Next
wb.Unprotect Password:="P@ssw0rd123"
On Error GoTo 0
If wb.ProtectStructure Then
MsgBox "パスワードが違うため解除できませんでした。"
Else
MsgBox "保護を解除しました。"
End If
End Sub
パスワードが間違っている場合、Unprotectは実行時エラー(エラー番号1004)を発生させます。On Error Resume Nextでエラーを一旦受け流し、ProtectStructureプロパティで実際に解除できたかどうかを判定するのが安全な書き方です。
保護状態を確認する方法
現在ブックが保護されているかどうかは、ProtectStructureプロパティとProtectWindowsプロパティで確認できます。
Sub CheckProtectStatus()
Dim wb As Workbook
Set wb = ThisWorkbook
Debug.Print "構造の保護: " & wb.ProtectStructure
Debug.Print "ウィンドウの保護: " & wb.ProtectWindows
End Sub
配布用マクロの冒頭でこの状態をチェックし、「保護されていなければ自動で保護をかける」といった処理を組み込むと、うっかり保護し忘れを防げます。
Sub EnsureProtected()
Dim wb As Workbook
Set wb = ThisWorkbook
If Not wb.ProtectStructure Then
wb.Protect Password:="P@ssw0rd123", Structure:=True
End If
End Sub
実務での活用例:複数ブックを一括保護する
配布前に複数のブックへまとめてパスワード保護をかけたい場合は、フォルダ内のExcelファイルを順番に開いて保護・保存するマクロが便利です。
Sub ProtectAllWorkbooksInFolder()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Const pwd As String = "P@ssw0rd123"
folderPath = "C:\配布用フォルダ\"
fileName = Dir(folderPath & "*.xlsx")
Application.ScreenUpdating = False
Do While fileName <> ""
Set wb = Workbooks.Open(folderPath & fileName)
wb.Protect Password:=pwd, Structure:=True
wb.Save
wb.Close SaveChanges:=False
fileName = Dir()
Loop
Application.ScreenUpdating = True
MsgBox "フォルダ内のブックをすべて保護しました。"
End Sub
Dir関数でフォルダ内の.xlsxファイルを1つずつ取得し、開いて保護をかけたあとに保存・クローズしています。実行前に必ずバックアップを取ってから試すようにしてください。
まとめ
Workbook.Protectはブックの「構造」を保護するメソッドで、シートの追加・削除・移動などを制限できるPassword引数を指定すればパスワード付きで保護でき、解除(Unprotect)にも同じパスワードが必要Windows:=Trueを指定するとウィンドウの位置・サイズ変更も禁止できる- セルの中身まで保護したい場合は
Worksheet.Protectを別途実行する ProtectStructureプロパティで現在の保護状態を確認できる- 配布用ブックを扱う実務では、複数ファイルへの一括保護マクロが役立つ
ブックの保護は、ファイルを複数人で共有する場面や社外へ配布する場面で特に重要な機能です。ぜひ自分の業務に合わせてマクロを組み込んでみてください。

コメント