【脱・手作業】Project VBAで実現する「コスト予実管理」の完全自動化術
こんにちは。現場で泥臭く、かつスマートにプロジェクトを回している皆さんのための「Project VBA」攻略ガイドです。
「毎月、SQL ServerからExcelにデータを落として、そこからProjectに手入力でコストを転記している……」
そんな作業、もう終わりにしましょう。Microsoft Project(MSP)のVBAを掌握すれば、その作業は「ボタン一つ」で終わります。
今日は、「リソース単価と実績工数をSQLから取得し、Projectへ流し込んで差異を可視化する」という、現場で最も重宝されるオートメーションの極意を伝授します。
—
1. Project VBAの「心臓部」を理解する
Project VBAの世界に足を踏み入れる際、まず覚えておくべきは「オブジェクトの階層構造」です。
- Project Object: ファイルそのもの。
- Task Object: プロジェクトのタスク。
- Resource Object: 人や機械などのリソース。
- Assignment Object: 「誰が」「どのタスクに」割り当てられているか、という接点。
コスト予実を管理する場合、この Assignment(割り当て) こそが主役です。コストは「単価(Resource)」×「工数(Assignment)」で決まるからです。
—
2. 予実管理自動化のアーキテクチャ
今回のフローは以下の3ステップです。
1. 接続: ADODB(ActiveX Data Objects)を使ってSQL Serverへ接続。
2. 取得: 予実データを抽出。
3. 書き込み: `Assignment.Cost` またはカスタムフィールドへ値をセット。
実装コード例
以下は、SQL Serverから取得したデータを、特定のタスクに割り当てられたリソースの「コストフィールド」に書き込むためのVBAコードです。
Sub SyncProjectCostFromSQL()
‘ 参照設定: Microsoft ActiveX Data Objects x.x Library が必要
Dim conn As Object
Dim rs As Object
Dim sql As String
Dim tsk As Task
Dim assn As Assignment
‘ 1. DB接続設定 (接続文字列は環境に合わせて変更してください)
Set conn = CreateObject(“ADODB.Connection”)
conn.Open “Provider=SQLOLEDB;Data Source=SERVER_NAME;Initial Catalog=DB_NAME;Integrated Security=SSPI;”
‘ 2. SQL実行 (リソースIDと実績コストを取得する想定)
sql = “SELECT ResourceID, ActualCost FROM ResourcePerformance WHERE Period = ‘2023-10′”
Set rs = conn.Execute(sql)
‘ 3. Project内の各タスク・割り当てをループして更新
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
For Each assn In tsk.Assignments
‘ 割り当てられたリソースIDとSQLの結果を照合
If assn.ResourceID = rs!ResourceID Then
‘ コストを書き込む (※注意: ActualCostは読み取り専用の場合があるため、
‘ 実際にはカスタムコストフィールド[Cost1等]に格納するのが安全です)
assn.Cost1 = rs!ActualCost
End If
Next assn
End If
Next tsk
‘ 終了処理
rs.Close
conn.Close
End Sub
—
3. 初学者が必ず躓く「3つの罠」
ここをクリアすれば、あなたはもう中級者です。
① 「読み取り専用」の壁
Projectの標準フィールド(ActualCostなど)は、計算ロジックが強固すぎてVBAから直接書き込めないことがあります。
- 解決策: `Cost1`, `Cost2` などの「カスタムコストフィールド」を使いましょう。表示名を変えれば、実務上の問題はありません。
② 計算のタイミング(再計算の罠)
VBAで値を書き換えても、Projectのエンジンの再計算が追いつかず、画面が更新されないことがあります。
- 解決策: コードの最後に `CalculateAll` を呼び出すか、`Application.ScreenUpdating = True` を確認してください。
③ 参照設定の忘れ物
`ADODB` を使うには、VBAエディタの「ツール」>「参照設定」から 「Microsoft ActiveX Data Objects x.x Library」 にチェックを入れる必要があります。これをしないと「ユーザー定義型は定義されていません」というエラーで悩み続けることになります。
—
4. 先輩エンジニアからのアドバイス
「マクロの記録」ボタンを押しても、Project VBAは何も記録してくれません。これは初心者を絶望させる最大の仕様ですが、裏を返せば「自分の力でオブジェクトを操作する醍醐味を味わえる」ということです。
まずは、`Debug.Print tsk.Name` で全タスクの名前をイミディエイトウィンドウに出力することから始めてみてください。そこから一歩ずつ、リソース単価や工数にアクセスしていけば、必ず見えてくる景色があります。
自動化は、単なる「作業の短縮」ではありません。「人間が本来考えるべき、プロジェクトのボトルネック分析」に集中するための時間を作り出すための投資です。
ここをクリアすれば、もう怖くありませんよ。さあ、次はどのコストを自動化しましょうか?応援しています!
