【実務・中級編】【プレゼン破損・ロック検知】`Presentations.Open` 実行前にファイルが破損しているか、または他ユーザーにロックされているかを安全に事前判定するファイル属性チェッカー – PowerPoint VBA解析バイブル

スポンサーリンク

PowerPoint VBAの死角を突く:ファイル破損・ロック検知の「堅牢な守護神」を実装せよ

業務自動化の現場において、PowerPoint VBAは強力な武器だ。しかし、多くのエンジニアが「読み込み処理」で躓く。`Presentations.Open`を無邪気に呼び出し、ファイルが破損していたり、他ユーザーによってロックされていたりしてVBAがハングアップする――そんな経験はないだろうか?

「開いてみるまで分からない」という受動的なアプローチは、自動化ツールの敗北を意味する。今日は、オブジェクトモデルの挙動を熟知した上で、「開く前に安全を保証する」ための堅牢なアーキテクチャを伝授する。

なぜ `Presentations.Open` 一発勝負は危険なのか

PowerPointのAPIは、ファイルアクセス時にモーダルダイアログを発生させることがある。これが自動化プロセスの最大の敵だ。VBAがダイアログの影で停止し、後続のプロセスがタイムアウトする。

真にプロフェッショナルな設計は、以下の2つの防衛ラインを構築する。

1. FSO(FileSystemObject)による排他チェック: ファイルが物理的に「書き込み中(ロック状態)」でないかを確認する。
2. エラーハンドリングを伴う「お試しオープン」: 読み取り専用モードでの先読み検証。

これらを組み合わせた、実戦投入レベルのラッパー関数を提示する。

実践:ファイルステータス・チェッカーの実装

このコードは、ファイルが「存在するか」「ロックされているか」「破損の兆候がないか」を事前判定する、プロダクション品質のモジュールだ。

Option Explicit

‘ ———————————————————
‘ 目的: ファイルを開く前に、破損やロックを安全に検証する
‘ 戻り値: True なら安全に開ける状態、False なら異常あり
‘ ———————————————————
Public Function IsFileSafeToOpen(ByVal filePath As String) As Boolean
Dim fso As Object
Dim fileNum As Integer
Dim testPresentation As Presentation

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 1. 基本チェック:ファイルが存在するか
If Not fso.FileExists(filePath) Then
Debug.Print “Error: ファイルが見つかりません: ” & filePath
Exit Function
End If

‘ 2. 排他チェック:FSOでは不可能なため、ファイルオープンを試みる
‘ Windowsのファイル共有モードを利用してロックを確認する
On Error Resume Next
fileNum = FreeFile
Open filePath For Binary Access Read Lock Read As #fileNum
Close #fileNum

If Err.Number <> 0 Then
Debug.Print “Error: ファイルが他ユーザーによってロックされています。”
Exit Function
End If
On Error GoTo 0

‘ 3. 破損チェック:読み取り専用で一時的に開いてみる
‘ 可視化せず、修復確認ダイアログも抑制する
On Error Resume Next
Set testPresentation = Presentations.Open(FileName:=filePath, _
ReadOnly:=msoTrue, _
Untitled:=msoFalse, _
WithWindow:=msoFalse)

If Err.Number <> 0 Then
Debug.Print “Error: ファイルが破損している可能性があります。”
testPresentation.Close
Exit Function
End If

‘ 検証成功:クローズして完了
testPresentation.Close
IsFileSafeToOpen = True
On Error GoTo 0
End Function

知的設計のポイント

1. モーダルダイアログの排除 (`WithWindow:=msoFalse`)

`WithWindow:=msoFalse` を指定することで、ウィンドウを生成せずにプレゼンテーションを読み込む。これにより、GUIのイベントループを阻害せず、裏側で静かに検証を完結させることができる。

2. `Open … Lock Read` の意味

このコードでは、`Open` ステートメントで「読み取り専用ロック」を試みている。もし他のプロセス(別のユーザーやバックアップソフト)が書き込み権限で開いていれば、この時点で `Err.Number` が発生する。これが最も軽量なロック検知手法だ。

3. 破損検知の限界を知る

PowerPointのファイル形式(特にXMLベースの `.pptx`)は、内部構造が崩れていても「開けてしまう」ことがある。完全な破損検知には、本来はZIPライブラリ等で内部の `slide1.xml` 等の整合性をチェックする必要があるが、VBA単体で完結させるならば、この「お試しオープン」が最も現実的な防衛線となる。

リーダーからのアドバイス

実務において「例外処理」は、単なるエラー隠しではない。「想定外の事態をシステムの一部として組み込むための設計図」だ。

  • ログ出力の徹底: `Debug.Print` だけでなく、イベントログや専用のログファイルに書き出す設計に拡張せよ。
  • タイムアウト処理: 大容量ファイルの場合、`Presentations.Open` が長時間ブロックすることがある。必要であれば、監視プロセスを分離する等のアーキテクチャ検討が必要だ。

このコードをあなたのツールに組み込むだけで、朝一番の「なぜかマクロが止まっている」という悲劇を過去のものにできるはずだ。自動化のプロフェッショナルとして、常に「最悪のケース」を想定し、それを「制御可能な変数」に変えていく。それが、堅牢なシステムを構築する唯一の道である。

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