こんにちは!Project VBAの世界へようこそ。
マクロの記録から一歩踏み出し、「自分の手でプロジェクトを意のままにコントロールしたい」と願うあなたなら、きっと今日のテーマにワクワクするはずです。
今回は、MS Projectの心臓部である「計算エンジン」に焦点を当てます。
「あれ? タスクを追加したのにスケジュールが更新されないぞ?」
「なんか、画面の右下に『計算中』や『再計算保留』なんて文字が出ている……」
そんな経験はありませんか?
大規模なプロジェクトや、複雑な制約条件(ASAPやALAPなど)が絡み合う現場では、パフォーマンス維持のために計算が後回しにされることがあります。この「再計算保留(Calculation Pending)」の状態をVBAで華麗に監視し、必要なら強制的にエンジンを叩き起こして警告を出す――。
今回は、そんな現場のトラブルを防ぐ「知的な監視プロセス」の作り方を、優しく、そして本質的なところまで徹底的に解説していきますね。ここをクリアすれば、あなたのVBAスキルは一段とプロの領域に近づきますよ!
—
1. なぜ「再計算保留」が問題になるのか?
MS Projectは、タスクの追加、削除、依存関係(先行・後続)の変更が行われるたびに、CPM(クリティカルパス法)に基づいてスケジュールを再計算します。
しかし、VBAで大量のタスクを一括処理する際や、複雑なリソース割り当てを行っている最中、Projectは無駄な再計算を避けるために「計算を保留(Pending)」することがあります。
[VBAによる大量データ操作]
↓
(あれ?まだスケジュールが古いまま……?)
↓
ユーザー「進捗どうなってるの?」
↓
[古いデータのまま誤った判断を下してしまう危険性!]
この状態を放置すると、プログラムが「まだ計算が終わっていない古いスケジュール」を前提に後続の処理を進めてしまい、大惨事につながることがあるのです。だからこそ、「今、プロジェクトは再計算待ちの状態なのか?」をVBAで検知し、必要なら強制的に計算を実行させる仕組みが必要になります。
—
2. Project VBAの基本:計算モードの正体
MS Projectには、スケジュール計算のタイミングを制御するプロパティが用意されています。それが `Application.Calculation` です。
- 自動計算モード (`pjAutomatic`): 変更があれば即座に計算する。
- 手動計算モード (`pjManual`): ユーザー(またはVBA)が明示的に指示するまで計算しない。
さらに、アプリ全体の状態として、現在計算が保留されているかどうかを直接的に監視する気の利いた単一プロパティは用意されていません。だからこそ、私たちは「現在のスケジュール整合性をチェックし、必要なら強制再計算(CalculateAll)を走らせる」というアプローチを取ります。
—
3. 実装コード:再計算保留を監視し、強制実行するエンジン
それでは、実際の現場でそのままコピペして使える実用的なVBAコードを公開します。
このコードは、プロジェクトの計算状態をチェックし、もし保留状態や未確定の要素があれば警告を出し、強制的に再計算を行わせるものです。
‘ ==============================================================================
‘ 【モジュール名】 Module_CalculationMonitor
‘ 【概要】 プロジェクトの計算エンジンの状態を監視し、強制再計算を制御するプロシージャ
‘ ==============================================================================
Sub CheckAndForceCalculation()
Dim prj As Project
Set prj = ActiveProject
On Error GoTo ErrorHandler
‘ 1. 現在のアプリケーションの計算モードを確認
Dim currentCalcMode As Long
currentCalcMode = Application.Calculation
‘ 2. 手動計算モードになっている場合の警告と誘導
If currentCalcMode = pjManual Then
Dim userAns As VbMsgBoxResult
userAns = MsgBox(“現在、プロジェクトは【手動計算モード】に設定されています。” & vbCrLf & _
“データの整合性を保つため、自動計算に切り替えて再計算を実行しますか?”, _
vbYesNo + vbExclamation, “計算エンジンの確認”)
If userAns = vbYes Then
Application.Calculation = pjAutomatic
MsgBox “計算モードを【自動】に変更しました。”, vbInformation, “通知”
Else
MsgBox “手動計算モードのまま処理を終了します。最新のスケジュールになっていない可能性があります。”, vbCritical, “警告”
Exit Sub
End If
End If
‘ 3. 計算エンジンの強制実行(CalculateAll)
‘ これにより、保留されていたすべてのスケジュール計算、ASAP/ALAPの再評価が強制実行されます。
MsgBox “計算エンジンを強制実行します…”, vbInformation, “処理中”
Application.CalculateAll
‘ 4. 完了報告
MsgBox “プロジェクトの再計算が正常に完了しました。” & vbCrLf & _
“すべてのタスクのスケジュール・制約条件が最新の状態に更新されています。”, _
vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
4. コードのポイントと知的なエンジニアの視点
ここで使用している重要なポイントを噛み砕いて解説します。
- `Application.Calculation` の制御
意図せず手動モードになっていると、VBAでどれだけタスクをいじってもスケジュールが更新されません。コードの冒頭でここをチェックし、必要なら `pjAutomatic` に引き戻すのがプロの技です。
- `Application.CalculateAll` の破壊力
これが今回の主役です。開いているすべてのプロジェクト、すべての計算キューにたまっていたタスクを一斉に再計算させます。重いプロジェクトだと数秒フリーズしたように感じられますが、「不確実なデータで後続処理を走らせるリスク」に比べれば安いものです。
—
5. 初学者が陥りやすい罠とエラー回避のコツ
Project VBAを書き始めると、必ずと言っていいほど次のような壁にぶつかります。
1. 「オブジェクトが見つかりません」エラー(Error 424)
- 原因: `ActiveProject` と記述しているのに、肝心のプロジェクトファイルが一つも開いていない状態でマクロを実行してしまった場合におこります。
- 対策: 処理の最初に `If ActiveProject Is Nothing Then …` のようなガード節を入れると、より堅牢なコードになります。
2. 計算が終わる前に次のコードが走ってしまう
- 原因: 大規模なプロジェクトで `CalculateAll` を実行した直後、VBAの処理速度が速すぎて、計算が終わる前に次の行(例えばレポート出力など)が実行されてしまうことがあります。
- 対策: 必要に応じて `DoEvents` 関数を挟むなどして、OSやProjectの描画・計算スレッドに処理を譲る工夫をすると完璧です。
—
まとめ:ここをクリアすれば、Project VBAの基本はバッチリ!
今回は、計算エンジンの「再計算保留」状態に着目し、VBAでそれを監視・制御する仕組みを解説しました。
マクロの記録ボタンを押すだけでは決して見えない「アプリケーションの内部状態(エンジン)」にアプローチできるようになると、あなたの作るVBAツールは、単なる「お使い代行」から、現場を守る「インテリジェントなシステム」へと生まれ変わります。
ぜひ今回のコードを手元の環境にコピーして、実際のプロジェクトで試してみてくださいね。あなたのVBAライフが、より豊かでスマートなものになりますように!
