こんにちは!開発現場を渡り歩くシニア・アーキテクトの私です。
「マクロの記録」ボタンを押してExcelの自動化からVBAの世界に入ったあなた。そろそろ次のステージ、すなわち「Microsoft Project(MS Project)をVBAで自在に操り、外部のWebアプリケーションと連携させるデータ基盤の構築」に挑戦したくなっている頃ではないでしょうか。
現場では、「プロジェクトの進捗やリソース(人・モノ)の割り当て状況を、自社のWebポータルやダッシュボードでリアルタイムに可視化したい」という要望が絶えません。Excelなら簡単ですが、複雑なWBSとリソース管理を誇るMS Projectのデータを、正確に外部連携用のフォーマット(JSONなど)に変換するには、ちょっとしたコツと「オブジェクトの作法」が必要です。
ここをクリアすれば、Project VBAの基本はバッチリですよ!
今日は、プロジェクトに眠る「リソースの割り当て情報」を抽出し、美しく構造化されたJSONとして出力する実践的なテクニックを、優しく、そして深く解説していきます。
—
なぜProjectのリソースデータを「JSON」にするのか?
MS Projectは、それ単体でも強力なデスクトップツールです。しかし、チーム全員がProjectをインストールしているわけではありませんよね。
- 「今週、誰にどれだけのタスクが割り当てられているか」
- 「コストの予測はどうなっているか」
こうした情報を、社内のWebアプリやBIツール(Power BIやTableauなど)で一元管理するためには、軽量で人間にも読みやすいJSON(JavaScript Object Notation)という共通言語に変換して外へ放り出すのが現代の定石です。
—
押さえておくべきProject VBAの3大オブジェクト
Excel VBAと違い、Project VBAには独特の階層構造(オブジェクトモデル)があります。今回主役になるのは以下の3つです。
1. `ActiveProject`: 今まさに開いているプロジェクトそのもの。
2. `Assignments` (割り当て): 「誰が(Resource)」「どのタスク(Task)に」アサインされているかという、プロジェクトの最も美味しいデータが詰まった交差点。
3. `Resource`: 人や機材などのリソース実体。
この「Assignments(割り当て)」を起点にしてループを回し、必要なプロパティ(名前、コスト、工数など)をごっそり回収していくのが今回の戦略です。
—
実装コード:リソース割り当てをJSON出力するVBA
それでは、実際の現場でそのまま使えるコードをお見せします。
MS ProjectのVBAエディタ(`Alt + F11`)を開き、標準モジュールに貼り付けて実行してみてください。
Sub ExportResourceAssignmentsToJson()
Dim t As Task
Dim a As Assignment
Dim jsonOutput As String
Dim fso As Object
Dim ts As Object
Dim filePath As String
Dim recordCount As Long
‘ JSON配列の開始
jsonOutput = “[” & vbCrLf
recordCount = 0
‘ 1. プロジェクト内のすべてのタスクを走査
For Each t In ActiveProject.Tasks
‘ タスクが存在し、かつサマリータスク(親タスク)ではない実作業タスクを対象にする
If Not t Is Nothing Then
If Not t.Summary Then
‘ 2. そのタスクに紐付く「割り当て(Assignment)」を走査
For Each a In t.Assignments
If Not a Is Nothing Then
recordCount = recordCount + 1
‘ 複数レコードになる場合のカンマ調整
If recordCount > 1 Then
jsonOutput = jsonOutput & “,” & vbCrLf
End If
‘ 3. JSONのオブジェクト形式にデータを組み立て
jsonOutput = jsonOutput & ” {” & vbCrLf
jsonOutput = jsonOutput & ” “”TaskId” & “””: ” & t.ID & “,” & vbCrLf
jsonOutput = jsonOutput & ” “”TaskName””” & “: “”” & EscapeJson(t.Name) & “””,” & vbCrLf
jsonOutput = jsonOutput & ” “”ResourceName””” & “: “”” & EscapeJson(a.ResourceName) & “””,” & vbCrLf
jsonOutput = jsonOutput & ” “”WorkHours””” & “: ” & (a.Work / 60) & “,” & vbCrLf ‘ 分単位から時間に変換
jsonOutput = jsonOutput & ” “”Cost””” & “: ” & a.Cost & vbCrLf
jsonOutput = jsonOutput & ” }”
End If
Next a
End If
End If
Next t
‘ JSON配列の終了
jsonOutput = jsonOutput & vbCrLf & “]”
‘ 4. デスクトップにJSONファイルとして保存
filePath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\ResourceAssignments.json”
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.CreateTextFile(filePath, True, True) ‘ UTF-8で出力するために工夫することも可能です
ts.Write jsonOutput
ts.Close
MsgBox “エクスポートが完了しました!” & vbCrLf & “出力先: ” & filePath, vbInformation, “成功”
End Sub
‘ 簡易的なJSONエスケープ関数(ダブルクォーテーション等の文字化け・構文エラーを防ぐ)
Function EscapeJson(ByVal str As String) As String
str = Replace(str, “\”, “\\”)
str = Replace(str, “”””, “\”””)
EscapeJson = str
End Function
—
コードの注目ポイントと「現場の知見」
初心者の方が「おっ」と思うポイントや、実務でハマりがちな罠を解説しておきます。
① `t.Summary` のガードが命綱
MS Projectには、複数の子タスクをまとめる「親タスク(サマリータスク)」が存在します。親タスク自体には直接リソースが割り当てられない(子タスクの集計値になる)ため、`If Not t.Summary Then` で除外しないと、二重計上や予期せぬエラーを引き起こします。実務ではこの「サマリータスクの除外」がデータクレンジングの基本中の基本です。
② Project VBAの時間単位は「分」
`a.Work`(工数)などのプロパティは、内部的には「分(Minutes)」で保持されています。Webアプリ側で「8時間」として表示したい場合、そのままでは「480」という数字になってしまいます。コード内で `(a.Work / 60)` と割っているのはそのためです。この仕様を知らないと、Web側で大混乱が起きるので要注意です。
③ 手作りJSONの限界とエスケープ処理
今回のコードでは、外部ライブラリ(Reference設定)の依存をなくすために、VBAの文字列結合でJSONを自作しています。その際、タスク名にダブルクォーテーション(`”`)が含まれているとJSONの構文が壊れてしまいます。それを防ぐために `EscapeJson` 関数を挟んでいるのが、プロのエンジニアとしてのこだわりです。
—
陥りやすいエラーと回避策
1. 「オブジェクト変数または With ブロック変数が見つかりません」エラー
- 原因: 削除されたタスクや、リソースが割り当てられていない空のタスクに対してプロパティを叩こうとしたときにおきます。
- 対策: コード内の `If Not t Is Nothing` や `If Not a Is Nothing` のような「オブジェクトの生死確認(NULLチェック)」を必ず挟みましょう。
2. 日本語が文字化けする
- 原因: `FileSystemObject` の標準テキスト作成は環境によってShift-JISになりがちです。
- 対策: 本格的なWeb連携を行う場合は、ADODB.Streamオブジェクトを使って「UTF-8(BOM付き/無し)」でテキストを書き出すように改良すると完璧です。
—
おわりに
今回は、Project VBAを使ってリソースの割り当て情報を抽出し、Web連携の土台となるJSONを生成する手法を解説しました。
「マクロの記録」の枠を超え、こうした構造化データを自分で自在にハンドリングできるようになると、ExcelやMS Projectは単なる「個人のスケジュール帳」から、「組織全体の強力なデータソース」へと生まれ変わります。
ぜひ手元のプロジェクトファイルで試して、出力されたJSONを眺めてみてください。あなたのエンジニアとしての視野が、グッと広がるはずです。それでは、次の現場でお会いしましょう!
