【実務・中級編】リソースの「割り当て」情報をJSON形式でエクスポートし、Webダッシュボードと連携する – Project VBA解析バイブル

スポンサーリンク

MS Projectを「データソース」として覚醒させる:リソース割り当てのJSONエクスポート術

多くのVBAエンジニアが、MS ProjectのデータをExcelに転記してグラフ化するという「泥臭い中間作業」で工数を浪費している。だが、断言しよう。それはAPIとオブジェクトモデルへの理解が浅い証拠だ。

MS Projectは強力なPJMエンジンだが、UIは時代遅れだ。モダンなWebダッシュボードでリソース稼働率を可視化したいなら、VBAから直接JSONを生成し、サーバーへプッシュするのが最短ルートだ。

本稿では、不安定なパースに悩まされないための、堅牢かつプロダクション環境で耐えうる設計思想を授ける。

—

1. 陥りやすい罠:なぜ「直接ループ」が死を招くのか

多くのコードが `ActiveProject.Assignments` を力任せにループさせている。だが、Projectのオブジェクトモデルは「リレーションの深さ」によってパフォーマンスが指数関数的に劣化する。

  • 罠①:無駄なプロパティへのアクセス

`Assignment.Resource.Name` をループ内で何度も呼ぶと、バックグラウンドでキャッシュミスが発生し、処理が重くなる。

  • 罠②:文字列連結によるメモリ食い

`json = json & “{…}”` という書き方は、VBAの文字列メモリ管理において最悪の選択肢だ。数千件の割り当てがあれば、VBAはメモリ断片化を起こし、いずれクラッシュする。

—

2. 極限の設計:構造化とシリアライザ

JSONを生成する際、手書きの文字列連結は今すぐやめること。JSONは「構造」そのものだ。データを抽出(Extract)し、整形(Format)し、書き出す(Export)という3層構造を意識せよ。

以下のコードは、リソース割り当て情報を最小コストで抽出するテンプレートだ。

プロダクションコード:JSON生成エンジン

Option Explicit

‘ 依存関係なし:標準モジュールに配置
‘ 大規模データでもメモリを圧迫しないよう配列を活用する
Public Sub ExportAssignmentsToJson()
Dim proj As Project
Dim assn As Assignment
Dim jsonBuilder As Object
Dim items() As String
Dim i As Long

Set proj = ActiveProject
ReDim items(0 To proj.Assignments.Count – 1)

‘ オブジェクトのキャッシュ化:ループ内のオーバーヘッドを最小化
Dim resName As String
Dim taskName As String

i = 0
For Each assn In proj.Assignments
‘ 無効な割り当てや空のタスクを除外する堅牢なフィルタリング
If Not assn.Resource Is Nothing Then
resName = Replace(assn.Resource.Name, “”””, “\”””)
taskName = Replace(assn.Task.Name, “”””, “\”””)

‘ JSONの断片を作成
items(i) = “{” & _
“””resource””: “”” & resName & “””,” & _
“””task””: “”” & taskName & “””,” & _
“””work””: ” & assn.Work / 60 & _
“}”
i = i + 1
End If
Next assn

‘ Join関数で連結。文字列結合のオーバーヘッドを劇的に抑える
Dim finalJson As String
finalJson = “[” & Join(items, “,”) & “]”

‘ ファイル出力
WriteToFile finalJson, “C:\Temp\resource_alloc.json”
End Sub

Private Sub WriteToFile(content As String, filePath As String)
Dim fso As Object
Dim stream As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set stream = fso.CreateTextFile(filePath, True)

stream.Write content
stream.Close

Debug.Print “Export Completed: ” & filePath
End Sub

—

3. 現場で「死なない」ためのアーキテクチャ上の注意点

1. UTF-8エンコーディングの呪縛

VBAの `Scripting.FileSystemObject` はデフォルトではANSIで書き出す。Webダッシュボード側で文字化けを起こす原因の9割がこれだ。必要に応じて `ADODB.Stream` オブジェクトを使い、明示的に `Charset = “UTF-8″` を指定して書き出すこと。

2. 「稼働率」の計算はVBAでやるな

「このリソースは来週何%の負荷か?」といった計算をVBAで行うのは間違いだ。VBAは「Raw Data(生データ)」の抽出に徹する。計算ロジックはフロントエンド(JavaScript/TypeScript)に任せよ。VBAの役割は「Projectの状態を、Webが解釈可能な形式へ翻訳すること」のみである。

3. 排他制御の意識

Projectはファイルベースの排他ロックが非常にシビアだ。大規模プロジェクトでこのスクリプトを走らせる際は、バックグラウンドでのオートセーブとタイミングが被らないよう、実行前に `Application.Calculation = pjManual` に切り替える等のハンドリングが必須だ。

—

最後に:エンジニアとしての矜持

VBAを「古い言語」と揶揄する輩は、その力を半分も引き出せていない。Projectの膨大なオブジェクトを自在に操り、Webの最先端技術へと橋渡しをする。これこそが、業務自動化エンジニアの醍醐味だ。

今回提供したコードはあくまで骨組みだ。君のプロジェクトの要件(特定のカスタムフィールド、タイムフェーズデータなど)に合わせて肉付けしてほしい。

もし、さらに高度な「非同期API連携」や「OAuth2認証による直接アップロード」が必要であれば、それは次のステップだ。まずは、このJSON生成の堅牢性を確保することから始めてみろ。現場が変われば、視界も変わるはずだ。

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