和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ブックを保護する - Protect/Unprotectメソッド

ブックの保護を設定/解除する方法を解説します。


とその前に、「ブックの保護」という名称ですが、実際に保護されるのはシートです。

ブックを保護した場合に禁止される操作は、
ワークシートの「追加」「表示/非表示」「削除」「移動」「名前変更」です。

シート構成の変更を禁止するのが「ブックの保護」ですので、
機能を勘違いしないようにしましょう。


ちなみに本当にブックを保護したい(ブック名の変更や削除を禁止したい)場合は、
Excelの外、Windowsの話になりますので、Excel/VBAの機能ではできません。

適当にググって対応してください。

では始めます。

ブックを保護する/保護を解除する

ブックの保護を設定/解除する場合は、
WorkbookオブジェクトのProtect/Unprotectメソッドを使用します。

コードは以下の通り非常に簡単です。

' ブックを保護
Workbooks("○○.xlsx").Protect

' ブックの保護を解除
Workbooks("○○.xlsx").Unprotect

' ブックを保護(パスワードあり)
Workbooks("○○.xlsx").Protect "1234"

' ブックの保護を解除(パスワードあり)
Workbooks("○○.xlsx").Unprotect "1234"

 
ブックを保護するだけならマクロでやる理由があまりないので、
このコードを使う目的としては、

「保護を解除→マクロでシートを編集→再度保護」

というマクロを作成し、マクロでしかシート構成を変更できないファイルを作ることが多いかなと思います。


そのような場合は、以下のようなコードを書けばOKです。

ThisWorkbook.Unprotect

~シート構成を変更する処理~

ThisWorkbook.Protect

ブックが保護されているか調べる

ブックが保護されているか調べるには、
WorkbookオブジェクトのProtectStructureプロパティを調べます。

If Workbooks("○○.xlsx").ProtectStructure = True Then
    MsgBox "ブックが保護されているため処理を中断します。
    Exit Sub
End If

 
といっても、

  • 保護されたブックにProtectメソッドを実行
  • 保護されていないブックにUnprotectメソッドを実行

は、どちらもエラーにはなりません。


つまり「ブックが保護されていれば保護を解除する」処理にIf文は不要で、

Workbooks("○○.xlsx").Unprotect

とするだけでよいです。

なのでこのプロパティを使うことはあまりないかもしれません。




ブックの保護に関する解説は以上です。


一応補足しておきますと、WorkbookオブジェクトのProtectメソッドには、
第1引数「Password」のほかに、Structure、Windowsの2つの引数があります。


これは「ブックの保護」を手作業で行ったときに出る
ブックの保護ダイアログ
このダイアログの「シート構成」「ウィンドウ」のチェックに該当していますが、
このチェックボックスは古い機能の名残です。
(昔はウィンドウの大きさを変更できなくすることができました)


現行のExcelでは画像の通り「ウィンドウ」はグレーアウトしており、
その上で「シート構成」のチェックまで外すと「OK」が押せません。


マクロで無理やりこの引数を指定した場合は、

ThisWorkbook.Protect Structure:=False
' ↑シートの保護はされない(保護されていた場合は解除される)

ThisWorkbook.Protect Windows:=True
' ↑引数が無視されウィンドウロックはかからない(シートの保護はかかる)

このような挙動になります。

Protect Structure:=False がUnprotectと同じ動きをしますが、
もちろんそんなことをする意味はありません。


Workbook.Protectの引数は事実上Password1つですのでご安心?ください。


ほぼ豆知識になりますが、ブックが保護されているか調べるのに使うプロパティの名前が「ProtectStructureプロパティ」だったのはそういう理由です。