【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」を「業務フローの制約」に置き換えてみてください。
ここをクリアしたあなたは、もうマクロの記録に頼る初心者ではありません。次は、イベントハンドラを使って「操作そのものを禁止する」高次元の制御に挑戦しましょう。
また、現場でお会いしましょう!応援しています。
