こんにちは!プロジェクト管理の現場で、日々奮闘されていることと思います。
「マクロの記録」ボタンを押すだけの自動化から一歩抜け出して、いよいよ本格的なProject VBA(Visual Basic for Applications)の世界に踏み込もうとしているあなたへ。今日は、現場で即戦力となる「ベースライン(計画値)の保存日時を、カスタムフィールドへ自動で書き込む仕組み」を一緒に作っていきましょう。
ここをクリアすれば、Project VBAの基本オブジェクトの扱い方や、イベントの捉え方がグッと身につきますよ。難しいことはありません。優しく紐解いていきますので、安心してついてきてくださいね。
—
1. なぜ「ベースラインの保存日時」を追跡する必要があるのか?
プロジェクトマネジメントにおいて、ベースライン(計画)は命綱です。しかし、Microsoft Projectの標準機能だけでは、「一体、誰が、いつそのベースラインを引いたのか(上書きしたのか)」というメタデータ(データのデータ)をタスク単位で綺麗に追跡・保持するのが少し面倒です。
これをVBAを使って自動化すれば:
- 「いつの計画時点のタスクか」がタスク一覧で一目瞭然になる
- スケジュール変更の履歴を客観的に残せる
- 報告資料の信頼性が劇的に上がる
といった強力なメリットが生まれます。それでは、実装のステップを見ていきましょう。
—
2. 準備:カスタムフィールドを用意する
まずは、書き込み先となる「場所」をProject上に作ります。MS Projectには、ユーザーが自由に追加できる「カスタムフィールド(ユーザー定義フィールド)」という機能があります。
1. Projectのガントチャート画面の上部メニューから、[プロジェクト]タブ > [カスタム フィールド] をクリックします。
2. フィールドの種類で [タスク] を選択します。
3. 今回は「テキスト」を選び、一覧から [テキスト1 (Text1)] をクリックします。
4. 右側の [名前の変更 (Rename)] ボタンを押し、分かりやすく `BaselineSavedDate` と名付けましょう。
これで準備完了です。「Text1」というフィールドが、私たちのプログラムの宛先になります。
—
3. 実践!ベースライン保存と同時に日時を書き込むVBAコード
ここからが本番です。開発タブの「Visual Basic」Editor([Alt] + [F11])を開き、標準モジュールに以下のコードを貼り付けてください。
このコードは、「アクティブなプロジェクトのベースラインを保存しつつ、同時に全タスクのText1フィールドに『今日の日付』を刻印する」というスマートな処理を行います。
‘ ==============================================================================
‘ 処理名 : SetBaselineWithTimestamp
‘ 概要 : プロジェクトのベースライン(計画)を保存し、カスタムフィールドに
‘ その保存日時を自動書き込みするプロシージャ
‘ ==============================================================================
Sub SetBaselineWithTimestamp()
Dim tsk As Task
Dim currentDateTime As String
‘ 1. エラーハンドリングの準備(現場の基本です)
On Error GoTo ErrorHandler
‘ 2. 実行確認のメッセージボックス
If MsgBox(“現在のスケジュールをベースラインとして保存し、” & vbCrLf & _
“カスタムフィールド[Text1]に実行日時を記録しますか?”, _
vbYesNo + vbQuestion, “ベースライン保存自動化”) = vbNo Then
Exit Sub
End If
‘ 3. 現在の日時を文字列として生成(例: 2023/10/25 15:30)
currentDateTime = Format(Now, “yyyy/mm/dd hh:nn”)
‘ 4. MS Project標準のベースライン保存メソッドを呼び出す
‘ (ここではベースライン0を、すべてのタスクに対して保存)
ActiveProject.SetBaseline Baseline:=pjBaseline
‘ 5. プロジェクト内のすべてのタスクをループ処理
‘ ※ここがVBAの醍醐味です!
For Each tsk In ActiveProject.Tasks
‘ 概要タスク(サマリータスク)や削除されたタスクを除外する安全策
If Not tsk Is Nothing Then
If tsk.Summary = False And tsk.Active = True Then
‘ テキスト1 (Text1) に保存日時を代入
tsk.Text1 = currentDateTime
End If
End If
Next tsk
‘ 6. 成功のフィードバック
MsgBox “ベースラインの保存と日時の記録が完了しました!” & vbCrLf & _
“記録日時: ” & currentDateTime, vbInformation, “処理成功”
Exit Sub
ErrorHandler:
‘ 万が一のエラーを捕捉し、ユーザーに通知する
MsgBox “エラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
4. コードの注目ポイント(初心者が押さえておくべき本質)
ただ動くだけのコードなら誰でも書けます。しかし、プロのエンジニアを目指すあなたには、このコードの「裏側の仕組み」を知ってほしいのです。
① `ActiveProject.Tasks` によるオブジェクト走査
Excel VBAでいう `Range` や `Cells` のように、Project VBAでは `ActiveProject.Tasks` がプロジェクト内のすべてのタスクを握っています。`For Each` を使って1つずつ取り出し、変数 `tsk` に格納して操作しています。
② 無効なタスクへの配慮(`tsk Is Nothing` / `Summary` チェック)
Projectの世界には、「すでに削除されたメモリ上のゴミ」や「親タスクであるサマリータスク」が存在します。これらを考慮せずにすべてのフィールドに書き込もうとすると、ランタイムエラーの原因になります。
`If Not tsk Is Nothing Then` と `If tsk.Summary = False` でしっかりとガードを入れるのが、「壊れないVBA」を書くプロの作法です。
③ 日時のフォーマット化
`Format(Now, “yyyy/mm/dd hh:nn”)` を使っています。ExcelやProjectの世界では、日付はシリアル値(数値)として扱われますが、そのまま放り込むと表示形式に依存してしまいます。文字列として綺麗に固めて(スナップショットとして)保存するのが、後々のデータ集計で泣きを見ないコツです。
—
5. 現場でありがちな「落とし穴」と対策
初心者のうちは、よく次のような壁にぶつかります。あらかじめ知っておけば怖くありません。
- 落とし穴1: 「フィールド名を変えたのに値が入らない!」
- 原因: コード内で指定しているのは `Text1` という物理的なシステム名です。ステップ2で「名前の変更」をしましたが、VBAからはあくまで `Text1`(または `CustomText1` など)として指定する必要があります。
- 落とし穴2: 「サマリータスクにも日付が入ってしまう」
- 原因: プロジェクト全体の計画日を追跡したいのか、個別の末端タスク(ワークパッケージ)ごとの実績を追いたいのかで処理は変わります。上記のコードでは `tsk.Summary = False` を入れて「実作業タスクのみ」に絞っていますので、用途に応じてここを調整してください。
—
まとめ
いかがでしょうか?
今回は、ベースラインの保存というProjectのコアな操作と、カスタムフィールド(Text1)への値の書き込みをVBAで美しく連動させる方法を解説しました。
「ボタン一つで、計画の裏付け(メタデータ)まで同時に記録する」――この小さな自動化の積み重ねが、あなたのプロジェクト管理業務を圧倒的に洗練されたものに変えてくれます。
ここをクリアできれば、Project VBAの基本的なオブジェクト操作(プロジェクト、タスク、フィールド)はもうバッチリです!自信を持って、次の自動化の扉を開いてみてくださいね。応援しています!
