【テクニカル・上級編】リソース割り当てと依存関係を同時に最適化する自動化ロジック – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:リソース稼働と依存関係を同期させる「動的クリティカルパス」の自動生成

システム開発の現場において、MS ProjectのVBA操作は「泥沼」と化しやすい。オブジェクトモデルの階層が深く、プロパティの更新一つで計算エンジンが再帰的な再計算を走らせ、パフォーマンスが劇的に低下するからだ。

特に「リソース割り当て」と「依存関係(先行タスク)」を同時に最適化するロジックは、多くのエンジニアが計算のループ地獄に陥るポイントである。本稿では、レガシー環境を極限までチューニングし、メモリを制御下に置くプロフェッショナルの手法を伝授する。

1. 殺人的な再計算を防ぐ:APIとエンジンの静寂

VBAからProjectを操作する際、最も避けるべきは「逐次計算」だ。依存関係を追加するたびにProjectの計算エンジンが走り、数千件のタスクがあればそれだけで処理時間は分単位に達する。

解決策は、計算モードの強制停止と、APIを介したメモリ管理である。

‘ 計算モードを切り替える最速の手段
Sub OptimizeCalculationMode(ByRef proj As Project, ByVal enable As Boolean)
If enable Then
proj.Calculation = pjManual
Else
proj.Calculation = pjAutomatic
End If
End Sub

2. リソース割り当てと依存関係の同時最適化ロジック

タスクの開始日を決定する際、単純なリンク設定では不十分だ。割り当てられたリソースの「カレンダー」を参照し、空き時間を算出しなければならない。

以下は、リソースの稼働状況を考慮し、依存先タスクの終了直後に開始日をシフトさせる、洗練されたアプローチだ。

Public Sub AdjustTaskScheduling(ByVal targetTask As Task)
Dim predecessor As Task
Dim maxFinishDate As Date

‘ 依存関係の先行タスクを走査
For Each predecessor In targetTask.PredecessorTasks
If predecessor.Finish > maxFinishDate Then
maxFinishDate = predecessor.Finish
End If
Next predecessor

‘ リソースの稼働状況を考慮したオフセット計算
‘ ここでは単純なスキップロジックだが、実際はResource.Calendarを活用する
If targetTask.Start < maxFinishDate Then targetTask.Start = maxFinishDate ' オブジェクトの明示的解放(VBAではNothing代入が必須) End If Set predecessor = Nothing End Sub

3. メモリ管理の極意:プロセスの断片化を防ぐ

VBAのGC(ガベージコレクション)をあてにしてはならない。特に`Task`や`Assignment`のループ処理では、参照を保持し続けることでメモリリークが発生し、Excel/Projectがクラッシュする。

シニアエンジニアの守るべき鉄則:

1. オブジェクトの明示的解放: ループの最後には必ず `Set obj = Nothing` を実行し、スタックをクリアせよ。
2. Late Bindingの回避: 可能な限り `Early Binding (参照設定)` を行い、VTable経由でメソッドを呼び出せ。これにより、パフォーマンスと安定性が格段に向上する。
3. Windows APIの活用: 必要に応じて `Sleep` APIなどを呼び出し、CPU使用率を意図的に制御することで、OS側のタスク優先順位を適正に保つ。

If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If

‘ 大規模データ処理時の CPU スロットリング
Sub SafeProcessLoop()
Dim tsk As Task
For Each tsk In ActiveProject.Tasks
‘ 負荷の高い処理
If Not tsk Is Nothing Then
‘ … 処理 …
End If

‘ 適度なウェイトでOSにリソースを返す
DoEvents
Sleep 10
Next tsk
End Sub

4. 結論:ツールに振り回されるな

Project VBAを掌握するということは、MS Projectという巨大なエンジンの「呼吸」を理解することに他ならない。計算モードを止め、メモリを解放し、依存関係という数学的グラフを論理的に再構築する。

もし、貴方の書いたコードが数千件のタスクを処理して「応答なし」になるのであれば、それはコードのせいではない。貴方がエンジンの再計算を強要しているからだ。

依存関係の自動設定は、単なるプロパティの代入ではない。それは「時間というリソースの最適配置」というアルゴリズムそのものである。この視点を持った時、貴方のVBAコードは単なるスクリプトから、堅牢なシステム・アーキテクチャへと昇華する。


チーフアーキテクトからの助言:
レガシー環境ほど、コードの美学が問われる。汚いコードは技術的負債として、5年後の貴方を苦しめることになるだろう。常に解放を意識せよ。

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