【入門編】実務中級:プロジェクト開始日を基準とした全タスクのASAP一括変換スクリプト – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で、MS Projectの複雑なスケジュール計算エンジンに頭を悩ませていませんか?

「マクロの記録」でVBAの世界に足を踏み入れたものの、いざ実務のデータに触れようとすると、謎のエラーや予期せぬ挙動の連続……。「ここをクリアすれば、Project VBAの基本はバッチリですよ!」ということで、今回は実務で最も要望が多い「プロジェクト開始日を基準とした全タスクのASAP(できる限り早く)一括変換スクリプト」の作り方を、プロの知見を交えて徹底解説します。

Excel VBAとは一味違う、MS Project特有のオブジェクトのクセを一緒に攻略していきましょう。

—

1. なぜ「ASAP一括変換」が実務で必要なのか?

MS Projectには、タスクのスケジュールをコントロールするための「制約条件(Constraint Type)」が数多く存在します。「指定日以降に開始 (SNET)」や「Mso(マイルストーン必着)」などが勝手に設定されているプロジェクトファイルを他部門から受け取ったことはありませんか?

これらが混在していると、プロジェクト開始日を変更した瞬間にスケジュールが崩壊し、ガントチャートがスパゲッティ状態になります。
これを手動で全タスク一件一件「ASAP(できる限り早く)」に直していくのは、まさに地獄の作業。だからこそ、VBAによる一括クレンジングが必要なのです。

Project VBAの基本:タスクのライフサイクル

Excelと違い、MS Projectは「スケジュール計算エンジン」が常に裏で動いています。
そのため、VBAでタスクのプロパティを書き換えるたびにエンジンが再計算を行おうとします。ここを理解していないと、処理が猛烈に遅くなったり、予期せぬ制約違反エラーにぶつかったりします。

—

2. 現場で使える!ASAP一括変換スクリプト

それでは、実際にプロジェクト内の全タスクを強制的にASAP制約へ変更し、さらにプロジェクト開始日を基準に再計算させる実用スクリプトを公開します。

開発タブのVBE(Visual Basic Editor)を開き、標準モジュールに以下のコードを貼り付けてください。

‘ ==============================================================================
‘ 処理名 : 全タスクASAP一括変換・クレンジングツール
‘ 概要 : プロジェクト内の全タスクの制約条件を「ASAP(できる限り早く)」に統一し、
‘ スケジュール計算エンジンの整合性を強制的に担保する。
‘ ==============================================================================
Sub ConvertAllTasksToASAP()
Dim tsk As Task
Dim targetProject As Project
Dim changedCount As Long

‘ 1. アクティブなプロジェクトを取得
Set targetProject = ActiveProject
changedCount = 0

‘ 2. 処理速度向上のための画面描画停止(※ProjectではApplication.ScreenUpdatingが使えないため注意)
‘ 代わりに計算モードを手動に切り替えるアプローチもありますが、
‘ 今回は安全性を考慮し、エラーハンドリングを確実に実装します。

On Error GoTo ErrorHandler

‘ 3. ユーザーへの確認(実務での誤爆を防ぐ鉄則)
If MsgBox(“このプロジェクトの全タスク(サマリータスクを除く)の制約を「ASAP」に変更しますか?” & vbCrLf & _
“この操作は元に戻せません。”, vbYesNo + vbQuestion, “ASAP一括変換”) = vbNo Then
Exit Sub
End If

‘ 4. ステータスバーに進捗を表示
Application.StatusBar = “タスクの制約を変換中…”

‘ 5. 全タスクをループ処理
For Each tsk In targetProject.Tasks
‘ 存在しないタスク(空白行など)や、プロジェクトの根っこ(ID 0)をスキップ
If Not tsk Is Nothing Then
If tsk.ID > 0 Then
‘ サマリータスク(親タスク)は制約を変更するとエラーになるためスキップ
If Not tsk.Summary Then

‘ すでにASAP(定数: pjConstraintASAP = 0)以外の場合のみ変更
If tsk.ConstraintType <> pjConstraintASAP Then
tsk.ConstraintType = pjConstraintASAP
changedCount = changedCount + 1
End If

End If
End If
End If
Next tsk

‘ 6. スケジュールエンジンの再計算を実行
Calculate

‘ 7. 完了メッセージ
Application.StatusBar = “”
MsgBox “処理が完了しました。” & vbCrLf & _
“変更されたタスク数: ” & changedCount & ” 件”, vbInformation, “完了”

Exit Sub

ErrorHandler:
Application.StatusBar = “”
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “エラー”
End Sub

—

3. コードの重要ポイントと「初心者が陥りやすい罠」

上記のコードには、実務で生き残るための重要なノウハウが詰まっています。いくつか解説しましょう。

① サマリータスク(親タスク)の罠

ここがMS Project VBA最大のハマりどころです。
親タスク(子をまとめる階層上のタスク)に対して `ConstraintType` を変更しようとすると、実行時エラーが発生します。親タスクの日付は子タスクの集計によって自動決まるため、手動で制約を持てないからです。
コード内の `If Not tsk.Summary Then` という判定は、このエラーを華麗に回避するための必須テクニックです。

② 定数(`pjConstraintASAP`)の活用

マジックナンバー(直接 `0` と書くこと)を避け、Projectが用意している組み込み定数を使うことで、コードの可読性が飛躍的に上がります。

  • `pjConstraintASAP` = できる限り早く (ASAP)
  • `pjConstraintALAP` = できる限り遅く (ALAP)
  • `pjConstraintSNET` = 指定日以降に開始 (Start No Earlier Than)

③ 画面描画と再計算のコントロール

Excel VBAではお馴染みの `Application.ScreenUpdating = False` は、実はMS Project VBAでは機能しません。その代わり、ループを抜けた後に `Calculate` メソッドを明示的に呼び出すことで、エンジンに一斉計算をさせ、パフォーマンスを最適化しています。

—

まとめ:ここをクリアすればProject VBAは怖くない!

今回は、プロジェクトのスケジュールを健全に保つための「ASAP一括変換スクリプト」をご紹介しました。

  • 親タスク(Summary)は触ってはいけない
  • ループを回すときは `Nothing` チェックと `ID > 0` を忘れない
  • 処理の最後には必ず `Calculate` でエンジンを叩く

この3つさえ押さえておけば、どんなに複雑なスケジュールデータが持ち込まれても、あなた自身のVBAツールで一瞬にしてクレンジングできるようになります。

現場で頼られる自動化エンジニアへの第一歩、ここをクリアすればもうバッチリですね!ぜひ日々の業務に取り入れてみてください。

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