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

スポンサーリンク

こんにちは!プロジェクト管理の現場で、複雑に入り組んだスケジュールや無数の制約条件に頭を悩ませていませんか?

「スケジュールを一度まっさらな状態にして、すべてのタスクをできるだけ早く(ASAP)開始させたいのに、手動で一つひとつ設定を直していくなんて気が遠くなる……」

そんな絶望的な状況を、たった一撃で解決するのがProject VBA(MS ProjectのVBA)です。今回は、散らかった制約条件を根こそぎクリアにし、プロジェクトを完全なASAP(可能な限り早期に)モードへと昇華させる「リセットボタン」の作り方を、優しく徹底的に解説していきます。

ここをクリアすれば、あなたもProject VBAの基本と、オブジェクトを操る快感を一気に掴めますよ。一緒にマスターしていきましょう!

—

1. なぜ「手動」ではなく「VBA」なのか?

MS Projectを使っていると、タスクの期日を設定した拍子に「期日以降に開始」「完了期日」といった強力な制約条件(Constraint Type)が勝手に付与されてしまうことがよくあります。これが原因で、全体のスケジュール変更が利かなくなる「がんじがらめ状態」に陥るのです。

これをGUI(画面操作)で直そうとすると、何百行もあるタスクのプロパティを一つずつ開いて……と、途方もない時間がかかります。しかもヒューマンエラーは避けられません。

だからこそ、VBAの出番です。MS Projectの背後にあるオブジェクトモデルを正しく理解し、一網打尽にするスクリプトを組んでしまえば、どんなに巨大なプロジェクトであっても一瞬でクリーンアップできます。

—

2. Project VBAの基本構造:タスクと制約の切っても切れない関係

まずは、Project VBAにおける「お作法」を軽く押さえておきましょう。Excel VBAと似ていますが、MS Projectには「プロジェクト全体(Project)」の中に「タスク(Task)」のコレクションが存在するという階層構造があります。

制約条件を扱う上で絶対に知っておかなべき重要な定数(Enum)がこれです:

  • `pjASAP` (可能な限り早期に / As Soon As Possible)
  • `pjALAP` (可能な限り遅くに / As Late As Possible)
  • `pjMustStartOn` (指定日開始 / Must Start On)などなど……

今回は、この中の `pjASAP` をすべてのタスクに強制適用しつつ、厄介な日付の縛り(Constraint Date)も同時にリセットしていきます。

—

3. 実装!プロジェクト完全ASAP化ツール

それでは、実際のコードを見てみましょう。開発タブのVBE(Visual Basic Editor)を開き、標準モジュールに以下のコードを貼り付けてください。

実務ですぐに使えるよう、エラーハンドリングと処理件数のログ出力も組み込んだ、ちょっと誇れるプロ仕様のコードになっています。

Sub ResetProjectToTotalASAP()
‘ —————————————————————-
‘ 処理名: プロジェクト完全ASAP化&制約リセットツール
‘ 概要: プロジェクト内の全タスクの制約条件を「ASAP」に強制変更し、
‘ ガチガチに固まったスケジュールを解放します。
‘ —————————————————————-

Dim tsk As Task
Dim targetProj As Project
Dim resetCount As Long

‘ 実行確認のメッセージボックス
Dim userAnswer As VbMsgBoxResult
userAnswer = MsgBox(“このプロジェクトのすべてのタスク制約を解除し、” & vbCrLf & _
“「可能な限り早期に (ASAP)」へ強制リセットしますか?” & vbCrLf & _
“※この操作は元に戻せません。”, _
vbYesNo + vbExclamation, “完全ASAP化の確認”)

If userAnswer = vbNo Then
MsgBox “処理をキャンセルしました。”, vbInformation
Exit Sub
End If

‘ アクティブなプロジェクトを取得
Set targetProj = ActiveProject

‘ 念のため画面描画を停止してマクロの実行速度を爆上げする
Application.ScreenUpdating = False

resetCount = 0

‘ プロジェクト内の全タスクをループ処理
For Each tsk In targetProj.Tasks
‘ サマリータスク(親タスク)や削除済みタスクを除外するための安全策
If Not tsk Is Nothing Then
If Not tsk.Summary Then ‘ サマリータスク以外を対象にする場合

‘ 【ここが核心】制約タイプを ASAP に設定
tsk.ConstraintType = pjASAP

‘ 制約日(ConstraintDate)も初期値(NA)にリセット
‘ ※ASAPの場合、制約日は通常「NA(Not Applicable)」またはプロジェクト開始日になります
tsk.ConstraintDate = “NA”

resetCount = resetCount & 1 ‘ カウントアップ(簡易表現)
resetCount = resetCount + 1
End If
End If
Next tsk

‘ 画面描画を復元
Application.ScreenUpdating = True

‘ 完了報告
MsgBox “リセットが完了しました!” & vbCrLf & _
“処理対象タスク数: ” & resetCount & ” 件”, _
vbInformation, “処理成功”

End Sub

コードのここがポイント!

1. `ActiveProject.Tasks` による全走査
Excelの `ActiveSheet.UsedRange` と同じように、プロジェクトに存在するすべてのタスクを `For Each` で一つずつ丁寧に拾い上げていきます。
2. `Not tsk.Summary` のガード条項
プロジェクト管理において、親にあたる「サマリータスク」の制約を無理やり変えるとスケジュール全体がバグる原因になります。実務では「子タスク(末端タスク)」のみを対象にするのが鉄則です。このコードではサマリータスクを安全に避ける配慮をしています。
3. `Application.ScreenUpdating = False`
タスクが数千件ある巨大なスケジュールファイルでは、画面を描画しながら処理すると激重になります。これをオフにすることで、プログラミングが驚異的なスピードで完了します。

—

4. 陥りやすいエラーと知っておくべき極意

最後に、現場で初心者がハマりがちなポイントをいくつかシェアしておきますね。ここを知っているだけで、トラブルシューティングのスキルが一段と上がります。

① 「実行時エラー ‘1100’: このフィールドを設定できません」が出る

  • 原因: 読み取り専用のタスクや、外部プロジェクトとリンクしているタスク(リソースプールやサブリソースなど)に対して書き込みを行おうとした場合に発生します。
  • 対策: 担当者や外部依存関係があるタスクが含まれている場合は、`On Error Resume Next` で一時的にエラーをスルーするか、条件分岐で除外するフィルターをかけましょう。

② 「制約日(Constraint Date)」が消えない?

  • 原因: MS Projectの仕様上、`pjASAP` に設定しても古い制約日付がデータベース上に残る場合があります。
  • 対策: 今回のコードのように、`tsk.ConstraintDate = “NA”` をセットで記述することで、完全にクリーンな状態に初期化することができます。

—

まとめ:自動化の第一歩を踏み出そう

今回は、プロジェクトの制約条件を根こそぎクリアにし、完全なASAP状態を作り出すVBAツールをご紹介しました。

「マクロの記録」から一歩踏み出し、こうしたオブジェクトを直接操作するコードが書けるようになると、あなたの業務効率化の引き出しは圧倒的に広がります。何時間もかかっていたスケジュール調整が、たった1秒で終わる快感――ぜひご自身の開発現場で味わってみてください。

ここをクリアできれば、Project VBAの基本はもうバッチリです!あなたのエンジニアライフを応援しています。

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