プロジェクト構造の「永続化」という聖域:WBS階層をコードで掌握する
VBAでプロジェクト管理システムを構築する際、最大の壁となるのは「階層構造(WBS)の再構築」だ。UI上でポチポチとタスクを追加する時代は終わった。真のエンジニアは、プロジェクトの設計図を外部ファイルとして定義し、それを一瞬で実体化させる「インフラストラクチャ・アズ・コード(IaC)」の精神をVBAの世界に持ち込むべきだ。
本稿では、複雑なWBS階層をシリアライズし、完全な依存関係とともに復元する極限のコンバーターの実装指針を授ける。
—
1. データ構造の定義:CSVかJSONか
階層構造を保持する場合、フラットなCSVでは不十分だ。なぜなら、親タスクのIDとインデントレベルが不可分であり、依存関係(Predecessors)もまた再帰的な参照を伴うからだ。
ここで私はあえて「拡張CSV(Adjacency List + Indent Level)」を推奨する。JSONは柔軟だが、VBA標準ライブラリでのパースはメモリ負荷が高い。高頻度で実行されるバッチ処理においては、メモリ管理が容易なCSVベースのシリアライズが、長期的には最も「壊れにくい」資産となる。
2. メモリ最適化とオブジェクトのライフサイクル
VBAにおける最大の敵は、不適切なオブジェクト参照によるメモリリークと、それによる「予測不能な動作」だ。タスクオブジェクトを再帰的に生成する際、以下の鉄則を遵守せよ。
- 明示的な解放: `Set obj = Nothing` は儀式ではない。スコープを抜ける前に確実に破壊せよ。
- Late Bindingの回避: 実行速度と型安全性を担保するため、参照設定(Early Binding)を原則とする。
- コレクションの断片化防止: 大量のタスクを扱う場合、`Collection`オブジェクトよりも、配列(Array)を用いた一括処理が圧倒的に高速だ。
—
3. 実装:再帰的インポートロジックの核心
以下は、WBS階層を維持したまま、タスクを再構築するコンバーターのコアロジックである。
‘ 伝説的なチーフアーキテクトによるWBS再帰生成プロシージャ
‘ ※最適化のため、エラーハンドリングは最小限に抑え、処理速度を優先する
Public Sub ImportWBSFromCSV(ByVal filePath As String)
Dim fileNo As Integer: fileNo = FreeFile
Dim lineData As String
Dim taskStack As Collection
Set taskStack = New Collection ‘ 階層の親IDを保持するスタック
Open filePath For Input As #fileNo
‘ ヘッダー読み飛ばし
Line Input #fileNo, lineData
Do Until EOF(fileNo)
Line Input #fileNo, lineData
Dim fields() As String
fields = Split(lineData, “,”)
‘ fields: 0=TaskName, 1=Level, 2=PredecessorID
Dim newTask As Object
Set newTask = CreateTask(fields(0), fields(1))
‘ 依存関係の解決(システム間連携の要)
If Len(fields(2)) > 0 Then
ResolveDependency newTask, fields(2)
End If
‘ メモリ解放の徹底
Erase fields
Set newTask = Nothing
Loop
Close #fileNo
Set taskStack = Nothing
End Sub
4. 依存関係の「幽霊」を排除する
WBSのインポートで最もハマるのが「依存関係の解決順序」だ。先行タスクがまだ存在しないタイミングで依存関係を定義しようとすると、システムは例外を吐く。
これを回避する唯一の解は、「2パス構成」である。
1. パス1: 全タスクを生成し、一意のIDと物理的なアドレスをマッピングする(辞書オブジェクト`Scripting.Dictionary`が最適)。
2. パス2: 全タスクの生成完了後、初めて依存関係を紐付ける。
これにより、循環参照のチェックや、存在しないタスクへの依存といった「システム破壊の兆候」を、コミット前に完全に検知できる。
—
5. チーフアーキテクトからの提言
君たちが構築しているのは単なる「マクロ」ではない。それは、組織のプロジェクト遂行能力そのものを規定する「プラットフォーム」だ。
- API仕様の文書化: コンバーターが受け入れるCSVのフォーマットを、`JSON Schema`に準拠した形式で定義せよ。
- Windows APIの活用: 高速なファイル入出力(I/O)が必要なら、`kernel32`の`ReadFile` / `WriteFile`を直接叩くことも視野に入れろ。`Open`ステートメントは、巨大なデータセットではボトルネックになる。
- 堅牢性: 予期せぬシャットダウンやシステムエラーに対し、インポート中に発生した「未完了データ」をロールバックする仕組み(トランザクション制御)を、フラグ管理によって自前で実装しろ。
VBAは、限界まで追い込めば、エンタープライズなシステムを凌駕する性能を叩き出す。レガシーという言葉に甘えず、アーキテクチャの細部まで支配せよ。それが、真の「伝説」になるための唯一の道だ。
