【入門編】【中級者向け】複数プロジェクトの同時オープンとメモリ解放のベストプラクティス – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「墓場」を作らないために。Project VBAにおけるメモリ管理の極意

こんにちは。現場で戦うエンジニアの皆さん。
「マクロの記録」から一歩踏み出し、複数のProjectファイルを一気に処理するツールを書き始めると、必ず直面する壁があります。

そう、「メモリリーク」と「ゾンビプロセス」です。

数百のファイルを処理している途中でProjectが急に重くなったり、処理が終わったはずなのにタスクマネージャーに `WINPROJ.EXE` が居座り続けていたり……そんな経験はありませんか?

今回は、Project VBAの「作法」をマスターし、メモリを美しく解放しながらプロジェクトを操るための「極限の知見」を伝授します。ここさえ押さえれば、あなたのマクロは格段に安定します。

1. なぜ「開いて閉じる」だけでは足りないのか?

初心者が陥りやすいのが、単に `FileOpen` して `FileClose` するだけのコードです。

‘ 悪い例:メモリが少しずつ「腐敗」していく
For Each f In FileList
Application.FileOpen f
‘ 何か処理
Application.FileClose pjDoNotSave
Next f

これの何が問題か? それは、Projectオブジェクトへの参照がバックグラウンドで残り続け、解放のタイミングをメモリマネージャーが制御できなくなるからです。これを放置すると、処理件数が増えるにつれ、Projectは悲鳴を上げ、最終的にはクラッシュします。

2. メモリ解放のベストプラクティス:3つの鉄則

メモリを食いつぶさないためには、以下の3ステップを徹底してください。

1. プロジェクトをオブジェクト変数に明示的に代入する
2. 処理が終わったら `Close` メソッドを呼ぶ
3. オブジェクト変数を `Nothing` で確実に破棄する

これをコードに落とし込むと、以下のようになります。

現場で使える堅牢なテンプレート

Sub ProcessMultipleProjects()
Dim prj As Project
Dim filePath As String

‘ ここでは例として配列を使いますが、実際はファイルリスト等から取得してください
Dim filePaths As Variant
filePaths = Array(“C:\ProjectA.mpp”, “C:\ProjectB.mpp”)

For Each filePath In filePaths
‘ 1. プロジェクトを開き、オブジェクト変数に格納
Set prj = Application.Projects.Open(filePath)

‘ — ここで魔法をかける(業務ロジック) —
Debug.Print “処理中: ” & prj.Name
‘ —————————————

‘ 2. 確実に閉じる(pjDoNotSave または pjSave)
prj.Close pjDoNotSave

‘ 3. 【最重要】参照を明示的に解放する
‘ これを忘れると、VBAはメモリを「まだ使っているかもしれない」と勘違いし続けます
Set prj = Nothing
Next filePath

MsgBox “すべての処理が完了しました。メモリもクリーンな状態です!”
End Sub

3. なぜ `Set prj = Nothing` が必要なのか?

VBAには「参照カウント」という仕組みがあります。`Set prj = …` と書くと、Projectアプリケーションのメモリ上に「この変数がこのプロジェクトを見ているぞ」というカウンターが加算されます。

`prj.Close` を呼んでも、変数 `prj` はまだそのプロジェクトの「亡霊(残骸)」を指し示しています。この状態で次のファイルを開くと、メモリ内には「前のプロジェクトの抜け殻」と「新しいプロジェクト」が混在し、これが重なり合ってパフォーマンスを低下させます。

`Set prj = Nothing` を実行することで、「もうこのプロジェクトには用はないから、メモリから消去していいよ」とVBAに許可を与えるのです。これこそが、大規模運用に耐えうるプロのコードです。

4. さらに上を目指すエンジニアへ:エラーハンドリングの罠

複数のファイルを扱う際、1つのファイルが破損していたらどうなるでしょうか? マクロが途中で停止し、`Set prj = Nothing` まで到達しません。すると、そのファイルはメモリに居座り続けます。

実戦では、必ず `On Error GoTo` を活用してください。

  • エラーハンドラの中で `Set prj = Nothing` を呼ぶこと
  • ループの最後で必ず `Close` が行われる構造にすること

これらを守るだけで、あなたの書くマクロは「止まらない、重くならない」プロ仕様のツールへと進化します。

まとめ:ここをクリアすれば、もう怖くない

今日お伝えしたことは、Project VBAにおける「呼吸」のようなものです。

1. `Projects.Open` で開く
2. `prj.Close` で閉じる
3. `Set prj = Nothing` で解放する

このサイクルをリズムとして身体に叩き込んでください。これさえできれば、何千ものプロジェクトファイルを束ねるような高度な自動化も、恐れるに足りません。

皆さんの自動化ライフが、より快適で、より生産的なものになることを願っています。
また次回の「極限の知見」でお会いしましょう!

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