【入門編】【中級者向け】ベースラインを「現在の計画」と「当初計画」で使い分けるための自動コピーマクロ – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけの日常から一歩抜け出し、自分の手でプロジェクトを意のままにコントロールしたい——今日はそんな熱意を持つあなたに向けて、最高にエキサイティングな知見をシェアします。

今回のテーマは「ベースライン(Baseline)の使い分けと自動コピーマクロ」です。

「プロジェクトの途中でスケジュール変更を余儀なくされたけれど、当初の計画と現在の計画をどう比較すればいいか分からない……」
そんな現場の悩みを、Project VBAのスマートな自動化で鮮やかに解決してみましょう。ここをクリアすれば、あなたのProject VBAスキルは間違いなく中級者の領域に到達します。さあ、一緒に扉を開けましょう!

1. なぜベースラインを「使い分ける」必要があるのか?

プロジェクト管理において、ベースライン(基準計画)は「過去の自分たちとの約束」です。しかし、現実のプロジェクトは計画通りに進むことの方が稀ですよね。

  • 当初計画(Baseline): キックオフ時に合意した、絶対に守るべき最初のゴール。
  • 現在の計画(Baseline 1 〜 10): 範囲変更や遅延を織り込み、現在進行形で追いかけている最新の目標。

MS Projectには、ベースラインを保存するためのスロットがなんと11個(基準計画、および基準計画1〜10)用意されています。これらを賢く使い分けることで、「最初の計画からどれくらいズレたのか(当初乖離)」と「直近の変更からどれくらい遅れているのか(直近乖離)」を多角的に分析できるようになります。

今回は、「現在のスケジュール(Active Schedule)を、定期的に『基準計画1』へ退避させ、最初の『基準計画(Baseline)』は絶対に上書きされないように保護する」という、現場で即戦力になる自動化マクロを作ります。

2. Project VBAの基本とオブジェクトのライフサイクル

コードを書く前に、Project VBA特有の「お作法」を確認しておきましょう。Excel VBAと似ていますが、Projectには「タスク(Task)とリソース(Resource)とプロジェクト(Project)」という独特の階層構造があります。

プロジェクト全体のベースラインを叩くメソッド

Excelのようにセルをひとつずつループで回す必要はありません。Projectには、プロジェクト全体に対してベースラインを一発で設定する強力なメソッドが用意されています。それが `SetBaseline` メソッドです。

ActiveProject.SetBaseline Baseline:=pjBaseline1

たったこれ行だけで、プロジェクト全体(または選択したタスク)の現在のスケジュールが「基準計画1」にコピーされます。なんてスマートなんでしょう!

3. 実装:ベースライン自動コピーマクロ

それでは、実際の現場でそのままコピペして使える実用コードを公開します。
このマクロは、以下のロジックで安全性を担保しています。
1. 安全確認: 本当に上書きして良いかユーザーに確認する。
2. 初期ガード: もし「当初計画(Baseline 0)」がまだ未設定なら、勝手に上書きされないように警告して終了する。
3. コピー実行: 現在のスケジュールを「基準計画1(Baseline 1)」にコピーする。

💻 サンプルコード

Sub CopyCurrentToBaseline1()
‘ —————————————————————-
‘ 処理名: 現在のスケジュールを「基準計画1」へ退避させるマクロ
‘ 対象者: マクロの記録から脱却し、実務でProjectを自動化したいあなたへ
‘ —————————————————————-

Dim answer As VbMsgBoxResult

‘ エラーハンドリングの基本(予期せぬクラッシュを防ぐ)
On Error GoTo ErrorHandler

‘ 1. 当初計画(Baseline 0)が設定されているかチェックする
‘ Projectオブジェクトの BaselineSavedDate プロパティで設定有無を判定します
If ActiveProject.BaselineSavedDate(pjBaseline) = #1/1/4501# Then
MsgBox “【警告】当初計画(Baseline)がまだ設定されていません!” & vbCrLf & _
“まずはプロジェクトのキックオフ時に当初計画を設定してください。”, _
vbCritical, “ベースライン未設定”
Exit Sub
End If

‘ 2. ユーザーへの確認(うっかりミスを防ぐプロの配慮)
answer = MsgBox(“現在のスケジュールを『基準計画1 (Baseline 1)』にコピーします。” & vbCrLf & _
“直近の変更履歴として上書きされますが、よろしいですか?”, _
vbYesNo + vbQuestion, “ベースライン更新の確認”)

If answer = vbNo Then
MsgBox “処理をキャンセルしました。”, vbInformation, “キャンセル”
Exit Sub
End If

‘ 3. 現在の計画を「基準計画1」へコピー
‘ SetBaseline メソッドを使用します
‘ 第1引数: どのスロットにコピーするか (pjBaseline1)
‘ 第2引数: プロジェクト全体か、選択タスクのみか (pjCopyCurrentToBaseline = 全体)
ActiveProject.SetBaseline Baseline:=pjBaseline1, Copy:=pjCopyCurrentToBaseline

‘ 完了メッセージ
MsgBox “見事に完了しました!” & vbCrLf & _
“現在のスケジュールが『基準計画1』に正常に保存されました。”, _
vbInformation, “処理成功”

Exit Sub

ErrorHandler:
‘ 万が一エラーが発生した場合の安全装置
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, _
vbCritical, “システムエラー”

End Sub

4. 陥りやすい罠とエンジニアからのアドバイス

ここで、初心者が必ずと言っていいほどハマる「Project VBAの落とし穴」をいくつか共有しておきます。

罠その1:「#1/1/4501#」という謎の日付

先ほどのコードで `ActiveProject.BaselineSavedDate(pjBaseline) = #1/1/4501#` という見慣れない日付が出てきましたね。
これは、MS Projectにおいて「まだ値が設定されていない(Null状態)」を表す内部的な初期値です。「未設定かどうか」を判定したいときは、この4501年という魔の数字を覚えておくと非常に重宝します。

罠その2:タスク選択状態の罠

`SetBaseline` メソッドは、デフォルトではプロジェクト全体を対象にします。もし「選択しているタスクだけ」を対象にしたい場合は、第2引数の `Copy` パラメータや対象範囲の指定を変更する必要があります。
実務の多くは「プロジェクト全体一括」が多いため、まずは今回紹介した全体対象のコードを確実にマスターするのが近道です。

5. おわりに

お疲れ様でした!
今回は、Project VBAを用いて「当初計画を守りつつ、現在の計画を基準計画1に退避させる」という実用的な自動化ロジックを解説しました。

コードを眺めるだけでなく、ご自身のMS Projectの環境(開発タブからVisual Basic Editorを開く)で実際に動かしてみてください。「動いた!」という瞬間こそが、エンジニアとしての最高値の喜びです。

ここをクリアできれば、もうマクロの記録ツールに頼る必要はありません。あなたのプロジェクト管理ライフが、より知的でスピーディーなものになることを心から応援しています。それでは、次のステップでお会いしましょう!

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