MS Project VBAの深淵:リソースコストセンターを掌握し、予算管理の「死角」を消す
現場のPMが「予算管理が合わない」と頭を抱えるとき、その原因の8割はシステムの問題ではなく、「現場のリソース管理の雑さ」にある。Excelで管理された数千行のリストを、手作業でProjectのリソースシートに転記する……そんな前時代的な運用は今日で終わらせよう。
今回は、Project VBAを用いてリソースの「コストセンター(所属部門)」を一括設定し、プロジェクトの収支構造を論理的に可視化する「アーキテクト級の自動化手法」を授ける。
—
1. なぜ「手動設定」がプロジェクトを殺すのか
リソースのコストセンターをカスタムフィールド(`Cost1`~`Cost10`など)に手入力させる運用は、「情報の揺らぎ」という致命的なバグを内包する。
- 入力ミス: 「営業部」と「営業課」が混在し、集計時にデータが分断される。
- 工数浪費: リソースが増えるたびにPMが時間を浪費する。
- トレーサビリティの欠如: 誰がいつ変更したか不明なデータは、監査に耐えられない。
我々が目指すべきは、「ソース(Excel等)を正とし、Projectを従とする」同期モデルだ。
—
2. 堅牢な設計:3つの鉄則
コードを書く前に、以下のアーキテクチャを脳に刻んでほしい。
1. フィールドの固定: コストセンター等の管理用フィールドは、必ず決まった列(例:`Cost1`)に固定し、プロパティで名称変更しておく。
2. 一意キーによるマッチング: 「リソース名」ではなく「リソースID」や「電子メールアドレス」をキーにする。リソース名は変更される可能性があるが、IDは不変だからだ。
3. エラーハンドリングの徹底: リソースが見つからない場合や、値が不正な場合に処理を停止せず、ログを残して続行する「耐障害性」を持たせる。
—
3. 実装コード:一括同期エンジン
このコードは、外部CSVまたはExcelのリストを読み込み、Project上のリソースを一括更新する。無駄なループを避け、オブジェクトへのアクセスを最小限にするのが「高速化」の秘訣だ。
‘ プロジェクトのリソースをコストセンター情報で更新するプロシージャ
‘ 前提: コストセンター情報はCSV形式 (ResourceID, CostCenter) で準備されていること
Public Sub UpdateResourceCostCenter(ByVal csvPath As String)
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim ts As Object: Set ts = fso.OpenTextFile(csvPath, 1)
Dim line As String, parts() As String
Dim res As Resource
‘ プロジェクトのリソースコレクションへの参照
Dim resColl As Resources
Set resColl = ActiveProject.Resources
On Error GoTo ErrorHandler
‘ ヘッダーをスキップ
If Not ts.AtEndOfStream Then ts.SkipLine
Do Until ts.AtEndOfStream
line = ts.ReadLine
parts = Split(line, “,”)
‘ 期待するデータ: ID, CostCenter
Dim resID As Long: resID = CLng(parts(0))
Dim costCenter As String: costCenter = parts(1)
‘ リソースの検索(ID指定による高速アクセス)
Set res = resColl.Item(resID)
If Not res Is Nothing Then
‘ Cost1フィールドに部門情報をセット(フィールド名は任意で変更可)
res.Cost1 = costCenter
End If
Loop
ts.Close
MsgBox “リソース情報の同期が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
Debug.Print “Error: ” & Err.Description
Resume Next ‘ 致命的でないエラーを回避して次へ
End Sub
—
4. 運用上の注意点と「プロの知見」
ファイル連携の罠
外部ファイルを読み込む際、「エンコーディング」に注意せよ。日本語環境のWindowsでは、CSVをUTF-8で保存すると文字化けするケースが多い。VBAで扱うなら、`ADODB.Stream`を使用して文字コードを明示的に指定して読み込むか、CSVを「Shift-JIS」で保存する運用を徹底すること。
パフォーマンスの最適化
もしリソース数が数千を超える場合、`Application.ScreenUpdating = False`を併用したくなるだろうが、Project VBAにおいては「オブジェクトのインデックス参照」が最大の高速化要因だ。`resColl.Item(resID)`のようにID直指定を行うことで、ループ内検索の計算量をO(N)からO(1)へ削減せよ。
部門別予算管理への応用
この設定を完了させれば、Projectの「レポート」機能で「Cost1」をグループ化条件に指定するだけで、部門別のコスト推移グラフが瞬時に生成できる。
—
最後に:エンジニアとしての矜持
自動化とは、単にコードを書くことではない。「人間が介在することによるデータの汚染を、システム的に遮断すること」だ。
今日紹介したこの仕組みは、あなたのプロジェクトから「手作業の集計」という名の無駄を排除する。次は、このコストセンター情報を元にした「予算超過アラートの自動通知」の実装に挑戦してみるといい。
プロジェクトの管理負荷を下げ、あなたが本来集中すべき「戦略的意思決定」へリソースを割くこと。それこそが、真の自動化エンジニアの在り方だ。
