【ExcelVBA・マクロ】Workbook.Protectの使い方|ブックの保護・パスワード設定を自動化する方法【コピペOK】

ExcelVBA

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プロパティで現在の保護状態を確認できる
  • 配布用ブックを扱う実務では、複数ファイルへの一括保護マクロが役立つ

ブックの保護は、ファイルを複数人で共有する場面や社外へ配布する場面で特に重要な機能です。ぜひ自分の業務に合わせてマクロを組み込んでみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました