【Project VBA】タスクの「依存関係」を可視化せよ:WBS自動ドキュメント生成の極意
プロジェクトの進捗会議で、Excelのタスクリストをただ眺めて時間を浪費していないか?
「あのタスクが遅れると、全体にどう波及するのか?」という問いに対し、脳内シミュレーションで答えるのはマネジメントではない。それは単なるギャンブルだ。
今日は、Project VBA(Microsoft Projectのオブジェクトモデル)を極限まで使いこなし、タスクの「メモ(Notes)」フィールドに隠された依存関係を自動抽出し、一瞬でMarkdown形式のドキュメントに変換する「真の効率化」を伝授する。
—
1. なぜ「メモ」フィールドなのか?
多くの現場では、依存関係を「先行タスク(Predecessors)」列のみで管理しようとする。しかし、複雑なプロジェクトでは、なぜそのタスクが依存しているのかという「コンテキスト」が欠落する。
私はあえて、「メモ」フィールドに `[DEP:ID1,ID2]` のようなメタタグを埋め込む手法を推奨する。これにより、タスクそのものの説明と、プロジェクト上の論理的な拘束条件を密結合させることができる。
2. 堅牢な設計のための鉄則
VBAでProjectを操作する際、初心者が陥る「二大悲劇」がある。
1. オブジェクトの解放漏れによるメモリリーク: `ActiveProject` を安易に触りすぎるな。常に `MSProject.Project` オブジェクトを明示的に参照し、処理終了後に適切に Nothing を代入せよ。
2. ループ内でのプロパティアクセス: プロパティアクセスは、通信コストが高い。タスク数が多い場合、`Task.Name` や `Task.Notes` をループの度に呼び出すのは自殺行為だ。一度バリアント配列に格納してから処理せよ。
—
3. 実装コード:Markdownドキュメント自動生成
以下のコードは、全タスクを走査し、メモ欄に記述された `[DEP:…]` タグを抽出して、依存関係をMarkdownの表形式で出力するエンジニアリング・コードだ。
‘ プロジェクトの依存関係をMarkdownでエクスポートする
Public Sub ExportTaskDependenciesToMarkdown()
Dim proj As MSProject.Project
Dim tsk As MSProject.Task
Dim fso As Object
Dim ts As Object
Dim filePath As String
Dim notes As String
Set proj = ActiveProject
filePath = Environ(“USERPROFILE”) & “\Desktop\TaskDependencies.md”
‘ ファイル操作はFSOで堅牢に
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.CreateTextFile(filePath, True)
‘ Markdownヘッダーの出力
ts.WriteLine “# プロジェクト依存関係レポート”
ts.WriteLine “| タスクID | タスク名 | 依存先ID |”
ts.WriteLine “|:—|:—|:—|”
‘ タスク走査(パフォーマンスを考慮しForEachを使用)
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
notes = tsk.Notes
‘ [DEP:xxx] 形式のタグを判定
If InStr(notes, “[DEP:”) > 0 Then
Dim depInfo As String
depInfo = ExtractDependency(notes)
‘ Markdown行を構築
ts.WriteLine “| ” & tsk.ID & ” | ” & tsk.Name & ” | ” & depInfo & ” |”
End If
End If
Next tsk
ts.Close
MsgBox “ドキュメント生成完了: ” & filePath, vbInformation
End Sub
‘ メモ欄からタグを抽出する正規表現ライクな関数
Private Function ExtractDependency(ByVal notes As String) As String
Dim startPos As Long, endPos As Long
startPos = InStr(notes, “[DEP:”) + 5
endPos = InStr(startPos, notes, “]”)
If endPos > startPos Then
ExtractDependency = Mid(notes, startPos, endPos – startPos)
Else
ExtractDependency = “なし”
End If
End Function
—
4. 運用上の注意点とさらなる高みへ
このコードをプロダクション環境で運用する場合、以下の3点を徹底してほしい。
- バリデーションの強化: メモ欄のフォーマットが崩れている場合に備え、`ExtractDependency` 関数内でエラーハンドリングを実装すること。正規表現(`VBScript.RegExp`)を併用すれば、より柔軟なパースが可能だ。
- ファイルロックの回避: ネットワークドライブ上のファイルを直接操作する場合、書き込み権限やロック状態を確認するロジックを必ず入れること。本番では一時フォルダに生成してから移動させるのがセオリーだ。
- 進捗会議への統合: 生成されたMarkdownをそのままGitHub WikiやNotionに貼り付ければ、会議資料作成はゼロ秒になる。
最後に
VBAは「レガシー」ではない。APIを叩き、オブジェクトを操り、プロジェクトの混沌とした依存関係を「可視化」する武器だ。
コードをコピペして終わりにするな。自身のプロジェクトの構造に合わせてこのアーキテクチャを昇華させろ。それが、真の自動化エンジニアに求められる姿勢だ。健闘を祈る。
