数千タスクを瞬殺せよ:Project VBAにおける計算エンジン負荷を制御する「段階的制約適用」の極意
Project VBAを扱っていると、誰もが一度は直面する壁がある。タスク数千件のプロジェクトに対し、マクロで制約条件(ASAPやALAP、特定の日付制約)を流し込んだ瞬間に発生する「計算エンジンのフリーズ」だ。
Projectの計算エンジンは強力だが、その反面、「制約が一つ追加されるたびに全タスクの依存関係を再計算する」という、極めてコストの高い処理を裏で行っている。全件一括で制約を適用すれば、数分間のホワイトアウトは避けられない。
本記事では、この計算負荷を制御し、堅牢かつ高速にタスクを制御するための「段階的適用アーキテクチャ」を伝授する。
—
なぜ「一括適用」は死を招くのか
Projectのオブジェクトモデルにおいて、`Task.ConstraintType`や`Task.ConstraintDate`を直接操作することは、暗黙的に「再計算トリガー」を引くことと同義だ。
数千件のタスクに対し、ループ内でこれらを一つずつ書き換えると、VBAの実行時間よりも、背後の計算エンジンが要するオーバーヘッドが肥大化し、最終的にアプリケーションが応答停止(Not Responding)に陥る。これを防ぐには、以下の二つの戦略を組み合わせて運用する必要がある。
1. 計算エンジンの自動再計算を停止する
2. チャンク(分割)処理によるバッチ適用
—
堅牢な設計:計算負荷をコントロールする実装パターン
以下のコードは、大規模プロジェクトでも安定して動作するよう、計算処理を一時的に停止し、安全に制約を適用するためのテンプレートである。
プロダクションコード例
‘ 計算エンジンの負荷を制御し、制約を安全に適用するエンジンの骨子
Public Sub ApplyConstraintsInBatches(ByVal targetProject As Project, ByVal taskBatchSize As Long)
Dim tsk As Task
Dim count As Long
‘ 1. 計算エンジンの自動再計算をオフに(極めて重要)
Application.Calculation = pjManual
On Error GoTo Cleanup
count = 0
For Each tsk In targetProject.Tasks
If Not tsk Is Nothing Then
‘ 制約条件の更新ロジック
With tsk
.ConstraintType = pjConstraintStartNoEarlierThan
.ConstraintDate = DateSerial(2023, 12, 31)
End With
count = count + 1
‘ 2. バッチサイズごとに再計算を許可してエンジンをリフレッシュ
If count Mod taskBatchSize = 0 Then
DoEvents ‘ UIの応答性を維持
Application.CalculateProject
End If
End If
Next tsk
Cleanup:
‘ 3. 最後に全再計算を行い、手動モードを元に戻す
Application.CalculateProject
Application.Calculation = pjAutomatic
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub
—
実装における「プロの着眼点」
1. `Application.Calculation = pjManual` の絶対性
これを忘れると、1行処理するごとにProjectは世界を再構築しようとする。大規模プロジェクトでは、これを忘れることはプロとして失格だ。必ず `pjManual` に切り替え、処理完了後に `pjAutomatic` に戻すこと。
2. `DoEvents` との付き合い方
`DoEvents` は魔法の杖ではない。多用すればパフォーマンスは落ちる。上記のコードのように、バッチ処理の区切り(例:500タスクごと)で叩くのが、UIのフリーズを防ぐ最も効率的なバランスだ。
3. ファイル・DB連携時の注意点
もし外部データ(ExcelやSQL Server)から制約日付を取得している場合、「日付の型変換エラー」がプロジェクト全体の整合性を破壊する。
- バリデーション: `IsDate()` で日付が有効か必ず確認せよ。
- トランザクション: 外部データを読み込む際は、一度メモリ上の配列に全件ロードしてから処理を開始すること。外部DBと1タスクずつ接続して読み込むのは、ネットワーク遅延が計算エンジンを不安定にさせる最大の要因となる。
—
まとめ:アーキテクトからの助言
大規模プロジェクトの制御において、最も重要なのは「計算機に何を行わせるか」よりも、「いつ計算機を休ませるか」という設計思想である。
VBAは強力だが、Projectの計算エンジンという巨大なシステムの一部であることを忘れてはならない。今回紹介した「バッチ分割」と「計算モードの切り替え」を徹底するだけで、あなたのツールは数千タスク規模でも軽快に動作する「真の業務効率化エンジン」へと進化するはずだ。
コードをコピペするだけで満足するな。その裏で何が起きているのかを想像し、計算エンジンの鼓動をコントロールする――それこそが、伝説的なアーキテクトへの第一歩である。
