【入門編】【初心者向け】ベースライン設定時に「設定日時」をカスタムフィールドへ自動書き込みする仕組み – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で、日々Microsoft Projectと格闘お疲れ様です。
「マクロの記録」ボタンを押したはいいものの、生成された呪文のようなコードを目の前にして「……これ、どう直せばいいんだ?」と途方に暮れていませんか?

大丈夫、その壁は誰もが通る道です。そして今日、その壁を華麗に突破するための「極限の知見」をあなたに授けましょう。

今回は、Project VBAの入門として、「ベースラインを設定したその瞬間を、カスタムフィールドに自動で書き込む仕組み」を作ります。これができるようになると、プロジェクトの「いつ、どのタスクの計画を固めたか」が可視化され、進捗管理の精度が劇的に跳ね上がりますよ。

ここをクリアすれば、Project VBAの基本はバッチリです。一緒に優しく、深く、学んでいきましょう!

1. なぜ「ベースライン設定日時」をカスタムフィールドに残すのか?

Microsoft Projectには強力な「ベースライン(計画値)」機能があります。スケジュールがズレていないかを比較するための基準線ですね。

しかし、標準機能のままでは「いつそのベースラインを引いたのか」というタイムスタンプがタスク単位でパッと目に見える形で残りません。何度もスケジュール変更を繰り返す現場では、「このタスクの計画は、何月何日のものだっけ?」と迷子になることが多々あります。

そこでVBAの出番です。
「ベースラインを保存するマクロを実行したと同時に、今日の 얘(日付)を『テキスト1』などのカスタムフィールドに自動スタンプする」仕組みを作ってしまいましょう。

2. 準備:カスタムフィールドの名前を変えよう

まずは舞台設定です。Projectの画面側で、日付を書き込む「入れ物」を用意します。

1. Projectのリボンから [プロジェクト] タブをクリックします。
2. [カスタム フィールド] をクリックします。
3. 「フィールドの種類」で [タスク] を選び、「種類」を [テキスト] にします。
4. 一覧にある [テキスト1] を選び、右側の [名前の変更] ボタンを押して、分かりやすく `BaselineDate` (ベースライン設定日)と名前を変えておきましょう。

これで準備は完了です。

3. 実践!ベースライン自動スタンプのVBAコード

それでは、今回のメインプログラムをお見せします。
開発タブの [Visual Basic] を開き、標準モジュールに以下のコードを貼り付けてください。

プログラミング初学者でも迷わないよう、一行ずつ魂を込めてコメントを入れています。

Sub SetBaselineWithTimestamp()
‘ =================================================================
‘ 【テーマ】ベースライン設定と同時に「設定日時」をカスタムフィールドへ書き込む
‘ =================================================================

Dim t As Task
Dim setDate As String

‘ 1. 現在の日付を「YYYY/MM/DD」形式の文字列として取得する
setDate = Format(Date, “yyyy/mm/dd”)

‘ 2. ユーザーに確認メッセージを出す(うっかり上書きを防ぐ優しさ)
If MsgBox(“現在の計画をベースラインとして保存し、” & vbCrLf & _
“カスタムフィールド[BaselineDate]に今日の日付([” & setDate & “])を記録しますか?”, _
vbYesNo + vbQuestion, “ベースライン設定の確認”) = vbNo Then
Exit Sub ‘ 「いいえ」が押されたらここで終了
End If

‘ 3. Project標準のベースラインを設定する
‘ (今回は「ベースライン(何も数字がない基本のやつ)」をプロジェクト全体に設定)
ActiveProject.SetBaseline Baseline:=pjBaseline

‘ 4. すべてのタスクをループ処理し、カスタムフィールド(Text1)に日付を書き込む
‘ ※Project VBAでは、テキストカスタムフィールドは “Text1” から “Text30” まで使えます。
For Each t In ActiveProject.Tasks
‘ サマリータスク(要約タスク)や削除された空行を除外する安全装置
If Not t Is Nothing Then
If t.Summary = False And t.Active = True Then
‘ テキスト1 (Text1) に設定日を代入
t.Text1 = setDate
End If
End If
Next t

‘ 5. 完了の合図
MsgBox “ベースラインの設定と日時の記録が完了しました!”, vbInformation, “処理成功”

End Sub

4. コードの核心を解説:ここがVBAのキモだ!

初心者の方に向けて、このコードの重要なポイントを3つだけ解説します。

① `For Each t In ActiveProject.Tasks` (全タスクの巡回)

エクセルVBAでいう `For Each c In Range(…)` と同じです。プロジェクト内にあるすべてのタスクを上から順に一つずつ掴んで、処理を行うための魔法の呪文です。

② 安全装置:`If t.Summary = False And t.Active = True`

ここがプロのエンジニアのこだわりポイントです。
プロジェクトには、親タスクである「サマリータスク」や、現在使われていないタスクが存在します。これらに無駄なデータを書き込むとデータが汚れる原因になります。「動いている通常タスクだけに書き込む」というフィルタリングが、実務では絶対に必要です。

③ プロパティの指定:`t.Text1 = setDate`

先ほど名前を変えた「テキスト1」は、VBAの世界では `Text1` というプロパティで操作できます。「テキストカスタムフィールドの1番目」という意味ですね。ここに取得した日付(`setDate`)をポイっと放り込むだけで、画面上のカスタムフィールドが自動で書き換わります。

5. 初学者が陥りやすい「罠」とエラー対策

VBAを書き始めると、必ずと言っていいほど次のような壁にぶつかります。あらかじめ知っておけば怖くありません。

  • エラー:「オブジェクト変数または With ブロック変数が見つかりません。」
  • 原因: 削除されたタスクや空行に対して処理を行おうとした時に起きます。
  • 対策: 今回のコードに入れた `If Not t Is Nothing Then` というガード文が、このエラーを防いでくれます。
  • あれ?フィールドに値が入らない?
  • 原因: カスタムフィールドの「名前の変更」はあくまで表示名を変えているだけです。VBAからアクセスする際は、名前ではなく `Text1` や `Text2` といったシステム上の箱の名前を指定する必要があります。

おわりに:小さな自動化が、現場を救う

お疲れ様でした!このマクロを一度動かせるようになると、ボタン一つで「計画の固まった日付」がタスクごとにハッキリと刻まれるようになります。ガントチャートのビューに「BaselineDate」列を追加して眺めてみてください。美しく日付が並んだ瞬間、ちょっとした感動を覚えるはずです。

Project VBAは、エクセルほど情報が多くありません。だからこそ、こうして一つ一つのオブジェクトの挙動を理解していくことが、あなたを「脱・初心者」へと確実に導いてくれます。

あなたのプロジェクト管理が、このコードによって少しでもスムーズでスマートなものになりますように。
それでは、次の極限の知見でお会いしましょう!

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