VBAマクロを実行する際、対象となるExcelブックがどのような状態で開かれているかによって、処理を分岐させたり、エラーを未然に防いだりする必要が出てくることがあります。
特に重要なのが、「このブックは編集可能なのか?」や「古いファイル形式ではないか?」といった状態の確認です。この記事では、ブックが「読み取り専用」や「互換モード」であるかどうかをVBAで判断するための、2つの基本的なプロパティを解説します。
ブックが「互換モード」かどうかを判断する方法
互換モードとは?
互換モードとは、古い形式のExcelファイル(.xls
など)を新しいバージョンのExcelで開いた際に、ファイルの互換性を維持するために一部の新しい機能が制限されるモードのことです。ブックのタイトルバーに「[互換モード]」と表示されます。
新しい関数や機能(例: XLOOKUP関数)を使ったマクロを互換モードのブックで実行するとエラーになるため、事前にこのモードを確認することが重要です。
コードと解説
ブックが互換モードであるかは、Workbook
オブジェクトの.Excel8CompatibilityMode
プロパティで判断できます。
Sub CheckCompatibilityMode()
Dim currentBook As Workbook
Set currentBook = ThisWorkbook
' .Excel8CompatibilityModeプロパティがTrueかどうかで判断
If currentBook.Excel8CompatibilityMode = True Then
MsgBox "このブック「" & currentBook.Name & "」は互換モードで開かれています。" & vbCrLf & _
"一部の新しい機能は使用できない可能性があります。", vbInformation
Else
MsgBox "このブック「" & currentBook.Name & "」は標準モードです。", vbInformation
End If
End Sub
.Excel8CompatibilityMode
: このプロパティは、ブックが互換モードであればTrue
を、そうでなければFalse
を返します。この値を調べることで、マクロの処理を分岐させることができます。
ブックが「読み取り専用」かどうかを判断する方法
読み取り専用とは?
ブックが読み取り専用の場合、内容の変更はできますが、同じファイル名で上書き保存することはできません。マクロでセルの値を書き換えたり、保存したりする処理を行う前には、必ずこの状態をチェックすべきです。
コードと解説
ブックが読み取り専用であるかは、Workbook
オブジェクトの.ReadOnly
プロパティで簡単に判断できます。
Sub CheckIfReadOnly()
Dim currentBook As Workbook
Set currentBook = ActiveWorkbook
' .ReadOnlyプロパティがTrueかどうかで判断
If currentBook.ReadOnly = True Then
MsgBox "このブックは読み取り専用のため、編集処理を中断します。", vbCritical, "処理中断"
' マクロの処理をここで終了させる
Exit Sub
End If
' 読み取り専用でなければ、以下の処理が続行される
MsgBox "このブックは編集可能です。処理を続行します。"
' ... (ここに本来の編集や保存の処理を記述) ...
End Sub
.ReadOnly
: このプロパティは、ブックが読み取り専用であればTrue
を、編集可能であればFalse
を返します。Exit Sub
: サンプルコードのように、読み取り専用であった場合にExit Sub
を使ってマクロをその場で終了させるのは、エラーを未然に防ぐための非常に有効な手法です(このような処理をガード節と呼びます)。
まとめ
マクロの安定性を高めるためには、処理の実行前にブックの状態を確認することが不可欠です。
- 互換モードの確認: 新しい機能を使うマクロが、古い形式のファイルで実行されるのを防ぎたい時に使用。
If myBook.Excel8CompatibilityMode Then ...
- 読み取り専用の確認: ファイルへの書き込みや保存を行うマクロでは、処理の冒頭で必ずチェックすべき必須項目。
If myBook.ReadOnly Then Exit Sub
これらのシンプルなチェック処理をマクロに組み込むだけで、予期せぬエラーを大幅に減らし、より堅牢で使いやすいツールを作成することができます。