Project VBAを掌握せよ:WBS階層をJSONへ変換し、ダッシュボードを覚醒させる極意
こんにちは。現場で泥臭い自動化を積み重ね、いつしか「Projectの守護神」と呼ばれるようになったエンジニアです。
皆さんは、Microsoft Project(以下MS Project)でWBS(Work Breakdown Structure)を管理しているとき、こんなもどかしさを感じたことはありませんか?
「このガントチャート、ブラウザでサクッと見れたらどれだけ楽だろうか」と。
MS Projectの標準レポートは確かに強力ですが、現代のビジネススピードには追いつけません。そこで今回は、MS Projectのタスク階層をJSONとして抽出し、Webダッシュボードと連携させるための「VBAアーキテクチャ」を伝授します。
「マクロの記録」ボタンを押すだけの世界を卒業し、データの構造そのものを操るエンジニアの視点へ、一緒に踏み出しましょう。
—
1. なぜ「階層構造」を扱うことが難しいのか?
MS Projectのデータモデルにおいて、タスクは「親子関係」を持つ木構造(Tree Structure)です。
データベースのテーブルのようにフラットではなく、`OutlineLevel`(アウトラインレベル)という値で階層が決まります。
JSONへシリアライズする際、この「親子関係」をどう表現するかが勝負です。私たちは以下の構造を目指します。
{
“taskId”: 1,
“name”: “プロジェクト開始”,
“children”: [
{ “taskId”: 2, “name”: “要件定義” },
{ “taskId”: 3, “name”: “基本設計” }
]
}
この「入れ子構造」をVBAで再帰的に構築するのが、今回のミッションです。
—
2. 実装:VBAでJSONを生成する核となるロジック
VBAでJSONを生成する際、ライブラリを使わずに文字列操作だけで済ませるのは「メンテナンスの地獄」への片道切符です。まずは、「タスクを巡回し、階層を再帰的に取得する」という基本ロジックをマスターしましょう。
実践コード:タスク抽出エンジン
以下のコードは、Projectのタスクを走査し、JSON形式の文字列を生成する基盤です。
‘ 標準モジュールに記述
Option Explicit
Public Sub ExportTasksToJson()
Dim proj As Project
Set proj = ActiveProject
‘ 階層の最上位(レベル1)から再帰的に抽出を開始
Dim jsonString As String
jsonString = “[” & GetTaskHierarchy(proj.Tasks(1), 1) & “]”
‘ 結果をデバッグ出力(またはファイル出力)
Debug.Print jsonString
End Sub
‘ 再帰関数:タスクの親子関係をJSON文字列に変換する
Function GetTaskHierarchy(t As Task, targetLevel As Integer) As String
Dim result As String
Dim subTask As Task
result = “{ “”id””: ” & t.ID & “, “”name””: “”” & t.Name & “”””
‘ 子タスクが存在するかチェック
If t.OutlineChildren.Count > 0 Then
result = result & “, “”children””: [”
For Each subTask In t.OutlineChildren
result = result & GetTaskHierarchy(subTask, targetLevel + 1) & “,”
Next subTask
‘ 最後のカンマを削除して閉じる
result = Left(result, Len(result) – 1) & “]”
End If
result = result & “}”
GetTaskHierarchy = result
End Function
—
3. ここをクリアすれば一人前!陥りやすい罠
このコードを書く際、初学者が必ず直面する「壁」が2つあります。
罠①:階層の無限ループとスタックオーバーフロー
`t.OutlineChildren` を使うのは非常に強力ですが、ループの終了条件を見誤ると、メモリを食い尽くしてProjectがクラッシュします。必ず「親から子へ」という一方向のフローであることを確認してください。
罠②:文字列操作のオーバーヘッド
VBAの文字列連結 `&` は、数千行のタスクを扱うと非常に重くなります。本番環境では `StringBuilder` クラス(VBAのクラスモジュールで自作可能)を導入し、メモリ効率を最適化することをお勧めします。
—
4. ダッシュボード連携へのロードマップ
このJSONさえ生成できれば、あとは無限の可能性が広がります。
1. 保存: `CreateObject(“Scripting.FileSystemObject”)` を使い、JSONファイルとしてローカルに出力。
2. 転送: Power AutomateやPython等のスクリプトで、そのファイルをWebサーバー(またはクラウドストレージ)へアップロード。
3. 可視化: ReactやVue.jsといったモダンなフロントエンドフレームワークで、D3.js等を用いてガントチャートを表示。
—
最後に:エンジニアとして成長するために
「マクロ」とは、単なる作業の自動化ではありません。「業務の構造を理解し、それをコードという言語で再定義する」という知的なプロセスです。
今回紹介した「階層構造をJSONにする」という考え方は、Projectだけでなく、あらゆる階層データの処理に応用できます。まずはこのコードをコピペして、自分のプロジェクトで動かしてみてください。
もし動かなくて悩んだら、それはあなたのコードが「成長しようとしている」証拠です。その時はまた、いつでも聞きに来てください。あなたの自動化の旅を、全力で応援しています。
さあ、Projectの壁を壊し、見える化の先へ進みましょう。
