こんにちは!日々のプロジェクトマネジメント、本当にお疲れ様です。
マクロの記録から一歩踏み出し、「自分の手でProjectを完全にコントロールしたい」そう思ってこのページにたどり着いたあなたへ。世界最高峰の自動化アーキテクトである私から、MS Project VBAの本質を詰め込んだ「実践知」を授けましょう。
ここをクリアすれば、あなたもProject VBAの基本を完全にマスターし、手作業による地獄のようなWBS整理から解放されます。一緒に極上の自動化世界へ進みましょう!
—
なぜ、標準の「WBS番号」をカスタムフィールドにコピーする必要があるのか?
MS Projectには、タスクの階層構造を自動で認識してくれる「WBS番号」という素晴らしい標準機能があります(例:`1.2.1` など)。
しかし、現場でこんな悩みを持ったことはありませんか?
- 「標準のWBSフィールドは、レポートやExcelへのエクスポートで、なぜかフィルタリングやソートが思い通りに動かない…」
- 「特定の階層(例:レベル2の親タスクだけ)でグループ化して経営陣に報告したいのに、標準機能だけでは限界がある…」
ここで登場するのが「カスタムフィールド」です。
MS Projectにはユーザーが自由に使える「Text1」〜「Text30」といった予備のフィールドが用意されています。ここに標準のWBS番号を「文字列」として自動で書き出すことができれば、Excelへの出力、高度なフィルタリング、独自のソートが完全に自由自在になります。
今回は、このWBS構造の同期をボタン一つ、あるいはイベント駆動で完璧にこなす実用的なVBAコードをあなたに授けましょう。
—
現場で即戦力となる!WBS自動書き出しマクロ
以下のコードを、MS ProjectのVBAエディタ(`Alt + F11` で起動)の標準モジュールに貼り付けてください。
実務でそのまま使えるよう、エラーハンドリングと、余計な描画を省くパフォーマンス最適化(これがプロの仕事です)を組み込んでいます。
Sub SyncWBSToCustomField()
‘ =====================================================================
‘ 目的: MS Projectの標準WBS番号を、カスタムフィールド(Text1)に自動書き出しする
‘ 対象: プロジェクト内のすべての有効なタスク
‘ =====================================================================
Dim tsk As Task
Dim updatedCount As Long
‘ 1. パフォーマンス向上のための画面描画・計算の停止(プロの常識です)
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
updatedCount = 0
‘ 2. プロジェクト内の全タスクをループ処理
For Each tsk In ActiveProject.Tasks
‘ 予約語やサマリータスクの削除行、空行を除外するための安全装置
If Not tsk Is Nothing Then
If tsk.ExternalTask = False And tsk.Summary = False Or tsk.Summary = True Then
‘ 標準のWBSプロパティを、カスタムフィールド「Text1」に代入
‘ ※ Text1を「WBS_Code」などの名前にリネームしておくと便利です
tsk.Text1 = tsk.WBS
updatedCount = updatedCount + 1
End If
End If
Next tsk
‘ 3. 処理終了後の後始末
Application.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “WBSの同期が完了しました!” & vbCrLf & _
“更新されたタスク総数: ” & updatedCount & “件”, _
vbInformation, “同期完了”
Exit Sub
ErrorHandler:
‘ エラー時の安全装置(画面描画の戻し忘れを防ぐ)
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
コードの核心を分かりやすく解説!
「なんだか難しそうな英語が並んでいるな…」と思ったそこのあなた。安心してください。分解して見れば、やっていることはとてもシンプルです。
1. `Application.ScreenUpdating = False` (爆速化の魔法)
Projectはタスク数が数千件を超えると、コードが実行されるたびに画面を再描画しようとして動作が激重になります。最初に画面描画を止め、最後に `True` に戻す。これだけで処理スピードが何倍にも跳ね上がります。現場で「マクロが遅い」と言われないための必須テクニックです。
2. `For Each tsk In ActiveProject.Tasks` (タスクの全数調査)
プロジェクトファイルの中にいる「すべてのタスク(`Task`)」を順番に `tsk` という変数に代入して、1つずつ料理(処理)していくための基本のループ構文です。
3. `tsk.Text1 = tsk.WBS` (データの橋渡し)
ここがこのマクロの心臓部です。
- `tsk.WBS`:Projectが自動計算している標準のWBS文字列(例: “1.1.2”)
- `tsk.Text1`:私たちが自由に使えるカスタムテキストフィールド(Text1)
左辺に右辺を代入することで、標準のWBSがそのままカスタムフィールドのデータとして保存されます。
—
初学者が絶対にハマる!陥りやすい罠と回避策
VBAを書き始めると、誰もが必ず一度は次のようなエラーや罠に直面します。事前に知っていれば怖くありません。
罠1: 「オブジェクト変数または With ブロック変数が見つかりません」エラー
- 原因: Projectのタスクリストの中には、ユーザーが何も入力していない「空行」や、データ構造上の特殊な行が含まれていることがあります。これに対してプロパティ(`WBS`など)を呼び出すと、VBAはパニックを起こします。
- 回避策: コード内にある `If Not tsk Is Nothing Then` というガード節がこのエラーを防いでいます。「もしタスクが存在していれば処理する」というこの一手間が、安定したマクロの命です。
罠2: カスタムフィールドの名前が分かりにくい
- 対策: コードでは `Text1` を使用しましたが、そのままでは何のフィールドか忘れてしまいます。
- Projectのメニューから [プロジェクト] > [カスタム フィールド] を開く。
- フィールドの種類を「タスク」にし、種類を「テキスト」に合わせる。
- `Text1` を選択し、[名前の変更] ボタンから「WBS_同期用」などにリネームしておきましょう。これでExcel等にエクスポートした際もヘッダー名が美しく出力されます。
—
ここをクリアすれば、Project VBAの基本はバッチリです!
お疲れ様でした!今回学んだ「オブジェクトのループ」「プロパティの取得と代入」「画面描画の制御」は、MS Projectを自動化するための王道にして最強の基礎です。
このコードをベースに、「特定のWBSレベルのタスクだけに色を塗る」「進捗率を自動で親に集計する」など、あなたのプロジェクトに合わせて応用範囲をいくらでも広げることができます。
手作業という無駄な苦作業はプログラムに任せ、あなたにしかできない「本質的なプロジェクトマネジメント」に集中しましょう。あなたのエンジニアライフとプロジェクトの成功を、心から応援しています!
