プロジェクトの「墓場」を作らないために。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` で解放する
このサイクルをリズムとして身体に叩き込んでください。これさえできれば、何千ものプロジェクトファイルを束ねるような高度な自動化も、恐れるに足りません。
皆さんの自動化ライフが、より快適で、より生産的なものになることを願っています。
また次回の「極限の知見」でお会いしましょう!
