【実務・中級編】リソースの「コストセンター」をVBAで一括設定し、部門別予算管理を効率化する – Project VBA解析バイブル

スポンサーリンク

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」をグループ化条件に指定するだけで、部門別のコスト推移グラフが瞬時に生成できる。

—

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

自動化とは、単にコードを書くことではない。「人間が介在することによるデータの汚染を、システム的に遮断すること」だ。

今日紹介したこの仕組みは、あなたのプロジェクトから「手作業の集計」という名の無駄を排除する。次は、このコストセンター情報を元にした「予算超過アラートの自動通知」の実装に挑戦してみるといい。

プロジェクトの管理負荷を下げ、あなたが本来集中すべき「戦略的意思決定」へリソースを割くこと。それこそが、真の自動化エンジニアの在り方だ。

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