【Project VBA極意】大量のプロジェクトファイルを「安全・高速・無停止」で解析する技術
業務でMS Projectを自動化しようとすると、多くのエンジニアが「ファイルを開く・閉じる」という単純な処理で躓きます。プロジェクトファイルは非常に重く、またVBAのメモリ管理が甘いと、数ファイル処理しただけでExcelやProjectがフリーズ(あるいはゾンビプロセス化)するのは日常茶飯事です。
今日は、伝説的なアーキテクトの視点から、「読み取り専用(ReadOnly)」を活用した堅牢かつ高速なバックグラウンド処理の作法を伝授します。
—
1. なぜ「そのまま」開いてはいけないのか
初心者がやりがちなミスは、単に `Application.FileOpen` を呼び出し、処理が終わったら `FileClose` するという設計です。しかし、実務環境では以下のリスクが潜んでいます。
- 排他制御の衝突: 他のユーザーが閲覧中のファイルを強制的に開こうとしてエラーが起きる。
- リソースのリーク: 処理中にエラーが発生すると、`Application` インスタンスがメモリ上に残り続け、次に開くファイルが読み取り専用でロックされる。
- UIの干渉: 画面更新が有効なままだと、ファイルを開くたびにProjectのGUIがチラつき、処理速度が劇的に低下する。
これらを解決するための「アーキテクトの定石」は、「最小権限で開き、エラー時も必ず閉じる」ことです。
—
2. 堅牢なファイル処理のテンプレートコード
以下のコードは、実務でそのまま利用できる「安全なファイルオープンの雛形」です。`On Error GoTo` を駆使し、異常終了時でも確実にファイルを解放する構造にしています。
‘ プロジェクトファイルを読み取り専用で開いて情報を抽出するプロシージャ
Public Sub ProcessProjectFile(ByVal filePath As String)
Dim proj As Project
Dim app As Object
‘ プロジェクトアプリのインスタンスを取得(または起動)
Set app = Application
‘ 1. 画面更新を停止(高速化の鉄則)
app.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ 2. 読み取り専用で開く(Readonly:=True が重要)
‘ これにより、他ユーザーの編集作業を妨げず、かつ高速に開ける
app.FileOpenEx Name:=filePath, ReadOnly:=True
Set proj = app.ActiveProject
‘ — ここにデータ抽出処理を記述 —
Debug.Print “処理中: ” & proj.Name
‘ ——————————–
‘ 処理成功時は保存せずに閉じる
app.FileClose pjDoNotSave
GoTo Finally
ErrorHandler:
Debug.Print “エラー発生 (” & Err.Number & “): ” & Err.Description
‘ エラー時も強制的に閉じる(閉じないと後続の処理が全て失敗する)
On Error Resume Next
app.FileClose pjDoNotSave
Finally:
app.ScreenUpdating = True
Set proj = Nothing
End Sub
—
3. 開発現場で勝つための「3つの知見」
① `FileOpenEx` を使いこなす
通常の `FileOpen` ではなく、`FileOpenEx` を使ってください。これはパラメータが豊富で、特に `ReadOnly` 指定が明示的です。また、大量ファイルを扱う際は `IgnoreReadOnlyRecommended:=True` を付与することで、保存時に推奨される「読み取り専用推奨」ダイアログを無視できます。
② メモリ解放の徹底
VBAの `Set proj = Nothing` は、単なるおまじないではありません。大きなプロジェクトファイルを扱った後、このオブジェクトがメモリに居座り続けると、Project全体が肥大化し、システム全体のパフォーマンスが低下します。大規模なループ処理の中では、必ずスコープ終了時に解放してください。
③ データベース連携時の落とし穴
もし抽出した情報をSQL ServerやAccessに流し込むなら、「ファイルを開いている間は接続を維持しない」のが鉄則です。
1. ファイルを開く
2. 必要なデータを配列(Array)やコレクションに退避する
3. ファイルを閉じる
4. 閉じた後にDBへ書き込む
こうすることで、万が一DB書き込み時にエラーが起きても、Projectファイル自体は既に解放されているため、再試行が非常に容易になります。
—
最後に:自動化は「防衛」から始まる
優れた自動化ツールとは、爆速で動くツールではありません。「どんなに汚いデータや予期せぬエラーが飛んできても、決してシステムを止めず、ログを残して静かに終了するツール」のことです。
今回紹介した「読み取り専用オープン」と「エラーハンドリングによるクローズの保証」は、その最も基本的な防衛線です。まずはこの雛形をベースに、あなたの業務ツールを「堅牢なエンジン」へと進化させてください。
次は、プロジェクトファイルの「ベースライン差分抽出」の実践編でお会いしましょう。健闘を祈ります。
