こんにちは!Microsoft Projectの自動化の世界へようこそ。
普段、ExcelのVBAには慣れ親しんでいるけれど、Project VBAを開いた途端に「あれ?勝手が違うぞ…」と戸惑っていませんか?
大丈夫、安心してください。今回は、実務でめちゃくちゃ重宝する「カスタムビューの動的生成と切り替え」をテーマに、Projectオブジェクトモデルの核心を分かりやすく紐解いていきます。
ここをクリアすれば、あなたも脱・マクロの記録。現場で「おっ、やるな!」と言われる自動化エンジニアへの第一歩を踏み出せますよ。それでは、さっそく進めていきましょう!
—
1. なぜ「カスタムビューの動的生成」が必要なのか?
皆さんは日々のプロジェクト管理で、こんな面倒くささを感じていませんか?
- 「経営陣向けには、コストとマイルストーンだけを見せたビューに切り替えたい」
- 「現場のリーダーには、担当者別のタスクと残業時間が一目でわかるフィルタをかけたい」
- 「毎回手動で『テーブルの挿入』や『フィルタの適用』をポチポチ切り替えるのが、正直しんどい」
Microsoft Projectには、標準でたくさんの「ビュー(View)」が用意されていますが、プロジェクトのフェーズやステークホルダーの要求は千差万別です。これをVBAのコード一発で「必要なビューをその場で作る」「瞬時に切り替える」ことができれば、プロジェクト管理のスピードは圧倒的に跳ね上がります。
—
2. Projectオブジェクトモデルの「クセ」を掴む
Excel VBAとProject VBAの最大の決定的な違い、それは「オブジェクトの階層構造と再利用の思想」にあります。
Excelなら、シートを削除して作り直すのは朝飯前ですよね。しかし、Projectのビューやテーブル、フィルタは、グローバル(あるいはプロジェクトファイル内)の共有リソースとして存在しています。
そのため、プログラミングにおいて以下の鉄則を守る必要があります。
1. 同名のビューがすでに存在する場合のエラーハンドリング(または上書きの工夫)
2. 「View(見た目)」「Table(列構成)」「Filter(抽出条件)」の3つの要素が連携していることの理解
特に重要なのは、Viewは単なる「見た目」ではなく、「どのTableを使い、どのFilterを適用するか」をまとめた器(ラッパー)であるという点です。ここを勘違いすると、「コードを書いたのに列が表示されない!」という泥沼にハマります。
—
3. 実践!カスタムビューを動的に生成・切り替えるVBAコード
それでは、実際に動くコードを見てみましょう。
今回は、「特定の担当者グループ(例:開発チーム)の進捗状況をすぐに確認するためのカスタムビュー」を自動生成し、即座に画面に適用する実用マクロを作成しました。
開発環境のVBE(Visual Basic Editor)を開き、標準モジュールに貼り付けてそのまま実行してみてください。
Sub CreateAndSwitchCustomView()
Dim targetViewName As String
Dim targetTableName As String
Dim targetFilterName As String
Dim customView As View
Dim customTable As Table
Dim isViewExists As Boolean
targetViewName = “【自動生成】開発チーム進捗ビュー”
targetTableName = “【自動生成】開発用テーブル”
targetFilterName = “【自動生成】開発チームフィルタ”
On Error GoTo ErrorHandler
‘ ==========================================
‘ 1. フィルタの作成(リソース名に「開発」を含むものを抽出)
‘ ==========================================
‘ ※同名フィルタが存在する場合のエラーを防ぐため、一旦削除を試みる
On Error Resume Next
ActiveProject.Filters(targetFilterName).Delete
On Error GoTo ErrorHandler
‘ 新規フィルタの作成 (引数: Name, TaskBased, FieldName, Test, Value)
‘ ここでは「リソース名」に「開発」が含まれるタスクを抽出します
ActiveProject.Filters.Add Name:=targetFilterName, _
TaskBased:=True, _
FieldName:=”リソース名”, _
Test:=”含まれる”, _
Value:=”開発”
‘ ==========================================
‘ 2. テーブル(表示列の構成)の作成
‘ ==========================================
On Error Resume Next
ActiveProject.Tables(targetTableName).Delete
On Error GoTo ErrorHandler
‘ 新規テーブルの作成(ガントチャート用)
Set customTable = ActiveProject.Tables.Add(Name:=targetTableName)
‘ テーブルに列(フィールド)を追加していく
‘ Add(Field, [Width], [Title], [Align], [HeaderAlign], [ShowInMenu], [LockWidth])
With customTable.TableFields
.Add Field:=pjTaskName, Width:=30, Title:=”タスク名”
.Add Field:=pjTaskStart, Width:=15, Title:=”開始日”
.Add Field:=pjTaskFinish, Width:=15, Title:=”終了日”
.Add Field:=pjTaskPercentComplete, Width:=10, Title:=”進捗率(%)”
.Add Field:=pjTaskResourceNames, Width:=20, Title:=”担当者”
End With
‘ ==========================================
‘ 3. ビューの作成と各要素の紐付け
‘ ==========================================
isViewExists = False
For Each customView In ActiveProject.Views
If customView.Name = targetViewName Then
isViewExists = True
Exit For
End If
Next customView
‘ 既存でなければ新規作成(シングルビュー:ガントチャートベース)
If Not isViewExists Then
‘ Views.AddSingle(Name, Type, [Table], [Filter], [GroupBy], …)
‘ pjViewGantt をベースにして、作成したテーブルとフィルタをドッキングさせます
Set customView = ActiveProject.Views.AddSingle( _
Name:=targetViewName, _
Type:=pjViewGantt, _
Table:=targetTableName, _
Filter:=targetFilterName, _
GroupBy:=”<なし>” _
)
Else
‘ 既存の場合は参照を取得
Set customView = ActiveProject.Views(targetViewName)
‘ 必要に応じてプロパティを更新
customView.Table = targetTableName
customView.Filter = targetFilterName
End If
‘ ==========================================
‘ 4. 画面のビューを切り替える
‘ ==========================================
Application.ViewApplyEx Name:=targetViewName
MsgBox “カスタムビュー「” & targetViewName & “」の生成と切り替えが完了しました!”, vbInformation, “処理成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
4. コードのポイントと「陥りやすい罠」
このコードには、Project VBA特有の「ハマりどころ」を回避する知見がギュッと詰まっています。いくつか重要なポイントを解説しますね。
① 削除と作成の順序(依存関係の罠)
ViewはTableやFilterを参照しています。そのため、もしビューを消さずに中のテーブルやフィルタを先に削除しようとすると、Projectは「おいおい、今使ってるパーツを勝手に壊すなよ!」と怒ってエラーを吐きます。
コード内でフィルタやテーブルを再作成する際、同名のものがすでにある場合は一度削除してから作り直していますが、「ビュー ➔ テーブル ➔ フィルタ」の順で依存関係があることを常に意識してください。
② `ViewApplyEx` メソッドの優しさ
古いマニュアルやリファレンスを見ると `ViewApply` というメソッドがよく使われています。しかし、実務の現場では新しい `ViewApplyEx` を使うのがモダンな作法です。
Excelの `Activate` と同様に、画面の表示をガッツリ切り替えてくれるため、ユーザーが「今、どの状態にあるのか」を目で見て直感的に理解できるようになります。
③ 「名前」の重複に注意
Projectのオブジェクト(View, Table, Filter)は、名前で管理されます。もし手動ですでに同名のビューを作っていたりすると、VBAが「あれ、どっちを指せばいいの?」と混乱します。
実務で運用する際は、冒頭のように `On Error Resume Next` をうまく活用して、古いものをクリーンアップしてから新規作成するロジック(あるいは存在チェックをして上書きするロジック)を必ず組み込むようにしましょう。
—
まとめ:ここをクリアすれば、Project VBAは怖くない!
いかがでしたか?今回は「カスタムビューの動的生成と切り替え」という、少し踏み込んだテーマを解説しました。
- View・Table・Filterの3つが連動していること
- 依存関係を意識した削除・作成のライフサイクル管理
- `ViewApplyEx` による画面の動的切り替え
ここさえ押さえておけば、マクロの記録の枠を遥かに超えて、あなた好みのスマートなプロジェクト管理システムを構築できるようになります。
「ここがちょっと分かりにくかった」「こういう応用はできる?」といった疑問があれば、いつでも気軽にコメントや質問を投げてくださいね。あなたのVBAライフを、私はいつでも応援しています。それでは、次のステップへ進みましょう!
