【入門編】初心者向け:VBAによる制約条件の一括削除と、プロジェクトの完全ASAP化 – Project VBA解析バイブル

スポンサーリンク
スポンサーリンク

スケジュールを「意志」の支配から解き放つ:Project VBAで制約条件を一括解除し、真のASAP状態へ導く技術

こんにちは。プロジェクト管理の自動化、その深淵へようこそ。

「マクロの記録」ボタンを押し、タスクの開始日をマウスで動かして、その操作をコードに書き出す……。もしあなたが今、そんな方法でProject VBAを学び始めているなら、まずはその一歩を全力で称賛させてください。それはエンジニアとしての第一歩です。

しかし、同時に一つだけ伝えておかなきゃいけないことがあります。
「マクロの記録」だけでは、Project VBAの本当の恐ろしさと、本当の自由さは手に入りません。

なぜなら、Project VBAの本質は「操作の記録」ではなく、「プロジェクトという巨大な計算エンジンの制御」にあるからです。

今日は、初心者が最初につまずき、かつマスターすると劇的に視界が開けるテーマ、「制約条件(Constraints)の一括解除と、プロジェクトの完全ASAP化」についてお話ししましょう。

1. なぜ、あなたのスケジュールは「動かない」のか?

プロジェクトを管理していると、こんな現象に遭遇しませんか?

  • 「前工程のタスクを短縮したのに、後続タスクの開始日が全く動かない」
  • 「ガントチャートのバーが、まるで地面に縫い付けられたように固定されている」

この現象の正体、それは「制約条件(Constraints)」です。

制約条件という名の「重り」

Projectには、タスクの動きを縛るためのプロパティがあります。

  • 「指定した日に開始(Must Start On)」
  • 「指定した日までに終了(Must Finish By)」

これらは、いわばスケジュールという流れる水に投げ込まれた「重り」です。一度これらが設定されると、たとえ依存関係(先行・後続)を正しく設定していても、プロジェクトの計算エンジンは「重りの指示」を優先してしまいます。

結果として、クリティカルパスは崩れ、スケジュールは不自然な歪みを見せ始めます。

真にダイナミックなスケジュールとは、すべてのタスクが「できるだけ早く(ASAP: As Soon As Possible)」という自由な状態で、依存関係の鎖によってのみ結ばれている状態を指します。

2. 極限の思考:オブジェクトを「全走査」する

さて、ここからがプログラミングの本番です。
「すべてのタスクの制約を解除する」という命令を、人間が一つずつ手作業で行うのは非効率の極みですよね。そこでVBAの出番です。

私たちが書くべきロジックの設計図はこうです。

1. プロジェクト内のすべての「タスク」を一人ずつ呼び出す(ループ処理)
2. そのタスクが「空っぽ(Nothing)」でないか確認する(エラー回避)
3. タスクの「制約タイプ」を「制約なし(None)」に書き換える
4. (おまけ)計算エンジンに「再計算して!」と伝える

この「一人ずつ呼び出して確認する」というプロセスが、プログラミングにおける「オブジェクトのライフサイクル」を意識する第一歩になります。

3. 実装:プロジェクトを完全ASAP化するスクリプト

さあ、コードを書いていきましょう。これは、そのままコピーして標準モジュールに貼り付けて使える、実戦的なコードです。

Option Explicit

''' <summary>
''' プロジェクト内の全タスクの制約条件を解除し、
''' すべてのタスクを「可能な限り早く(ASAP)」の状態にリセットします。
''' </summary>
Sub ResetAllTasksToASAP()
    Dim t As Task
    Dim taskCount As Long
    Dim resetCount As Long
    
    ' --- パフォーマンス最適化の儀式 ---
    ' 大規模なプロジェクトの場合、画面更新と再計算を一時停止することで
    ' 処理速度を劇的に向上させます。これが「プロの作法」です。
    Application.ScreenUpdating = False
    Application.Calculation = pjCalculationManual
    
    On Error GoTo ErrorHandler
    
    resetCount = 0
    taskCount = 0
    
    ' プロジェクト内のすべてのタスクをループ(走査)する
    For Each t In ActiveProject.Tasks
        ' タスクが存在するかチェック(空の行をスキップするため)
        ' ここを忘れると、空の行に触れた瞬間にエラーで止まってしまいます。
        If Not t Is Nothing Then
            taskCount = taskCount + 1
            
            ' 制約タイプを「制約なし(pjTaskConstraintNone)」に設定
            ' これにより、タスクは依存関係に従って自由に動けるようになります。
            If t.ConstraintType <> pjTaskConstraintNone Then
                t.ConstraintType = pjTaskConstraintNone
                resetCount = resetCount + 1
            End If
        End If
    Next t

    ' --- 仕上げの儀式 ---
    ' 設定を元に戻し、計算エンジンを再始動させる
    Application.Calculation = pjCalculationAutomatic
    Application.ScreenUpdating = True
    
    MsgBox "処理が完了しました!" & vbCrLf & _
           "スキャンしたタスク数: " & taskCount & vbCrLf & _
           "制約を解除したタスク数: " & resetCount, vbInformation, "成功"
    
    Exit Sub

ErrorHandler:
    ' エラーが発生した場合の安全装置
    Application.Calculation = pjCalculationAutomatic
    Application.ScreenUpdating = True
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "エラー"
End Sub

4. コードの深淵:ここを理解すれば、あなたはもう初心者ではない

このコードには、初心者が脱却するための「3つの知見」が詰まっています。

① `If Not t Is Nothing Then` の重要性

Projectのタスクリストには、タスクが入力されていない「空の行」が含まれていることがあります。VBAで`For Each`を使ってタスクを回すとき、この「空っぽの行(Nothing)」に対して「制約を消せ!」と命令すると、プログラムは「存在しないものに命令はできない!」とパニックを起こして止まってしまいます。
これを防ぐのが、この一行。オブジェクトの存在確認は、自動化エンジニアの生命線です。

② パフォーマンスへの配慮 (`Application.Calculation`)

タスクを一つ書き換えるたびに、Projectは「えっ、スケジュールが変わった? 再計算しなきゃ!」と毎回計算を始めてしまいます。タスクが1,000個あれば、1,000回計算が走ります。これは非常に重い作業です。
「一旦、計算を止めて(Manual)、全部終わってから一気に計算して(Automatic)」と指示を出す。この計算エンジンの制御こそが、大量のデータを扱うエンジニアの腕の見せ所です。

③ `ConstraintType = pjTaskConstraintNone`

これが今回の核心です。`pjTaskConstraintNone`という定数は、Projectが定義している「制約なし」という状態を指します。これを代入することで、タスクに課せられていた「日付の呪縛」を解き放つのです。

5. まとめ:制約を解き放ち、フローを作る

いかがでしたか?
「制約を消す」という一見シンプルな操作の裏側には、オブジェクトの存在確認、エラーハンドリング、そして計算エンジンの制御といった、重要な概念が凝縮されています。

このスクリプトを使えば、どんなに複雑に絡まったスケジュールも、一度「純粋な依存関係だけの状態」に戻すことができます。そこから改めて、正しい先行・後続関係を構築していく。これが、プロが実践する「スケジュールのクレンジング」です。

「マクロの記録」の先にある、この「制御」の世界を楽しんでください。
ここをクリアすれば、Project VBAの基本はバッチリですよ。

次回の記事では、さらに一歩進んで、「特定の条件を持つタスクだけを抽出する」という、より高度なフィルタリング技術についてお話ししましょう。

それでは、Happy Coding!

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