こんにちは。Project VBAの世界へようこそ。
マクロの記録ボタンを押して生成された、冗長で不安定なコードに翻弄される日々は今日で終わりにしましょう。
今日は、Projectの心臓部である「スケジュール計算エンジン」を飼い慣らす、最も実用的かつ繊細なテクニックについてお話しします。
—
計算エンジンとの「正しい距離感」を知る
Projectには、タスクを自動計算するか、手動で固定するかを決める`Task.Manual`というプロパティがあります。多くの初心者が陥る罠は、「全タスクを一括で計算モードから切り替える」という乱暴なアプローチです。
計算エンジンは、一度「再計算」が走ると、関連するすべての子タスク、リンク先、リソース負荷を再評価しようとします。大規模なプロジェクトでこれを繰り返せば、VBAは重くなり、処理はフリーズし、あなたのPCは悲鳴を上げます。
重要なのは、「計算エンジンを止めないこと。特定のタスクだけを『聖域』として隔離すること」です。
—
Task.Manual = True がもたらす「聖域」
`Task.Manual = True` に設定されたタスクは、計算エンジンからの干渉を拒絶します。つまり、親タスクのスケジュール変更や先行タスクの遅延の影響を受けません。
現場で使える「安全な制御コード」
まずは、特定のタスクを安全に手動化し、スケジュールを固定する基本パターンを見てみましょう。
Sub ProtectTaskSchedule()
Dim tsk As Task
‘ プロジェクト内の特定のタスクを取得(例:ID 5のタスク)
Set tsk = ActiveProject.Tasks(5)
‘ 【重要】計算エンジンとの排他制御
‘ 既に手動設定でない場合のみ変更を加え、無駄な再計算フラグを立てない
If tsk.Manual = False Then
‘ 手動モードへ移行
tsk.Manual = True
‘ 聖域内でのスケジュール設定
‘ 自動計算に邪魔されず、意図した通りの開始日・終了日を書き込める
tsk.Start = “2023/12/01”
tsk.Finish = “2023/12/10”
Debug.Print “タスク ” & tsk.Name & ” を手動モードで固定しました。”
End If
End Sub
なぜこの書き方が「極限の知見」なのか?
1. If文によるガード: 闇雲にプロパティを書き換えず、状態を確認してから操作することで、計算エンジンの無駄なトリガーを抑制しています。
2. 直接的なプロパティ操作: `ActiveProject.Tasks`を直接叩くことで、オブジェクトのメモリ負荷を最小限に抑えています。
—
陥りやすいエラー:計算エンジンの「暴走」を防ぐ
よくあるエラーとして、「手動タスクの中に自動タスクを組み込み、計算エンジンの整合性を壊す」ケースがあります。
これを防ぐには、以下の鉄則を守ってください。
- 鉄則1:依存関係を断つ
手動タスク(Manual = True)にするならば、そのタスクに対する「先行タスク」や「後続タスク」のリンクを一度削除、あるいは無効化することを検討してください。リンクが残ったまま手動化すると、計算エンジンは「計算すべきか、無視すべきか」の矛盾に悩み、予期せぬ日付のズレを引き起こします。
- 鉄則2:バッチ処理の最後で一括計算
ループ処理で何百ものタスクを操作する場合、一タスクごとに計算させるのではなく、最後に `Application.CalculateAll` を呼ぶのが定石です。
Sub BulkUpdateManualTasks()
Dim tsk As Task
‘ 計算パフォーマンスを最適化するため、更新前に計算を停止させることはできないが
‘ 処理の途中で再計算が発生しないよう、フラグを立ててから一括操作する
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
If tsk.Summary = False Then ‘ サマリータスク以外を対象に
tsk.Manual = True
tsk.Duration = “5d”
End If
End If
Next tsk
‘ 最後に一度だけ計算エンジンに全反映させる
Application.CalculateAll
End Sub
—
最後に:エンジニアとしての心構え
Project VBAにおける「制御」とは、計算エンジンという強力なモンスターを、いかに飼いならすかというゲームです。
`Task.Manual` を単なる設定項目と思わず、「計算エンジンからの干渉を遮断する防壁」と捉えてみてください。この感覚さえ掴めれば、あなたはもうマクロの記録ボタンを押すだけの初心者ではありません。
ここをクリアすれば、Project VBAの基本はバッチリです。次は、リソースの負荷状況を考慮した動的なスケジュール調整へとステップアップしましょう。
何かわからないことがあれば、またいつでも聞いてくださいね。応援しています。
