【入門編】初心者向け:特定のタスクタイプに定型制約を適用する「プリセット」機能 – Project VBA解析バイブル

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

プロジェクトの「魂」を自動化する:タスクタイプ別・制約条件プリセットの実装術

こんにちは。現場の複雑なプロジェクトを、コードの力で鮮やかに制御することに喜びを感じる、あなたの先輩エンジニアです。

「マクロの記録」を使って、なんとか作業を自動化しようと奮闘している。そんなあなたは、素晴らしい一歩を踏み出しています。しかし、もしあなたが「記録したコードをそのまま貼り付けるだけ」の状態なら、少しだけ立ち止まって、この記事を読んでみてください。

Project VBAの世界では、「何を操作するか」以上に「オブジェクトがどう動こうとしているか」を理解することが、プロフェッショナルへの最短ルートなのです。

今日は、スケジュール計算エンジンの心臓部である「制約条件(Constraints)」を、タスクの種類に応じて自動で割り当てる「プリセット機能」について解説します。これをマスターすれば、あなたは単なる「操作の記録者」から、「スケジュールの設計者」へと進化できるはずです。

1. なぜ「制約条件」を自動化する必要があるのか?

Microsoft Projectは、単なるガントチャート作成ツールではありません。背後で強力な「スケジュール計算エンジン」が動いています。

通常、タスクは「前のタスクが終わったらすぐ始める(ASAP: As Soon As Possible)」という状態になっています。しかし、実際の現場ではそうはいきません。

  • 「調査」タスク:準備ができ次第、最速で開始したい(ASAP)。
  • 「承認」タスク:早すぎると意味がない。期限ギリギリ、あるいは特定のタイミングまで後ろ倒しにしたい(ALAP: As Late As Possible)。

これらを一つひとつ手動で「制約条件」から設定していくのは、膨大な時間がかかりますし、ヒューマンエラーの温床です。

「タスク名に『承認』と入っていたら、自動的に制約を適用する」

このロジックを組み込むことで、プロジェクトの構造(アーキテクチャ)を定義するだけで、スケジュールが自動的に整う仕組みを作ることができるのです。

2. 核心:ConstraintType(制約条件型)を理解する

VBAで制約を制御するには、`Task`オブジェクトの`ConstraintType`プロパティを操作します。初心者がまず覚えるべき、主要な定数は以下の通りです。

定数名 (VBA) 意味 特徴
`pjConstraintAsSoonAsPossible` ASAP (最速) 標準的な設定。依存関係に従って最短で開始。
`pjConstraintStartNoEarlierThan` 開始前指定 「これより前には開始できない」という制約。
`pjConstraintStartNoLaterThan` ALAP的制御 「これより後には開始できない」という制約。
`pjConstraintSchedulingAsLateAsPossible` ALAP (最遅) スケジュール内で可能な限り遅いタイミングに配置。

> 💡 先輩のアドバイス
> プロジェクトの性質によりますが、実務では「この日付以降に開始してほしい」という `pjConstraintStartNoEarlierThan` を多用することが非常に多いです。

3. 実践:タスクタイプ別プリセット・マクロ

それでは、実際に使えるコードを見ていきましょう。
今回のシナリオは、「タスク名に特定のキーワードが含まれていたら、自動的に制約条件を切り替える」というものです。

Sub ApplyTaskTypePresets()
    ' ===========================================================
    ' 目的: タスク名に基づいて、制約条件(ConstraintType)を自動設定する
    ' ターゲット: 初学者向け・実務応用
    ' ===========================================================
    
    Dim t As Task
    Dim taskName As String
    
    ' 画面更新を停止してパフォーマンスを向上させる(大規模プロジェクト対策)
    Application.ScreenUpdating = False
    
    ' プロジェクト内の全タスクをループ処理
    For Each t In ActiveProject.Tasks
        
        ' 【重要】タスクが空(未入力の行)の場合、エラーになるためスキップする
        ' これを忘れると「実行時エラー 91」で止まってしまいます
        If Not t Is Nothing Then
            
            taskName = t.Name
            
            ' タスク名に応じて条件分岐(Select Caseを使うと読みやすい)
            Select Case True
                
                ' 1. 「調査」系タスク:最速で開始 (ASAP)
                Case taskName Like "*調査*" Or taskName Like "*Research*"
                    t.ConstraintType = pjConstraintAsSoonAsPossible
                    ' デバッグ用にコメントを残す(任意)
                    ' Debug.Print t.Name & " に ASAP を適用しました"
                
                ' 2. 「承認」系タスク:遅延を許容する設定 (ALAP的な制御)
                ' ここでは「指定した日付より前には開始しない」という制約の例
                Case taskName Like "*承認*" Or taskName Like "*Approval*"
                    ' ※実際には特定の日付を指定することが多いため、
                    ' ここでは例として「開始前指定」の型をセットします
                    t.ConstraintType = pjConstraintStartNoEarlierThan
                
                ' 3. 「開発」系タスク:標準設定(制約なし)に戻す
                Case taskName Like "*開発*" Or taskName Like "*Development*"
                    t.ConstraintType = pjConstraintAsSoonAsPossible
                
                ' それ以外は特に何もしない
                Case Else
                    ' 何もしない
            End Select
            
        End If
    Next t
    
    ' 画面更新を再開
    Application.ScreenUpdating = True
    
    MsgBox "プリセットの適用が完了しました!", vbInformation, "完了"
    
End Sub

4. ここが落とし穴!陥りやすいエラーと回避策

プロのエンジニアは、コードを書くことと同じくらい「壊れないこと」に心血を注ぎます。初心者が必ずと言っていいほどハマるポイントを解説します。

① 「オブジェクト変数または With ブロック変数が設定されていません」

これは、`For Each t In ActiveProject.Tasks` でループしている最中に、「タスクが何も入力されていない空の行」に到達した時に発生します。

  • 回避策: `If Not t Is Nothing Then` を必ず入れましょう。これは「もしタスク `t` が存在(Nothingではない)なら」という、エンジニアの必須の作法です。

② `Select Case` の使い方

`Select Case taskName` と書くと、完全一致(例:`taskName = “調査”`)しか判定できません。「調査(A工程)」のように文字が含まれる場合に反応させるには、上記コードのように `Select Case True` と書き、`Case taskName Like “*調査*”` と記述するテクニックが非常に有効です。

③ パフォーマンスの重み

タスクが数千行あるプロジェクトで、一つひとつの処理のたびに画面を書き換えると、マクロは極端に遅くなります。

  • 回避策: `Application.ScreenUpdating = False` を冒頭に入れ、最後に `True` に戻す。これは「プロの作法」です。

5. まとめ:次の一歩へ

お疲れ様でした。これであなたは、タスクの性質を理解し、それをコードを通じてプロジェクトの「ルール」へと昇華させる方法を学びました。

「マクロの記録」は、いわば「単語を覚えること」です。
今回学んだ「条件分岐(If/Select Case)」や「オブジェクトの存在確認(Nothingチェック)」は、「文章を作る文法」にあたります。

文法をマスターすれば、あなたは自分の思い描く通りの、複雑で強固な自動化システムを構築できるようになります。

「コードは、プロジェクトの意思を形にする手段である」

この言葉を胸に、ぜひ次の自動化に挑戦してみてください。応援していますよ!

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