【入門編】プロジェクトテンプレート適用時の「制約条件リセット」自動化ツール – Project VBA解析バイブル

スポンサーリンク

プロジェクトテンプレート適用時の「制約条件リセット」自動化:Project VBAでクリーンなスタートを切る秘訣

皆さん、こんにちは!Project VBAの世界へようこそ。今回は、プロジェクト管理の現場で「これ、どうにかならないかな…」と誰もが一度は思ったことがあるはず。そう、「プロジェクトテンプレートを適用したときに、勝手に設定されちゃう制約条件、全部リセットしたい!」という、ちょっぴりニッチだけど、めちゃくちゃ役立つ自動化ツールのお話です。

マクロの記録から一歩踏み出して、Project VBAの奥深い世界に足を踏み入れたい皆さん。そして、いつか自分だけの「魔法の杖」を作りたいと願う初心者エンジニアの皆さん。今日の記事は、そんな皆さんのための「Project VBAを掌握する極限の知見」を、優しく、そして丁寧に紐解いていく時間です。

なぜ「制約条件リセット」が必要なのか?~テンプレートの落とし穴~

まず、なぜこの「制約条件リセット」が重要なのか、その背景からお話ししましょう。

Project VBAでプロジェクトを新規作成する際、多くの人は「プロジェクトテンプレート」を活用します。これは、あらかじめタスク、リソース、そして「制約条件」などが設定されたひな形のこと。これを使えば、ゼロからプロジェクトを立ち上げる手間が省け、効率的に作業を開始できますよね。

しかし、ここには落とし穴があります。テンプレートに設定されている制約条件、例えば「開始日」「終了日」「完了期日」などが、新しいプロジェクトの意図と合わない場合があるのです。

  • 意図しない遅延: テンプレートの「終了日」制約が、実際のプロジェクト開始日よりも前に設定されていると、スケジュール計算が「無理だ!」と判断し、タスクの開始日を早めてしまうことがあります。
  • 管理の煩雑化: テンプレート由来の不要な制約条件が残っていると、後からスケジュールを調整する際に、どの制約条件が本当に必要なのか、どれがテンプレートの残り物なのか、判断が難しくなります。
  • ASAP/ALAPの意図の喪失: プロジェクトの初期段階では、タスクを「できるだけ早く(ASAP)」開始・終了させ、全体のスケジュール感を掴みたいものです。しかし、テンプレートの制約条件がこれを阻害してしまうことがあります。

これらの問題を解決するために、テンプレート適用後に「制約条件をリセット」し、クリーンな状態からスケジュール計算を始めるのが、最もシンプルで確実な方法なのです。

Project VBAの「制約条件」って何?~オブジェクトのライフサイクルを理解する~

ここで、Project VBAにおける「制約条件」について、少し掘り下げてみましょう。

Project VBAでは、タスクの開始日や終了日を決定するために、様々な「制約条件」が用意されています。これらは、タスクオブジェクトのプロパティとして管理されています。

制約条件の種類

代表的な制約条件には、以下のようなものがあります。

  • ASAP (As Soon As Possible): できるだけ早く(デフォルト)
  • ALAP (As Late As Possible): できるだけ遅く
  • FS (Finish-to-Start): 後続タスクの開始が先行タスクの完了に依存
  • SS (Start-to-Start): 後続タスクの開始が先行タスクの開始に依存
  • FF (Finish-to-Finish): 後続タスクの完了が先行タスクの完了に依存
  • SF (Start-to-Finish): 後続タスクの完了が先行タスクの開始に依存
  • MFO (Must Finish On): 指定した期日までに必ず完了
  • MSO (Must Start On): 指定した期日までに必ず開始

これらの制約条件は、タスクの「制約日」プロパティと組み合わせて使用されます。例えば、「MFO」制約で「2023/12/31」と指定すれば、「そのタスクは2023年12月31日までに完了しなければならない」という意味になります。

制約条件の「ライフサイクル」を意識する

ここで重要なのは、これらの制約条件がタスクオブジェクトの「ライフサイクル」の中でどのように振る舞うかを理解することです。

  • タスク作成時: デフォルトでは「ASAP」が設定されます。
  • 手動設定時: ユーザーがカレンダーで日付を指定したり、制約条件の種類を変更したりすると、そのタスクの制約条件が上書きされます。
  • テンプレート適用時: テンプレートに含まれる制約条件が、新規プロジェクトのタスクにコピーされます。

私たちが今回作りたいのは、この「テンプレート適用時」の挙動を、私たちの意図する形に「リセット」するための仕組みです。つまり、タスクが生成された直後(あるいはテンプレート適用後)に、そのタスクの制約条件を「ASAP」に戻し、制約日もクリアする、という処理を行いたいのです。

「制約条件リセット」自動化ツールのVBAコードを紐解く

それでは、いよいよ本題です。Project VBAで「制約条件リセット」を自動化するためのVBAコードを見ていきましょう。

このツールは、プロジェクト内の全てのタスクを巡回し、それぞれの制約条件を「ASAP」にリセットするものです。

‘==============================================================================
‘ Sub: ResetAllTaskConstraints
‘ 説明: プロジェクト内の全てのタスクの制約条件をASAPにリセットし、
‘ 制約日をクリアします。
‘==============================================================================
Sub ResetAllTaskConstraints()

Dim tsk As Task
Dim pj As Project

‘ 現在アクティブなプロジェクトを取得
‘ Application.ActiveProject は、現在開いているプロジェクトオブジェクトを返します。
‘ もしプロジェクトが開かれていない場合はエラーになるため、
‘ 実際にはエラーハンドリングを追加することが推奨されます。
Set pj = Application.ActiveProject

‘ プロジェクト内の全てのタスクをループ処理
‘ pj.Tasks コレクションは、プロジェクト内の全てのタスクを含んでいます。
‘ For Each…Next ステートメントは、コレクションの各要素に対して処理を繰り返します。
For Each tsk In pj.Tasks

‘ タスクの制約条件を ASAP (1) に設定
‘ tsk.ConstraintType プロパティは、タスクの制約条件の種類を表します。
‘ 定数 `pjConstraintAsSoonAsPossible` は、ASAP制約を表し、その値は 1 です。
‘ 他にも pjConstraintFinishNoEarlierThan (2), pjConstraintFinishNoLaterThan (3) などがあります。
tsk.ConstraintType = pjConstraintAsSoonAsPossible

‘ タスクの制約日をクリア (Null 値を設定)
‘ tsk.ConstraintDate プロパティは、制約条件が適用される日付を設定または取得します。
‘ Null 値を設定することで、制約日がクリアされます。
‘ Null は、値が存在しないことを示す特殊な値です。
‘ VBA では Null を扱う際に IsNull() 関数などを使用しますが、
‘ ConstraintDate プロパティに直接 Null を設定することでクリアできます。
tsk.ConstraintDate = Null

‘ 特定のタスク(例:サマリータスクやマイルストーン)を除外したい場合は、
‘ ここに条件分岐を追加します。
‘ If Not tsk.IsSummary And Not tsk.IsMilestone Then
‘ ‘ 制約条件をリセットする処理
‘ End If

Next tsk

‘ 処理完了メッセージを表示
MsgBox “全てのタスクの制約条件をASAPにリセットしました。”, vbInformation, “制約条件リセット完了”

‘ オブジェクト変数を解放
Set tsk = Nothing
Set pj = Nothing

End Sub

コードの各部分を分かりやすく解説

  • `Sub ResetAllTaskConstraints()`: これは、この処理の開始を宣言する部分です。「ResetAllTaskConstraints」という名前で、この処理を呼び出すことができます。
  • `Dim tsk As Task`: `tsk` という名前の変数を定義しています。この変数は、後でプロジェクト内の個々の「タスク」を指し示すために使います。`Task` というのは、Project VBAが用意している「タスク」という種類のデータを扱うための型です。
  • `Dim pj As Project`: 同様に、`pj` という名前の変数を定義しています。これは、現在開いている「プロジェクト」全体を指し示すための変数です。`Project` という型を使います。
  • `Set pj = Application.ActiveProject`: `Application.ActiveProject` は、現在アクティブになっている(一番手前に表示されている)プロジェクトオブジェクトを返します。それを `pj` 変数に「セット」しています。
  • ここがポイント!: `Set` キーワードは、オブジェクト型の変数を扱うときによく使われます。単なる値(数値や文字列)を代入するのではなく、オブジェクトそのものを指し示すように設定するイメージです。
  • `For Each tsk In pj.Tasks`: ここからが、プロジェクト内のタスクを一つずつ処理していくループ処理の始まりです。`pj.Tasks` は、プロジェクト `pj` に含まれる全てのタスクの集まり(コレクション)です。`For Each` は、このコレクションの各要素(ここでは `tsk` というタスク)に対して、その後の処理を繰り返します。
  • まるで「タスクの宝箱」を開けて、一つずつ中身を取り出しているイメージ!
  • `tsk.ConstraintType = pjConstraintAsSoonAsPossible`: これが、制約条件を「ASAP」に設定する核心部分です。
  • `tsk.ConstraintType` は、現在のタスク `tsk` の制約条件の種類を表すプロパティです。
  • `pjConstraintAsSoonAsPossible` は、Project VBAがあらかじめ用意しておいてくれた「ASAP」を表す定数です。これを使うことで、コードが読みやすくなりますし、誤字脱字によるエラーを防げます。
  • VBAの定数: `pjConstraintAsSoonAsPossible` のような `pj` で始まるものは、Project VBAの「定数」と呼ばれるものです。これは、特定の値を分かりやすい名前で扱えるようにするためのものです。ASAPは数値の「1」に相当しますが、コードに「1」と書くより `pjConstraintAsSoonAsPossible` と書いた方が、何をしているか一目瞭然ですよね!
  • `tsk.ConstraintDate = Null`: 制約条件が「ASAP」になったら、それに紐づく「制約日」は不要になります。そこで、`Null` を代入してクリアします。
  • `Null` とは?: 「値がない」「未定義」といった状態を表す特別な値です。日付が設定されていない状態を明確に示します。
  • `Next tsk`: `For Each` ループの終わりです。ここで、次のタスクがあれば、そのタスクに対して再び `tsk.ConstraintType = …` からの処理が繰り返されます。
  • `MsgBox “全てのタスクの制約条件をASAPにリセットしました。”, vbInformation, “制約条件リセット完了”`: 全てのタスクの処理が終わったら、ユーザーに完了を知らせるメッセージボックスを表示します。
  • `vbInformation` は、アイコンとして情報マークを表示させるための定数です。
  • `Set tsk = Nothing` / `Set pj = Nothing`: 処理が終わったオブジェクト変数は、メモリを解放するために `Nothing` をセットして、後始末をしておくのが良い習慣です。

陥りやすいエラーとその対策

  • エラー1: プロジェクトが開かれていない状態で実行してしまう
  • `Set pj = Application.ActiveProject` の行でエラーが発生します。
  • 対策: コードを実行する前に、必ずProjectを開いておくか、コードの冒頭に「もしプロジェクトが開かれていなかったら、メッセージを表示して終了する」といったエラーハンドリングを追加しましょう。

If Application.ActiveProject Is Nothing Then
MsgBox “プロジェクトが開かれていません。処理を中止します。”, vbExclamation, “エラー”
Exit Sub
End If
Set pj = Application.ActiveProject

  • エラー2: サマリータスクやマイルストーンの制約条件をリセットしたくない場合
  • 現在のコードでは、全てのタスク(サマリータスクやマイルストーンも含む)の制約条件がリセットされます。もし、これら特定のタスクは除外したい場合は、`If` 文で条件分岐を追加する必要があります(コード内のコメント部分を参照)。
  • エラー3: 制約条件の種類を間違えて設定してしまう
  • 例えば、`pjConstraintFinishNoEarlierThan` を意図せず設定してしまうと、意図しないスケジュールになってしまいます。
  • 対策: 使用する定数(`pjConstraintAsSoonAsPossible` など)は、公式ドキュメントやVBAエディタのインテリセンス(コード入力時に候補を表示してくれる機能)で確認しながら正確に入力しましょう。

「制約条件リセット」を自動化する具体的なシナリオ

この「制約条件リセット」ツールは、以下のような場面で非常に役立ちます。

1. 新規プロジェクト作成時の初期化:

  • テンプレートを適用してプロジェクトを作成した直後に、このマクロを実行します。
  • これにより、テンプレート由来の不要な制約条件が全てクリアされ、クリーンな状態で「ASAP」からスケジュール計算を開始できます。

2. 既存プロジェクトの「リフレッシュ」:

  • スケジュールが混乱してしまったプロジェクトの制約条件を一度リセットし、根本から再計算したい場合。
  • ただし、この場合は重要な制約条件も消えてしまうため、事前にバックアップを取るなど慎重な操作が必要です。

3. 開発・テスト環境での利用:

  • テンプレートの制約条件がスケジュール計算にどう影響するかをテストしたい場合。
  • 制約条件をリセットしてから、意図的に制約条件を設定していく、という開発プロセスで活用できます。

まとめ:Project VBAの基本をマスターする旅へ

いかがでしたでしょうか?今回は、Project VBAにおける「制約条件」の基本から、テンプレート適用時の「制約条件リセット」を自動化するVBAコードまでを、丁寧にご紹介しました。

  • タスクオブジェクトのプロパティ (ConstraintType, ConstraintDate) を理解すること。
  • `For Each` ループ を使って、コレクション内の要素を処理すること。
  • `Set` キーワード と オブジェクト変数 の使い方。
  • VBAの定数 (pjConstraintAsSoonAsPossible など) の重要性。
  • `Null` 値 の意味と使い方。

これらは、Project VBAを使いこなす上で、非常に重要な基礎知識です。この「制約条件リセット」ツールを理解し、実際に動かしてみることで、皆さんはProject VBAのプログラミングの基本をしっかりと掴むことができるはずです。

マクロの記録だけでは得られない、コードを「書く」ことの面白さ、そして「自動化」による効率化の喜びを、ぜひ体験してください。

ここをクリアすれば、Project VBAの基本はバッチリですよ! 次回も、皆さんのProject VBAライフを豊かにする、とっておきの情報をお届けします。お楽しみに!

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