【実務・中級編】リソースの「コスト」をプロジェクトの進捗率(%)に応じて自動按分する計算ロジック – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:進捗率連動型コスト按分エンジンの設計思想

多くの開発者がProject VBA(MSPのVBAオブジェクトモデル)を触り始めると、真っ先に「リソースのコスト計算」という泥沼に足を踏み入れます。

「進捗率(%)に応じて自動的にコストを按分したい」

一見単純な要件に見えますが、MS Projectの内部エンジンは「作業時間(Work)」「実績作業時間(Actual Work)」「コスト単価」の三位一体で動いています。これを理解せずに力技で数値を上書きしようとすると、Projectのスケジュールエンジンと衝突し、データが不整合を起こします。

今回は、この「コスト按分」を堅牢に実装するための、プロフェッショナルな解法を伝授します。

—

1. なぜ「手動計算」は破綻するのか

多くの実装者は、`Resource.Cost` プロパティに直接値を代入しようとします。これは最悪手です。

なぜなら、Projectは「コスト」を計算結果として保持する性質があるからです。外部から値を叩き込むと、Projectの再計算機能が発動した瞬間に、その値は「矛盾したデータ」として上書きされるか、あるいはプロジェクト全体の整合性を破壊します。

極意:Project VBAでは「値を書く」のではなく「計算の根拠(実績工数)を与える」のが鉄則です。

—

2. 堅牢な設計のための3つの原則

1. 単価(StandardRate)をマスターとして扱う: コストは `工数 × 単価` です。工数を操作することでコストを制御します。
2. 実績(Actual Work)の更新を優先する: コストを直接操作せず、`Assignment.ActualWork` を更新させることで、Projectエンジンに自動計算させます。
3. トランザクション管理: 処理前後の計算モードを確認し、必要に応じて一時的に手動計算モードへ切り替える。

—

3. 実装:進捗率連動型コスト配分エンジン

以下は、選択されたタスクにおけるリソースの実績工数を進捗率ベースで按分し、コストを適正化するプロダクションレベルのコードです。

Option Explicit

‘ コスト按分実行メインプロシージャ
Public Sub ApplyCostByProgress()
Dim tsk As Task
Dim asgn As Assignment
Dim progress As Double

‘ 選択されたタスクを取得
Set tsk = ActiveCell.Task
If tsk Is Nothing Then Exit Sub

‘ 進捗率を0.0~1.0で取得
progress = tsk.PercentComplete / 100

‘ プロジェクトの計算モードを保護するためにエラーハンドリングを適用
On Error GoTo Cleanup

For Each asgn In tsk.Assignments
‘ 1. 実績工数を進捗率に合わせて再配分
‘ ※ActualWorkを設定することで、自動的にCostが再計算される
asgn.ActualWork = (asgn.Work progress)

‘ 2. ログ出力(デバッグ用)
Debug.Print “Resource: ” & asgn.ResourceName & ” | Cost: ” & asgn.Cost
Next asgn

MsgBox “コスト按分が完了しました。”, vbInformation
Exit Sub

Cleanup:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub

—

4. 開発現場で生き残るための「注意点」

外部DB連携の罠

もし、ExcelやSQL ServerからコストデータをインポートしてProjectに反映させる場合、「タスクのGUID」をキーにすることを絶対に忘れないでください。ID(行番号)はソートや行挿入でいとも簡単にズレます。GUIDでリソースとタスクを一意に特定する仕組みがない限り、大規模プロジェクトでの運用は1ヶ月で崩壊します。

パフォーマンスの最適化

数千行あるプロジェクトで上記のループを回すと、都度Projectが再計算を行い、ツールがフリーズします。本格的な運用では、以下の処理をコードの冒頭と末尾に追加してください。

‘ 処理開始時
Application.Calculation = pjManual

‘ …ループ処理…

‘ 処理終了時
Application.Calculation = pjAutomatic
Application.CalculateAll

—

結論:エンジニアとしての矜持

Project VBAを操るということは、単にMS社のオブジェクトを触るということではありません。「プロジェクトマネジメントのロジックそのもの」をコードに落とし込むということです。

今回提示した「計算結果ではなく計算の根拠(実績工数)を操作する」手法は、Projectの仕様変更にも強く、極めて保守性の高いアプローチです。

ツールを作って終わりではなく、「その計算ロジックがプロジェクトのPMBOK的整合性を保っているか」を常に自問自答してください。それが、あなたを「単なるVBA使い」から「真の業務自動化アーキテクト」へと引き上げる唯一の道です。

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