こんにちは。プロジェクト管理の自動化へようこそ。
君が今、「マクロの記録」を卒業して、自分の手でMS Projectを自在に操りたいと考えていること、とても嬉しく思います。
MS Projectというソフトは、Excelとは根本的に思想が違います。Excelは「ただの表」ですが、Projectは「計算エンジンを搭載したスケジュールシミュレーター」です。
初心者が最初につまずくのが、この「計算エンジン」の制御です。
「日付を入力したのに、なぜか日付が勝手に動く」あるいは「動かしたいのに動かない」。その正体こそが【制約条件(Constraint)】という名の「見えない鎖」です。
今日は、プロジェクト内のあらゆるタスクにかけられた鎖を断ち切り、計算エンジンを完全に解放して「可能な限り早く(ASAP)」という純粋なスケジュールに戻す、【完全ASAP化マクロ】を伝授しましょう。
ここを理解すれば、Project VBAの基本である「オブジェクトのループ処理」と「プロパティの書き換え」という核心部分をマスターできますよ。
なぜ「制約条件の一括削除」が必要なのか?
Projectでタスクの日付を手入力すると、Projectは親切心(おせっかい)で、その日付を維持しようと「開始日固定」などの制約条件を自動的に付与します。
しかし、これが積み重なると、あるタスクの期間が変わっても後続タスクが自動でシフトしないという、スケジュール管理最大の悪夢が生まれます。
プロの設計思想はこうです:
> 「日付を直接指定するのではなく、タスク同士を『リンク(依存関係)』で結び、開始日だけを決めれば、あとは計算エンジンに任せる」
つまり、一度すべての制約をリセットして「ASAP(できるだけ早く)」に戻し、計算エンジンの純粋な計算結果を確認することが、正しいスケジュール管理の第一歩なのです。
実装:プロジェクト完全ASAP化マクロ
それでは、コードを見ていきましょう。
単に制約を消すだけでなく、実務で陥りやすい「手動スケジューリング」の罠も同時に解決する、実戦的なコードです。
''' <summary>
''' プロジェクト内の全タスクの制約条件を解除し、完全ASAP化するマクロ
''' </summary>
Sub ResetAllConstraintsToASAP()
Dim tsk As Task
Dim count As Long
count = 0
' 画面更新を停止して処理速度を向上させる(プロの作法)
Application.ScreenUpdating = False
On Error Resume Next ' エラーが発生しても中断せず、次のタスクへ進む(サマリタスク対策)
' アクティブプロジェクト内のすべてのタスクをループで走査する
For Each tsk In ActiveProject.Tasks
' 1. タスクが存在しない(空行)場合はスキップ
If Not tsk Is Nothing Then
' 2. 【重要】手動スケジューリングのタスクは制約操作が効かないため、
' まず「自動スケジューリング」に変更する
If tsk.Manual = True Then
tsk.Manual = False
End If
' 3. 制約条件を「できるだけ早く (As Soon As Possible)」に設定
' これにより、日付の固定が解除され、リンクに基づいた計算が行われる
If tsk.ConstraintType <> pjAsSoonAsPossible Then
tsk.ConstraintType = pjAsSoonAsPossible
count = count + 1
End If
End If
Next tsk
On Error GoTo 0 ' エラーハンドリングを元に戻す
Application.ScreenUpdating = True
' 結果をユーザーに通知
MsgBox count & " 件のタスクから制約条件を解除し、ASAP化しました。" & vbCrLf & _
"これで計算エンジンが正しく動作する状態になりました。", vbInformation, "完了"
End a Sub
先輩エンジニアによる「ここがポイント」解説
この短いコードの中に、Project VBAを扱う上での重要なエッセンスが3つ詰まっています。
1. 「手動」から「自動」への転換 (`tsk.Manual = False`)
ここが一番のハマりポイントです。
MS Projectには「手動スケジューリング」というモードがあり、このモードのタスクは計算エンジンの外側にいます。手動モードのまま制約条件を変えようとしても、期待通りに日付が動きません。
まず強制的に `Manual = False`(自動スケジューリング)にすることで、計算エンジンの支配下に置く。これが鉄則です。
2. `pjAsSoonAsPossible` という定数
VBAでは `1` や `2` といった数字で指定することもできますが、`pjAsSoonAsPossible` という専用の定数を使います。これにより、「何を設定しようとしているか」が一目でわかる、メンテナンス性の高いコードになります。
3. サマリタスクへの配慮 (`On Error Resume Next`)
プロジェクトには「サマリタスク(親タスク)」が存在します。サマリタスクの日付は、配下のタスクの集計結果として自動決定されるため、直接制約条件を変更しようとするとエラーを吐く場合があります。
あえて `On Error Resume Next` を使い、「変更できないタスクは飛ばして次へ行く」という制御を入れるのが、実務的なエラー回避術です。
導入ステップ:どうやって使うのか?
1. MS Projectを開き、`Alt + F11` を押してVBAエディタを起動します。
2. メニューの `挿入` $\rightarrow$ `標準モジュール` をクリックします。
3. 上記のコードをコピー&ペーストします。
4. `F5` キーを押すか、Project画面に戻って `表示` $\rightarrow$ `マクロ` から `ResetAllConstraintsToASAP` を実行してください。
まとめ:ここをクリアすれば、基本はバッチリです
今回のマクロで学んだことは、単なる「削除」ではありません。
- オブジェクトの列挙:`For Each tsk In ActiveProject.Tasks` で全タスクを巡回する。
- 状態の制御:`Manual` プロパティでエンジンの動作モードを切り替える。
- 属性の変更:`ConstraintType` で計算ルールを定義する。
この3つの流れは、今後あなたが作成するあらゆるProjectマクロ(リソースの自動割り当てや、遅延タスクの抽出など)の共通パターンになります。
「制約を外して、エンジンの力を最大限に引き出す」。
これができるようになった君は、もう単なるユーザーではなく、Projectという強力な武器を操る「エンジニア」の入り口に立っています。
次は、特定の条件に合致するタスクだけを色付けしたり、Excelにレポート出力したりする自動化に挑戦してみましょう。応援していますよ!
