Project VBAを掌握する:リソース割り当てデータのJSONエクスポートとWeb連携の極致
諸君。VBAを単なる「マクロ記録器」の延長で使っているようでは、レガシーの呪縛からは一生逃れられない。Project VBAは、正しく扱えば、現代のWebフロントエンドと最強の連携を果たす「バックエンド・データエンジン」へと変貌する。
今回は、プロジェクトの「リソース割り当て情報」を抽出し、Webダッシュボードへ受け渡すためのJSONエクスポート戦略を伝授する。
—
1. なぜ「JSON直接出力」なのか:オブジェクトのライフサイクルを制する
多くのエンジニアが犯す過ちは、`Scripting.Dictionary`や`Collection`を無造作に積み上げ、メモリを浪費することだ。VBAのメモリ管理は参照カウンタ方式である。オブジェクトの生存期間を意識しないコードは、大規模プロジェクトにおいて必ずリークを引き起こす。
JSON化において重要なのは、「巨大な中間オブジェクトを生成せず、可能な限り文字列結合を避けてストリームへ流し込む」ことだ。今回は、ADO Streamオブジェクトを使い、メモリ消費を最小限に抑えつつ、UTF-8エンコーディングで書き出す手法を共有する。
—
2. 実装の核心:ADO Streamによる高効率エクスポート
`FileSystemObject`の`CreateTextFile`は、エンコーディング指定に難がある。Webダッシュボード(React/Vue.js等)と親和性の高いUTF-8を実現するには、`ADODB.Stream`を用いるのが唯一にして最強の解だ。
‘ リソース割り当て情報をJSONとして書き出すコアロジック
Public Sub ExportResourceAssignmentsToJson(ByVal filePath As String)
Dim stream As Object
Set stream = CreateObject(“ADODB.Stream”)
‘ ストリーム設定:メモリ使用を最小化し、UTF-8で固定
With stream
.Type = 2 ‘ adTypeText
.Charset = “utf-8”
.Open
.WriteText BuildJsonString() ‘ ここでJSON文字列を生成
.SaveToFile filePath, 2 ‘ adSaveCreateOverWrite
.Close
End With
‘ 明示的解放:ガベージコレクタを待つな
Set stream = Nothing
End Sub
Private Function BuildJsonString() As String
‘ ここでProjectオブジェクトからデータを抽出
‘ 巨大な文字列結合はパフォーマンスを殺すため、必要に応じて
‘ StringBuilderパターン(配列連結)を推奨する
‘ …(データ抽出ロジック)
End Function
—
3. シニアのための最適化:Windows APIとメモリ管理
大規模なProjectファイルから数千件のリソース割り当てを掃き出す際、VBAのループはボトルネックになる。ここで重要なのは、「ProjectのCOMオブジェクトを直接叩く回数を最小化する」ことだ。
パフォーマンスを極限まで高めるTips:
1. Application.ScreenUpdating = False: 当然の鉄則だ。
2. Calculation = xlCalculationManual: 再計算は殺せ。
3. 変数の型定義: `Variant`を排除し、`Object`の遅延バインディングを避ける。`Dim res As Pj.Assignment`のように明示的な型指定を行え。
4. Windows APIの活用: ファイルの書き込み待ちが発生する場合、`Sleep`関数(`kernel32`)を用いてI/O負荷を調整するのも手だ。
—
4. Webダッシュボード連携のアーキテクチャ
JSONを吐き出すだけでは不十分だ。Webダッシュボード側で「いつデータが更新されたか」を検知させる必要がある。
- ファイル監視: Webサーバー側で`watchdog`等のライブラリを使い、JSON更新をトリガーにDBを同期させる。
- 認証: VBAからクラウドストレージ(OneDrive/SharePoint)へ書き出す場合、`WinHttp.WinHttpRequest.5.1`を用いてOAuth2認証を突破する。
VBAは、もはやローカルの閉じた世界にいるのではない。Web APIを介した「データ供給源」として再定義せよ。
—
結論:守りの保守から、攻めのアーキテクトへ
VBAはレガシーではない。使い手次第で、現代のシステム間連携における「最後のピース」になり得る。メモリを食いつぶすような不適切なオブジェクト生成を止め、ストリームを理解し、型を厳格に定義する。
この姿勢こそが、10年後も動く「伝説のシステム」を構築する唯一の道だ。諸君のプロジェクトが、洗練されたデータ連携によって、新たなフェーズへ進化することを期待している。
技術は裏切らない。ただ、設計の甘さを突くだけだ。
