Project VBAの深淵へ:リソース稼働状況を「データパイプライン」として抽出する技術
こんにちは。現場で泥臭く、しかし誰よりもエレガントに自動化を追求するエンジニアです。
皆さんはMicrosoft Project(MSP)のデータをどう扱っていますか?「プロジェクトの画面で見るだけで精一杯」「レポート機能が使いにくい」と嘆いていませんか?
MSPの真価は、その内部に眠る「リソースの時系列データ」をいかに取り出し、Power BIやTableauといったBIツールで調理するかにあります。今回は、初心者の方が「マクロの記録」から一歩進み、「実務で使えるデータパイプライン」を構築するためのVBA作法を伝授します。
—
1. なぜ「稼働状況」のデータ化が重要なのか
MSPの標準レポートは「今、ここ」を見るには良いですが、経営層が見たい「数ヶ月先までのリソースの過不足」や「部門横断的な負荷」を分析するには力不足です。
ここで重要なのは、「人間が見やすい表」ではなく「プログラムが処理しやすい表(フラットデータ)」に整形して書き出すことです。
目指すべきデータの姿(Tidy Data)
| 日付 | リソース名 | 割り当て時間 | プロジェクト名 |
| :— | :— | :— | :— |
| 2023/11/01 | 山田太郎 | 8h | A案件 |
| 2023/11/01 | 佐藤花子 | 4h | B案件 |
このように、1行に1つの事実がある形に落とし込むのが、データ分析の鉄則です。
—
2. 現場で使えるVBAコード:リソース稼働抽出の極意
以下のコードは、アクティブなプロジェクトから「リソース名」「開始日」「終了日」「作業時間」をCSVとして書き出すためのエンジンです。
Sub ExportResourceUtilizationToCSV()
‘ 変数の宣言:メモリ効率を意識して型を明示する
Dim proj As Project
Dim res As Resource
Dim asgn As Assignment
Dim filePath As String
Dim fileNum As Integer
Set proj = ActiveProject
filePath = ThisWorkbook.Path & “\Resource_Utilization.csv”
fileNum = FreeFile
‘ CSVファイルを書き込みモードで開く
Open filePath For Output As #fileNum
‘ ヘッダーを書き込む
Print #fileNum, “ResourceName,TaskName,Start,Finish,Work”
‘ プロジェクト内の全リソースを走査
For Each res In proj.Resources
‘ リソースが割り当てられているか確認
If Not res Is Nothing Then
‘ 各リソースに紐づくタスク(Assignment)をループ
For Each asgn In res.Assignments
‘ データの書き出し(カンマ区切り)
Print #fileNum, res.Name & “,” & _
asgn.Task.Name & “,” & _
asgn.Start & “,” & _
asgn.Finish & “,” & _
(asgn.Work / 60) ‘ 分単位を時間に換算
Next asgn
End If
Next res
Close #fileNum
MsgBox “抽出完了!BIツールで読み込んでください。”, vbInformation
End Sub
—
3. コードが語る「3つの重要ポイント」
① オブジェクトの階層構造(Project > Resource > Assignment)
MSPのVBAは、この階層構造を理解することがすべてです。
「プロジェクトの中にリソースがいて、リソースの中に割り当て(Assignment)がある」。この入れ子構造(ネスト)をループで回すという感覚が身につけば、どんな複雑なデータも抽出できます。
② `FreeFile` を使う理由
初心者の方はファイル番号に直接 `1` などと書きがちですが、それは危険です。他のプログラムがその番号を使っているとエラーになります。`FreeFile` はシステムから空いている番号を取得する「安全装置」です。プロのコードには必ずこれが入っています。
③ 単位の換算(Work / 60)
MSP内部では作業時間は「分」で保持されています。BIツールで可視化する際は「時間(h)」に直しておかないと、後で計算ミスのもとになります。こうした「データの前処理」をVBAで行うのが自動化の極意です。
—
4. 陥りやすいエラーと対策
- 「オブジェクトが必要です」エラー
- 原因: 割り当てがないリソース(空のリソース)を無理やり参照しようとしています。
- 対策: `If Not res Is Nothing Then` のようなチェックを必ず入れること。
- 「許可がありません」エラー
- 原因: 前回のCSVを開いたまま実行しようとしています。
- 対策: 処理の冒頭でファイルを閉じる記述を追加するか、ファイル名にタイムスタンプを付与して重複を防ぎましょう。
—
最後に:ここをクリアすれば、あなたはもう「自動化の入り口」に立っています
VBAを書くことは、単に作業を速くするだけではありません。「プロジェクトの仕組みをコードという言語で解釈する」という、エンジニアとしての視点を手に入れることです。
まずはこのコードをコピーして、動かしてみてください。CSVが出力された瞬間に、あなたのPCはただの「入力機」から「データ分析のハブ」へと進化します。
何か分からないことがあれば、いつでも聞いてください。ここをクリアすれば、Project VBAの基本はバッチリですよ。次の一歩として、次は「特定期間の稼働率」を計算するロジックに挑戦してみましょう。応援しています!
