【入門編】WBSの階層をCSV/JSON形式でエクスポート・インポートする汎用コンバーター – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵へ:WBSを自在に操る「構造変換エンジン」の極意

こんにちは。現場で泥臭く、かつエレガントな自動化を追求し続けているエンジニアです。

Project VBAの世界へようこそ。多くの人が「マクロの記録」で挫折する中、君が今ここに辿り着いたということは、プロジェクト管理の自動化という「聖杯」に手をかけようとしている証拠です。

今回は、最も要望が多く、かつ最も奥が深い「WBS(タスク階層)の外部ファイル化とインポート」について解説します。これさえマスターすれば、君はもう手動でタスクをポチポチ打ち込む必要はありません。

1. なぜ「構造化データ」が重要なのか?

Projectのタスクは、単なる行の集合ではありません。「親タスク(要約タスク)」と「子タスク」の親子関係(OutlineLevel)という、美しいツリー構造で成り立っています。

これをCSVやJSONで扱う際、多くの初心者が陥る罠があります。
それは「行を追加する順序を無視する」こと。

Project VBAにおいて、タスクは追加した瞬間にIDが割り振られます。親よりも先に子を追加しようとすると、参照先が見つからずエラーの嵐。「親から順番に、階層を意識して書き出す・読み込む」。これがこのアーキテクチャの鉄則です。

2. 構造化データの設計指針

まずはデータを定義しましょう。今回はシンプルかつ汎用的なCSV形式を採用します。

| 名前 | OutlineLevel | Duration |
| :— | :— | :— |
| 要件定義 | 1 | 5d |
|  ・詳細設計 | 2 | 3d |

この「階層構造」をどう再現するか? それは、`OutlineLevel`をキーにしてループを回すこと以外に道はありません。

3. 実践:WBSインポート・コンバーター

以下のコードは、CSVからタスクを読み込み、階層を維持したままProjectに流し込む心臓部です。

Sub ImportWBSFromCSV()
‘ CSVの各行を読み込み、Projectにタスクとして追加する
Dim filePath As String
filePath = “C:\ProjectData\WBS.csv”

Dim fileNum As Integer
fileNum = FreeFile

Open filePath For Input As #fileNum

Dim lineData As String
Dim taskName As String
Dim level As Integer
Dim duration As String

‘ ヘッダー読み飛ばし
Line Input #fileNum, lineData

Do Until EOF(fileNum)
Line Input #fileNum, lineData
Dim arr() As String
arr = Split(lineData, “,”)

taskName = arr(0)
level = CInt(arr(1))
duration = arr(2)

‘ タスク追加の核心:
‘ 階層レベルに合わせてTaskを追加する
Dim t As Task
Set t = ActiveProject.Tasks.Add(taskName)

‘ OutlineLevelは読み込み専用ではないため、後に変更可能
t.OutlineLevel = level
t.Duration = duration

‘ 【重要】ここで親タスクとの依存関係を制御することも可能
‘ t.Predecessors = “1” 等
Loop

Close #fileNum
MsgBox “インポート完了!WBSの骨格が完成しました。”
End Sub

このコードのポイント

  • ActiveProject.Tasks.Add: これがタスク生成の魔法のメソッドです。
  • OutlineLevelの操作: これを動的に設定することで、インデントされた美しいWBSが自動生成されます。
  • エラーの回避: 読み込み時に「親が存在しないレベル」を指定するとProjectが混乱します。CSV作成時には必ず「レベル1」から順に並ぶようにソートしておいてください。

4. 陥りやすいエラーと対策

初心者が現場でよく直面する「Project VBA特有の壁」を先回りして伝授します。

1. 「階層が崩れる問題」:

  • 原因:タスクを追加する順番がバラバラ。
  • 対策:CSVを読み込む前に、必ず`OutlineLevel`順にデータを整列させるロジックを挟むこと。

2. 「Duration(期間)のパースエラー」:

  • 原因:Projectの設定(例:1日を何時間とするか)とCSVの単位(d, h, m)が合っていない。
  • 対策:`ActiveProject.DurationFormat`を確認してからデータを注入する癖をつけましょう。

3. 「依存関係(Predecessors)の循環参照」:

  • 原因:タスクAがタスクBを待ち、タスクBがタスクAを待つような構造。
  • 対策:IDベースで依存関係を記述する際、必ず「若いIDから順に依存させる」という制約をルール化してください。

最後に:エンジニアとしての視座

Project VBAを操るということは、単にタスクを自動化するだけではありません。「プロジェクトの時間の流れをコードで定義する」という、極めて高度な行為です。

まずはこのコンバーターを自分の手で動かし、CSVの行を書き換えて「階層が勝手に変わる」体験をしてみてください。それができれば、君はもう「自動化の入り口」を突破したも同然です。

次は、タスクの進捗状況をリアルタイムで監視し、遅延が発生したら自動で警告メールを飛ばす……そんな「自律型プロジェクト・ガーディアン」の構築に挑戦してみませんか?

何か詰まったら、いつでも戻ってきてください。君の挑戦を応援しています。

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