【入門編】リソースの「作業時間」を週次で集計し、Excel報告書を自動生成するVBA – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクトマネジメントの現場で、日々リソースの調整や進捗管理に奮闘していませんか?

「来週のメンバーの稼働予定、Excelにまとめるのに何時間もかかってる……」
「MS Projectのデータを綺麗に週次レポートにする方法はないものか」

そんなお悩みを抱えているあなたへ。今回は、MS Projectの内部構造をVBAで丸裸にし、一瞬で美しいExcelの週次報告書を作り上げる魔法のようなコードをご紹介します。

マクロの記録が使えないProject VBAの世界ですが、ここをクリアすれば、あなたの業務効率は文字通り「桁違い」に跳ね上がります。優しく、そして本質的なアプローチで解説していきますので、ぜひ最後までついてきてくださいね!

—

なぜ、Excelへの転記作業に苦戦するのか?

実務でMS Projectを使っていると、こんな壁にぶつかりませんか?
「特定のタスクに誰が何時間割り当てられているか(Assignment)」を週ごとに集計し、上司やクライアントに見せるためのExcelフォーマットに手作業で移し替える。これ、非常に退屈でヒューマンエラーの温床になりやすい作業です。

Project VBAの基本をマスターすれば、この地獄のような作業をボタン一つで終わらせることができます。まずは、Projectが持つ独特なデータ構造の秘密を覗いてみましょう。

—

Project VBAの核心:タスク・リソース・アサインメントの関係

Excel VBAと違い、Project VBAには「3つの主役」がいます。ここを理解するのが、エラーを防ぐための第一歩です。

1. Task(タスク): 「何をするか」の予定
2. Resource(リソース): 「誰が・何が」やるか(人や機材)
3. Assignment(アサインメント): 「どのタスクに、どのリソースが、どれだけの時間割り当てられているか」の結びつき

今回私たちが狙うのは、3つ目の「Assignment(アサインメント)」です。
「誰が、どの週に、何時間の作業を持っているのか?」という情報は、すべてこのAssignmentの時系列データ(TimesedData)の中に眠っています。

—

実装:週次作業時間を自動集計してExcelに出力するVBAコード

それでは、現場で即戦力として使えるコードを公開します。
このコードは、MS Project側からExcelを裏で起動し、全タスクのアサインメント情報を取得して、週ごとの作業時間を綺麗に整理して出力するものです。

ProjectのVBAエディタ(`Alt + F11`)を開き、標準モジュールに貼り付けて実行してください。

Sub ExportWeeklyWorkToExcel()
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim t As Task
Dim a As Assignment
Dim ts As TimeScaleValue
Dim rowIdx As Long

‘ 1. Excelのインスタンスを生成(早期バインディングではなく遅延バインディングで安全に)
On Error Resume Next
Set xlApp = CreateObject(“Excel.Application”)
On Error GoTo 0

If xlApp Is Nothing {
MsgBox “Excelが起動できませんでした。インストールされているか確認してください。”, vbCritical
Exit Sub
}

‘ 2. 新規Excelワークブックを作成
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Sheets(1)
xlSheet.Name = “週次リソース稼働報告”

‘ 3. Excelのヘッダーを設定
xlSheet.Cells(1, 1).Value = “リソース名”
xlSheet.Cells(1, 2).Value = “タスク名”
xlSheet.Cells(1, 3).Value = “期間 (週)”
xlSheet.Cells(1, 4).Value = “作業時間 (H)”

‘ ヘッダーの装飾
With xlSheet.Range(“A1:D1”)
.Font.Bold = True
.Interior.Color = RGB(220, 230, 241)
End If

rowIdx = 2 ‘ データの書き込み開始行

‘ 4. プロジェクト内の全タスクを走査
For Each t In ActiveProject.Tasks
‘ サマリータスク(親タスク)や削除済みタスクは除外
If Not t Is Nothing Then
If Not t.Summary And t.Active Then

‘ タスクに紐付くアサインメント(担当者割り当て)を走査
For Each a In t.Assignments

‘ 週単位でタイムスケールデータを取得(稼働時間を抽出)
‘ ※pjTaskTimescaleWorkを指定することで「時間」を取得できます
Dim tsValues As TimeScaleValues
Set tsValues = a.TimeScaleData(t.Start, t.Finish, pjTaskTimescaleWork, pjTimescaleWeeks, 1)

For Each ts In tsValues
If Not IsEmpty(ts.Value) And ts.Value > 0 Then
‘ Excelへ転記(分単位で入るため60で割って時間に変換)
xlSheet.Cells(rowIdx, 1).Value = a.ResourceName
xlSheet.Cells(rowIdx, 2).Value = t.Name
xlSheet.Cells(rowIdx, 3).Value = Format(ts.StartDate, “yyyy/mm/dd”) & ” 週”
xlSheet.Cells(rowIdx, 4).Value = Val(ts.Value) / 60 ‘ 単位調整

rowIdx = rowIdx + 1
End If
Next ts

Next a

End If
End If
Next t

‘ 5. 列幅を自動調整してExcelを表示
xlSheet.Columns(“A:D”).AutoFit
xlApp.Visible = True

MsgBox “週次報告書の生成が完了しました!”, vbInformation, “完了”

‘ クリーンアップ
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
End Sub

—

コードのここがポイント!知的なエンジニアの解説

1. 遅延バインディング (`CreateObject(“Excel.Application”)`) の採用
Excelのバージョン違いによる「参照設定の破損エラー」を完全に回避するため、あえて遅延バインディングを使っています。現場で配布するツールにおいて、この配慮がエンジニアの腕の見せ所です。
2. `TimeScaleData` メソッドの威力
これがProject VBAの真骨頂です。タスクの開始から終了までの期間を、週(`pjTimescaleWeeks`)や日単位でスライスし、ピンポイントで稼働時間を切り出すことができます。
3. 分単位から時間単位への変換 (`/ 60`)
MS Projectの内部データは、作業時間を「分(Minutes)」で保持していることが多いため、Excel側でレポートする際は60で割るひと手品を入れるのが実務上の鉄則です。

—

陥りやすいエラーと回避のコツ

Project VBAを書き始めると、必ずと言っていいほど以下の罠にハマります。ここを先回りしてクリアしておきましょう。

  • エラー「オブジェクト変数または With ブロック変数が見つかりません。」
  • 原因: `For Each t In ActiveProject.Tasks` を回した際、途中に「空のタスク(行を挿入しただけで名前がないもの)」が含まれていると、プロパティを参照した瞬間にエラーになります。
  • 対策: コード内でも入れているように `If Not t Is Nothing Then` でヌルチェックを必ず挟みましょう。
  • サマリータスク(親タスク)を集計してしまう
  • 原因: 親タスクには、子タスクの合計時間が自動計算されて入ります。ここにアサインメントが直接紐づいていると、工数が二重計上(ダブルカウント)されます。
  • 対策: `If Not t.Summary` を条件に入れ、実作業を行う「末端のタスク(Leaf Task)」だけを対象に絞り込みましょう。

—

まとめ:ここをクリアすれば、Project VBAの基本はバッチリです!

今回は、Projectの深部にある「Assignment」と「TimeScaleData」を組み合わせ、実用的なExcel週次報告書を自動生成するコードを解説しました。

最初は難解に思えるProjectのオブジェクトモデルも、「タスク」「リソース」「アサインメント」の3者の関係性さえ掴んでしまえば、あなたの強力な武器に変わります。

手作業によるレポート作成の苦痛から解放され、より本質的なプロジェクトマネジメントやメンバーのケアに時間を使えるよう、ぜひ現場の業務に導入してみてください。あなたのVBAライフが、より豊かでクリエイティブなものになりますように!

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