【入門編】【上級プロ】Project VBAで「カスタムビュー」をXML定義から動的に生成・適用する方法 – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で、日々MS Projectと格闘お疲れ様です。

マクロの記録ボタンを押して生成されたコードを眺めるフェーズは、もう卒業しましたね。ここからは、MS Projectの奥底にあるオブジェクトモデルを自在に操り、数千行の手作業を瞬時に自動化する「真のエンジニアリング」の世界へ足を踏み入れましょう。

今回は、Project VBAの真骨頂の一つである「カスタムビューのXML動的生成・適用」について解説します。
「チーム全員でガントチャートの見た目を統一したいのに、個人のPC環境に依存してバラバラになる……」そんな現場の悩みを一刀両断する、最高にエキサイティングなテクニックを伝授します。ここをクリアすれば、あなたのProject VBAのスキルは間違いなくプロの領域に到達しますよ!

1. なぜ「ViewEditメソッド」と「XML」なのか?

MS Projectで新しいビューを作るとき、通常はGUIで「その他のビュー」を開き、テーブルやフィルター、グループをポチポチと設定しますよね。しかし、これを大人数のプロジェクトメンバー全員に手動でやらせるのは悪夢です。バージョン違いや設定ミスで、プロジェクトごとの「見え方」が狂ってしまいます。

ここで登場するのが、`Application.ViewEdit` メソッドです。
このメソッドは、指定したビューの設定を書き換えたり、新規作成したりするためのものですが、引数に生のXMLを直接渡すことができます。つまり、「コード内で完璧に統制されたXML文字列を組み立て、それを一瞬でProjectに流し込んでビューとして実体化させる」という、極めてモダンでスマートなアプローチが可能になるのです。

2. 押さえておきたい前提知識:MS Projectのビュー構造

XMLを触る前に、Projectのビューがどのような階層構造で作られているかを知る必要があります。MS Projectのカスタムビューは、主に以下の要素の組み合わせで成り立っています。

  • View(ビュー本体): 画面にどう表示されるか(ガントチャート、タスクシートなど)
  • Table(テーブル): どの列(フィールド)をどんな順番で並べるか
  • Filter(フィルター): どのタスクを抽出し、どれを隠すか
  • Group(グループ): リソースや担当者ごとにどうまとめるか

今回は、現場で最も需要が高い「特定のカスタムテーブルと結びついた、独自のガントチャートビュー」をXMLから動的に生成するコードを見ていきましょう。

3. 【実践】XML定義からビューを自動生成・適用するVBAコード

以下のコードは、標準的なガントチャートビューの骨組みを持つXMLをVBA内で動的に構築し、それをProjectにインポートして即座に適用するサンプルです。

開発環境の「標準モジュール」に貼り付けて実行してみてください。

Sub ApplyCustomViewFromXML()
Dim xmlViewDef As String
Dim targetViewName As String

targetViewName = “プロ仕様進捗管理ビュー”

‘ 1. XML定義の構築(文字列として動的に生成)
‘ ※実際の現場では、外部ファイルやシートから読み込むことも可能です
xmlViewDef = “” & _
” & targetViewName & “” & _
1” & _
1” & _

コスト管理
” & _
<なし>” & _
<なし>” & _
1” & _
0” & _
“”

On Error GoTo ErrorHandler

‘ 2. 既存の同名ビューがあれば一度削除(上書き更新のため)
Call DeleteExistingView(targetViewName)

‘ 3. ViewEditメソッドを使い、XMLからビューを新規作成
‘ 第1引数: ビュー名, 第2引数: 画面タイプ(1=タスク), 第3引数以降でXMLを指定
‘ ※環境やProjectのバージョンによりViewEditExを使う場合もあります
ViewEditEx Name:=targetViewName, _
Create:=True, _
Item:=pjTaskItem, _
SinglePane:=True, _
ShowInMenu:=True, _
Highlight:=False, _
Table:=”コスト管理”, _
Filter:=”<なし>“, _
Group:=”<なし>”

‘ ※より高度なプロパティ制御を行う場合は、生成したXML文字列をパース・適用する
‘ 仕組みを組み込みますが、まずはViewEditの基本パターンを押さえましょう。

‘ 4. 生成したビューを画面に適用
ViewApply Name:=targetViewName

MsgBox “カスタムビュー「” & targetViewName & “」の適用に成功しました!”, vbInformation, “処理完了”
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “VBA実行エラー”
End Sub

‘ 補助プロシージャ:既存ビューの安全な削除
Private Sub DeleteExistingView(viewName As String)
Dim v As View
On Error Resume Next
Set v = ActiveProject.Views(viewName)
If Not v Is Nothing Then
v.Delete
End If
On Error GoTo 0
End Sub

4. コードの解説と、初心者がハマりやすい罠

ここが今回の最も重要なポイントです。コードをただコピペするだけではなく、裏側で何が起きているのかをしっかりと理解しましょう。

① XML名前空間とエスケープ文字の罠

XMLをVBAの文字列として扱う際、ダブルクォーテーション(`”`)の扱いに苦しむことがよくあります。VBA内では `””` と重ねることでエスケープしますが、XML内の `<` や `>` は、場合によっては `<` や `>` のように実体参照に置き換える必要があります。上のコードのフィルター部分(`<なし>`)がまさにそれです。この細かい文法ミスがXMLパースエラーを引き起こす最大の原因になります。

② ビュー・テーブルの「依存関係」に注意

XMLやVBAでビューを作成する際、指定した `Table`(上のコードでは「コスト管理」)や `Filter` が、あらかじめプロジェクト内に存在していなければなりません。
「ビューだけを作って、中のテーブル定義を忘れていた」という状態だと、Projectはどの列を表示していいか分からずエラーを起こします。必ず「テーブルの作成 ➔ ビューの作成」という依存関係の順序を守るか、XML内にテーブル定義も含めて一括定義するようにしてください。

③ `ViewEdit` と `ViewEditEx` の使い分け

モダンなProject(2013以降)では、国際対応や拡張プロパティが強化された `ViewEditEx` メソッドを使うのがセオリーです。古いマクロの記録をそのまま使うと `ViewEdit` が出力されますが、極力 `Ex` がつく拡張メソッドを選ぶことで、予期せぬ型不一致エラーを防ぐことができます。

5. さらに高みを目指すエンジニアへ(実務での応用)

実際の現場では、ビューのXML定義をVBAのコード内にベタ書きするのではなく、Excelシートや外部の `.xml` ファイル、あるいはJSONライクな設定ファイルから読み込ませるアーキテクチャを採用します。

そうすることで、

  • 「来週からガントチャートの標準カラーを青から緑に変えてほしい」
  • 「新しいカスタム列を全ビューのデフォルトに追加してほしい」

といった仕様変更が発生した際も、VBAのコードを一文字も書き換えることなく、外部のXMLファイルを差し替えるだけで全社展開が可能になります。これが、プログラミングを知り尽くしたシニアエンジニアの「保守性の高い設計」です。

まとめ

今回は、Project VBAにおけるXMLを活用したカスタムビューの動的生成・適用について解説しました。

  • ViewEditExメソッドを活用し、コードベースでビューを自由自在にコントロールする。
  • ビューが依存するテーブルやフィルターの存在チェックを怠らない。
  • ハードコーディングを避け、将来的な仕様変更に強い設計を意識する。

ここをクリアできれば、もう「マクロの記録に頼る初心者」ではありません。あなたのチームのプロジェクト管理の質を劇的に引き上げる、強力な自動化エンジニアとしての第一歩を踏み出しました。

ぜひご自身の環境でも試して、その圧倒的なスピード感を体感してください。それでは、次の極限の知見でお会いしましょう!

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