マクロの記録を卒業しよう。Project VBAで「カスタムフィールド」を支配する極限の第一歩
こんにちは。現場の自動化を支えるチーフアーキテクトです。
MS Projectを使ってプロジェクト管理をしていると、必ずと言っていいほど直面する壁があります。それが「カスタムフィールド(ユーザー定義フィールド)」の設定です。
「このタスクには『進捗ステータス』という項目が欲しい」「リソースには『スキルレベル』という項目を追加したい」……。そう思ったとき、あなたはマウスを右クリックして、メニューを辿り、名前を入力し、計算式を打ち込んでいませんか?
もしそうなら、あなたは今、「エンジニアへの登竜門」の前に立っています。
手作業での設定は、一見簡単に見えますが、実は「ミス」の温床です。名前の打ち間違い、データ型の選択ミス、計算式の構文エラー。これらが積み重なると、プロジェクトのデータ整合性は崩壊します。
今日は、そんな泥臭い作業をたった一行のコードで終わらせる方法、つまり「カスタムフィールドの定義をVBAで自動化する技術」を伝授しましょう。ここをクリアすれば、あなたのProject VBAスキルは一段上のステージへ上がります。
1. 本質を理解する:カスタムフィールドとは「器」である
プログラミング初学者が最初につまずくのは、「値を入れる場所」と「場所そのものの定義」の区別がつかないことです。
MS Projectにおけるカスタムフィールドは、例えるなら「ラベルが貼られていない箱」です。
1. 箱(フィールド)自体: `Text1`, `Number1`, `Flag1` といった、あらかじめ用意された物理的な領域。
2. ラベル(名前): あなたが「進捗状況」や「重要度」と名付ける名前。
3. 中身のルール(型と計算式): 「ここには文字を入れる」「ここは数値だけ」「自動的にこの計算をする」というルール。
マクロの記録を使っているうちは、「箱に名前を書く」作業しか記録されません。しかし、プロのエンジニアは「箱のルール(定義)そのものをコードで書き換える」のです。
2. 実践:Taskフィールドを自動定義する
まずは、タスク(作業)に対してカスタムフィールドを作成するコードを見てみましょう。
よくあるケースとして、「タスクの期間が長い場合に、自動で『長期タスク』というフラグを立てる」設定を自動化します。
【サンプルコード】Taskカスタムフィールドの自動設定
Sub SetupTaskCustomFields()
' ==========================================================================
' 目的: タスク用のカスタムフィールドを自動定義する
' 概要: Text1に名前を付け、Flag1に計算式を設定する
' ==========================================================================
Dim pjApp As MSProjectApplication
Set pjApp = MSProject
On Error GoTo ErrorHandler
' --- 1. Textフィールドの設定 (名前の変更) ---
' Text1 という「箱」に「プロジェクト区分」という「ラベル」を貼ります
' ※CustomFieldオブジェクトを操作して、フィールドの定義を書き換えます
With pjApp.CustomFields.Item(pjText, 1)
.Name = "プロジェクト区分"
.Calculation = pjCalculationNone ' 計算式は使わず、手入力とする設定
End With
' --- 2. Flagフィールドの設定 (計算式の自動設定) ---
' Flag1 という「箱」に「長期タスク判定」という「ラベル」を貼り、
' 「期間が30日より大きければTrue」という「ルール」を書き込みます
With pjApp.CustomFields.Item(pjFlag, 1)
.Name = "長期タスク判定"
' 注意: 計算式は「文字列」として渡す必要があります
.Formula = "Duration > ""30d"""
.Calculation = pjCalculationFormula ' 計算式を有効にする設定
End With
MsgBox "タスク用カスタムフィールドの設定が完了しました!", vbInformation, "Success"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました。フィールドの型が一致しているか確認してください。" & vbCrLf & _
"Error: " & Err.Description, vbCritical, "Error"
End Sub
ここがプロの視点:コードの解説
- `pjApp.CustomFields.Item(pjText, 1)`:
ここが最も重要な部分です。`pjText` は「テキスト型の箱」を、`1` は「その1番目の箱」を指しています。これを指定することで、箱の「中身」ではなく「定義(名前や計算式)」にアクセスできるのです。
- `.Calculation = pjCalculationFormula`:
「この箱は、計算式によって自動的に中身が決まる箱ですよ」という宣言です。これを忘れると、せっかく書いた `.Formula` が無視されてしまいます。
3. 陥りやすい罠:データ型の不一致(Type Mismatch)
初心者が必ずと言っていいほど遭遇するエラーがこれです。
「Text1(テキスト型)の箱に、計算式で数値を入れようとする」
あるいは
「Number1(数値型)の箱に、計算式で文字列を入れようとする」
MS Projectは非常に厳格です。箱の型と、`.Formula` で指定した結果の型が一致していないと、プロジェクトを開く瞬間に「計算エラー」が発生し、最悪の場合、ファイルが不安定になります。
| フィールド型 | VBA定数 | 向いているデータ |
|---|---|---|
| Text | `pjText` | 名前、カテゴリ、ステータス文字列 |
| Number | `pjNumber` | 工数、コスト、ランク(数値) |
| Date | `pjDate` | 開始日、期限、マイルストーン日 |
| Flag | `pjFlag` | Yes/No、判定、チェックボックス |
4. 発展:Resource(リソース)フィールドの自動化
タスクだけでなく、人(リソース)に対しても同様のことができます。リソースに「スキルレベル」という数値フィールドを追加してみましょう。
Sub SetupResourceCustomFields()
' ==========================================================================
' 目的: リソース用のカスタムフィールドを自動定義する
' ==========================================================================
On Error GoTo ErrorHandler
' ResourceのNumber1フィールドを「スキルレベル」として定義
With MSProject.CustomFields.Item(pjNumber, 1)
.Name = "スキルレベル"
.Calculation = pjCalculationNone ' リソースごとに手動で入力するため
End With
MsgBox "リソース用カスタムフィールドの設定が完了しました!", vbInformation, "Success"
Exit Sub
ErrorHandler:
MsgBox "リソース設定中にエラーが発生しました。", vbCritical, "Error"
End Sub
5. まとめ:ここをクリアすれば、基本はバッチリです
今日学んだことを整理しましょう。
1. 「値」と「定義」を分けて考える:`Task.Text1` は値、`CustomFields.Item` は定義です。
2. `CustomFields.Item` を使いこなす:これこそが、フィールドの「名前」や「計算式」をコントロールする魔法の杖です。
3. 型(Type)の一致を死守する:`pjText`, `pjNumber`, `pjFlag` の使い分けが、エラーを防ぐ唯一の道です。
手作業でフィールドを作っていた頃とは、もうお別れです。
これからは、ボタン一つでプロジェクトの基盤(フィールド定義)を完璧に整え、あなたはもっとクリエイティブな「スケジューリング」や「分析」に時間を使いましょう。
一歩ずつ、着実に。コードの世界へようこそ!
*執筆:Legendary Chief Architect*
