マクロで新しいシートを追加しようとしたり、ウィンドウサイズを変更しようとしたりした際に、「ブックが保護されているため、操作を実行できません」というエラーに遭遇することがあります。
このようなエラーを未然に防ぐためには、処理の実行前にブックの保護状態をVBAで確認するのが有効です。この記事では、ブックの「シート構成」と「ウィンドウ」という2種類の保護状態を調べるためのプロパティを解説します。
ブックの保護とは?
Excelの「ブックの保護」は、主に2つのレベルがあります。これらは、校閲
タブのブックの保護
から設定できます。
シート構成の保護 (Structure Protection)
シートの追加、削除、名前の変更、移動、非表示/再表示といった、シートタブの構成に関わる操作を禁止します。複数人でファイルを共有する際に、意図しないシート構成の変更を防ぐために利用されます。
ウィンドウの保護 (Window Protection)
ブックウィンドウのサイズ変更、移動、最小化/最大化といった、ウィンドウそのものに対する操作を禁止します。あまり使われることはありませんが、特定のサイズで表示を固定したい場合などに利用されます。
完成したVBAコード
以下が、現在アクティブなブックの2種類の保護状態を確認し、結果をメッセージボックスに表示するVBAコードです。
Sub CheckWorkbookProtectionStatus()
' 変数を宣言します
Dim targetBook As Workbook
Dim structureStatus As String
Dim windowStatus As String
' 現在アクティブなブックを操作対象とする
Set targetBook = ActiveWorkbook
' --- 1. シート構成の保護状態を確認 ---
If targetBook.ProtectStructure = True Then
structureStatus = "有効 (保護されています)"
Else
structureStatus = "無効 (保護されていません)"
End If
' --- 2. ウィンドウの保護状態を確認 ---
If targetBook.ProtectWindows = True Then
windowStatus = "有効 (保護されています)"
Else
windowStatus = "無効 (保護されていません)"
End If
' --- 3. 結果をメッセージボックスで表示 ---
Dim message As String
message = "ブック「" & targetBook.Name & "」の保護状態:" & vbCrLf & vbCrLf & _
"▼ シート構成の保護 (.ProtectStructure)" & vbCrLf & " " & structureStatus & vbCrLf & vbCrLf & _
"▼ ウィンドウの保護 (.ProtectWindows)" & vbCrLf & " " & windowStatus
MsgBox message, vbInformation, "保護状態の確認"
End Sub
コードのポイント解説
シート構成の保護: .ProtectStructure
Workbook
オブジェクトが持つ.ProtectStructure
プロパティは、シート構成が保護されていればTrue
、されていなければFalse
を返します。
マクロで新しいシートを追加する(Worksheets.Add
)前などにこのプロパティを確認し、もしTrue
であれば、処理を中断したり、ユーザーに保護の解除を促したりといった制御が可能になります。
ウィンドウの保護: .ProtectWindows
同様に、.ProtectWindows
プロパティは、ウィンドウが保護されていればTrue
、されていなければFalse
を返します。
マクロでウィンドウの表示サイズをApplication.WindowState
などで変更する前に、この状態を確認するのに役立ちます。
まとめ
ブックの保護状態は、2つのシンプルなBoolean
型(True/False)のプロパティで簡単に確認できます。
- シート構成の保護:
myBook.ProtectStructure
- ウィンドウの保護:
myBook.ProtectWindows
シートの追加・削除など、ブックの構造を変更する可能性のあるマクロを組む際には、処理の冒頭でこれらの状態をチェックする習慣をつけることで、予期せぬ実行時エラーを防ぎ、より安定したプログラムを作成することができます。