こんにちは!プロジェクト管理の現場で、日々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 = “
“
“
“
“コスト管理
” & _
“
“
“
“
“
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メソッドを活用し、コードベースでビューを自由自在にコントロールする。
- ビューが依存するテーブルやフィルターの存在チェックを怠らない。
- ハードコーディングを避け、将来的な仕様変更に強い設計を意識する。
ここをクリアできれば、もう「マクロの記録に頼る初心者」ではありません。あなたのチームのプロジェクト管理の質を劇的に引き上げる、強力な自動化エンジニアとしての第一歩を踏み出しました。
ぜひご自身の環境でも試して、その圧倒的なスピード感を体感してください。それでは、次の極限の知見でお会いしましょう!
