【入門編】【初心者向け】カスタムフィールドの作成と基本データ型の設定をVBAで自動化する – Project VBA解析バイブル

スポンサーリンク
スポンサーリンク

マクロの記録を卒業しよう。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*

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