こんにちは!プロジェクト管理の現場で、日々Microsoft Projectと格闘お疲れ様です。
「マクロの記録」ボタンを押してみたものの、Excelとは違う独特のオブジェクト構造に戸惑っていませんか?
今回は、マクロの記録だけでは絶対に辿り着けない、「MS Projectの裏側(オブジェクトモデル)を完全につかみ取る」ための極限の知見をお伝えします。
テーマは「ベースライン設定の自動検証:設定漏れを検知するチェックリストマクロ」です。
「すべてのタスクにベースラインが正しく引かれているか?」――これを人間の目視で確認するのは、百害あって一利なし。VBAの全件走査(イテレーション)で一瞬にして暴き出し、品質を担保するプロフェッショナルなツールを一緒に作っていきましょう。
ここをクリアすれば、Project VBAの本質はバッチリ見えてきますよ。優しく、そして深く、紐解いていきましょう!
—
1. なぜ「ベースライン設定漏れ」が現場を崩壊させるのか?
プロジェクト管理において、ベースライン(計画値)は羅針盤です。これが設定されていないタスクが混ざっていると、「進捗率の遅延」「Earned Value(EV)分析」「スケジュール変動の予測」など、あらゆるプロジェクト指標が狂い始めます。
しかし、大規模なプロジェクトともなれば、タスクは数百〜数千行に及びます。
「あ、あの新規追加タスク、ベースライン保存し忘れてた……」なんてことが起きても、目視チェックでは必ず見落としが発生します。
これをプログラムの力で完全自動化するのが今回の目的です。
—
2. Project VBAの基礎:Excel VBAとは何が違うのか?
コードを書く前に、Excel VBA脳からProject VBA脳へシフトしましょう。ここが最大の罠です。
- Excel: `Cells(row, col)` や `Range` でセルを直接指定します。
- Project: セルという概念はありません。プロジェクトは「タスク(Task)」「リソース(Resource)」という階層構造(コレクション)で成り立っています。
特に重要なのが、タスクの「ベースライン」情報がどこに格納されているかです。
Projectの各タスク(`Task`オブジェクト)には、ベースライン0〜10までのデータセットが存在し、例えば `BaselineStart` や `BaselineCost` といったプロパティで保持されています。
—
3. 【実践】ベースライン未設定検知マクロの全コード
それでは、開発の現場でそのままコピペして使える実用的なコードを公開します。
VBE(Visual Basic Editor)を開き、標準モジュールに貼り付けて実行してください。
‘ ==============================================================================
‘ 【Project VBA】ベースライン設定漏れ 簡易品質保証チェッカー
‘ アーキテクト推奨:全タスクを走査し、ベースライン未設定の行をイミディエイト窓に出力
‘ ==============================================================================
Sub CheckBaselineIntegrity()
Dim tsk As Task
Dim unassignedCount As Long
Dim summaryCount As Long
Dim normalCount As Long
‘ 初期化
unassignedCount = 0
summaryCount = 0
normalCount = 0
‘ ヘッダーの出力
Debug.Print “==================================================”
Debug.Print ” [品質監査] ベースライン設定漏れチェック開始”
Debug.Print ” 実行日時: ” & Now
Debug.Print “==================================================”
‘ アクティブプロジェクトの存在チェック
On Error GoTo ErrorHandler
If ActiveProject.Tasks.Count = 0 Then
MsgBox “現在開かれているプロジェクトにタスクが存在しません。”, vbExclamation, “警告”
Exit Sub
End If
‘ 【核心】プロジェクト内の全タスクを走査するイテレーション
For Each tsk In ActiveProject.Tasks
‘ 1. Nullタスク(削除されたタスクの残骸など)やマイルストーン、
‘ または「プロジェクト概要タスク(ID 0)」を安全に除外
If Not tsk Is Nothing Then
If tsk.ID > 0 Then
‘ 2. サマリータスク(親タスク)か、通常の作業タスクかを判定
If tsk.Summary Then
summaryCount = summaryCount + 1
‘ ※サマリータスクは自動計算されるためベースラインの扱いが異なる場合がありますが、
‘ 今回は「BaselineStartがNA(未設定)」の状態を検知対象とします。
End If
‘ 3. ベースラインが設定されているか? (NA値かどうかの判定)
‘ Project VBAでは未設定の日付は “NA” (Nullまたは特定の初期値) を返します。
If tsk.BaselineStart = “NA” Or IsNull(tsk.BaselineStart) Then
unassignedCount = unassignedCount + 1
‘ 未設定タスクの詳細をイミディエイトウィンドウに警告出力
Debug.Print ” [未設定検知] ID: ” & tsk.ID & ” | タスク名: ” & tsk.Name & ” | 種類: ” & IIf(tsk.Summary, “サマリー”, “通常”)
Else
normalCount = normalCount + 1
End If
End If
End If
Next tsk
‘ 監査結果のサマリー出力
Debug.Print “==================================================”
Debug.Print ” 監査完了”
Debug.Print ” – 正常に設定済みのタスク数 : ” & normalCount
Debug.Print ” – 要確認(未設定)タスク数 : ” & unassignedCount
Debug.Print “==================================================”
‘ 完了ポップアップ
If unassignedCount > 0 Then
MsgBox “【警告】ベースライン未設定のタスクが ” & unassignedCount & ” 件検出されました。” & vbCrLf & _
“詳細はイミディエイトウィンドウを確認してください。”, vbExclamation, “品質監査完了”
Else
MsgBox “素晴らしい!すべてのタスクにベースラインが正しく設定されています。”, vbInformation, “品質監査完了”
End If
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
4. コードの深掘り解説:ここがプロの技
初心者がハマりやすいポイントや、コードの重要な設計思想を3つに絞って解説します。
① `For Each tsk In ActiveProject.Tasks` の圧倒的な安全性
Excelだと `For i = 1 to 100` のように行番号をループさせがちですが、Projectではタスクの削除や挿入によってIDの連続性が崩れることが多々あります。
`For Each` を使えば、存在するタスクを確実に1つずつ安全に手繰り寄せることができます。
② `tsk.ID > 0` という防壁
MS Projectのタスクコレクションには、ID `0` に「プロジェクト要約タスク」という特殊なオブジェクトが存在します。これを通常のタスクと同じように処理しようとすると、プロパティの競合で思わぬエラーを引き起こします。
`tsk.ID > 0` で除外するのは、実務で絶対に外せない「安全装置(フェイルセーフ)」です。
③ 日付の「NA」判定
Project特有の癖として、まだ計画が立てられていない日付データは文字通りの文字列 `”NA”`(Not Available)として返ってきます。
通常のVBAの感覚で `If tsk.BaselineStart = 0` などと書くと型不一致エラーになるため、`tsk.BaselineStart = “NA”` という判定を入れているのが、このコードの最も知見が詰まった部分です。
—
5. 陥りやすいエラーと対処法
- エラー:「オブジェクト変数が設定されていません。(Error 91)」
- 原因: 削除されたタスクのメモリ領域(空のポインタ)にアクセスしてしまっています。
- 対策: コード内にある `If Not tsk Is Nothing Then` というオブジェクトの生存確認(ガード節)がこれを防いでいます。この記述を絶対に省かないでください。
- イミディエイトウィンドウってどこで見れるの?
- 対策: VBEの画面(Alt + F11)を開き、上部メニューの「表示」>「イミディエイト ウィンドウ」をクリック(または `Ctrl + G`)すると、検証結果が表示される専用エリアが出現します。
—
まとめ:ここをクリアすれば、Project VBAの基本はバッチリ!
今回は、ベースラインの未設定をあぶり出す品質保証マクロを通じて、Project特有のオブジェクト構造と安全なイテレーション(全件走査)の手法を解説しました。
「マクロの記録」の枠を超え、こうした自作の監査ツールを現場に導入できるようになると、あなたのプロジェクト管理の信頼性は圧倒的に跳ね上がります。エラーハンドリングやオブジェクトの生存確認といった「守りのプログラミング」をマスターしたあなたなら、もう初級者卒業です。
ぜひ、あなたの手元のプロジェクトファイルでこのマクロを走らせてみてください。「おっ、こんなところに設定漏れがあった!」という発見があるはずです。
それでは、次回の極限の知見でお会いしましょう。快適な自動化ライフを!
