【入門編】【中級者向け】タスクの「完了率」に応じて依存関係のリンクを自動的に「実績」として保護する制御法 – Project VBA解析バイブル

スポンサーリンク

【Project VBAの深淵へ】完了タスクを「鉄壁」にする!依存関係保護の極意

こんにちは。現場で泥臭く、しかし誰よりも美しく自動化を追求するエンジニアです。

Project VBAの世界に足を踏み入れた皆さん、おめでとうございます。マクロの記録ボタンを押し、生成されたコードに翻弄される日々はもう終わりです。今日は、「タスクの完了率(% Complete)に応じて、依存関係(リンク)を自動でロックする」という、実務で最も要望される「品質管理」の仕組みを伝授しましょう。

なぜこれが必要か? プロジェクト後半、誰かが誤って完了済みのタスクの依存関係を書き換え、スケジュール全体が崩壊する……そんな悲劇を防ぐためです。

—

1. Project VBAにおける「タスク」と「依存関係」の構造

まず、頭の中を整理しましょう。Projectにおいて、タスク同士の繋がりは`TaskDependencies`オブジェクトによって管理されています。

  • Task(タスク): プロジェクトの最小単位。
  • TaskDependency(依存関係): 「先行タスク」と「後続タスク」を結ぶ線。

今回のミッションは、「完了率が100%になったタスクが関与する依存関係を、コードで制御し変更不可能にする」ことです。Projectのオブジェクトモデルには直接的な「読み取り専用ロック」プロパティはないため、「変更を検知した瞬間に元に戻す」あるいは「編集権限を制限する」という設計思想でアプローチします。

—

2. 【実装】完了タスクを保護する守護神スクリプト

以下のコードは、選択したタスクが完了済みである場合、その依存関係を「保護対象」としてマークし、編集を無効化する仕組みの骨子です。

‘ プロジェクトの全タスクを走査し、完了済みタスクの依存関係を保護する
Sub ProtectCompletedTaskDependencies()
Dim tsk As Task
Dim dep As TaskDependency

‘ プロジェクト内の全タスクをループ処理
For Each tsk In ActiveProject.Tasks
‘ tskがNothing(空行)でないことを確認し、完了率が100%かチェック
If Not tsk Is Nothing Then
If tsk.PercentComplete = 100 Then

‘ 完了タスクが持つ依存関係を順次確認
For Each dep In tsk.TaskDependencies
‘ ここで「保護フラグ」を立てるイメージ
‘ 実際には、カスタムフィールド(Flag1等)を使って制御するのが定石
tsk.Flag1 = True

Debug.Print “タスク「” & tsk.Name & “」の依存関係を保護しました。”
Next dep

End If
End If
Next tsk

MsgBox “完了タスクの保護設定が完了しました。”, vbInformation
End Sub

—

3. なぜ「フラグ(Flag)」を使うのか?

初心者のうちは「なぜ直接プロパティをいじらないのか?」と疑問に思うかもしれません。

実は、Project VBAにおいて依存関係を直接削除・ロックしすぎると、「プロジェクトの整合性エラー」を引き起こし、ファイルが破損するリスクがあります。だからこそ、現場のプロは「カスタムフィールド(Flag1〜20)」をガードレールとして使うのです。

1. Flag1がTrueなら、そのタスクに関連する依存関係の変更を禁止する(イベントプロシージャで制御)。
2. イベントプロシージャ(`Project_BeforeTaskChange`)を組み合わせることで、ユーザーが誤ってリンクを削除しようとした瞬間に「操作をキャンセル」させることが可能です。

—

4. 陥りやすい罠:ここだけは注意!

  • Nullタスクの罠: `ActiveProject.Tasks`には、行が空のタスクも含まれます。`If Not tsk Is Nothing`を忘れると、実行時エラーでスクリプトが止まります。
  • 再帰的な依存関係: A→B→Cと繋がっている場合、Bを保護するとCにも影響が出ます。依存関係の深さを考慮した設計を心がけてください。
  • 手動修正との闘い: VBAで保護しても、ユーザーが手動で設定を変えてしまうことがあります。`BeforeTaskChange`イベントとセットで運用するのが「伝説のエンジニア」の流儀です。

—

最後に:自動化は「愛」です

コードをただ書くのではなく、「このプロジェクトを誰が触っても壊れないようにする」という設計者としての愛を持ってください。

タスクの依存関係を管理することは、プロジェクトの「魂」を守ることです。今回のスクリプトをベースに、皆さんの現場に合わせて「Flag1」を「業務フローの制約」に置き換えてみてください。

ここをクリアしたあなたは、もうマクロの記録に頼る初心者ではありません。次は、イベントハンドラを使って「操作そのものを禁止する」高次元の制御に挑戦しましょう。

また、現場でお会いしましょう!応援しています。

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