Project VBAの深淵へ:動的な「グループ化」でリソースの真実を可視化せよ
こんにちは。現場の最前線でProject VBAと格闘し続けてきたアーキテクトです。
「マクロの記録」ボタンを押して生成されたコードを眺め、その冗長さに絶望したことはありませんか? Project VBAは、Excel VBAとは少し毛色が違います。オブジェクト同士の親子関係が非常に厳格であり、一度その構造を理解してしまえば、プロジェクト管理という複雑怪奇な迷宮を自在に操る強力な武器になります。
今回は、標準の「リソース使用状況」ビューでは見えない「部署×スキル」といった多角的な切り口を、VBAで動的に構築する手法を伝授します。ここをマスターすれば、あなたはもう「ただの操作者」ではなく「プロジェクトの設計者」です。
—
1. Project VBAの核心:オブジェクトの階層を理解する
Project VBAを操る上で、以下の階層構造は心臓部です。
- Application: 全てを統括する親。
- Project: 開いているプロジェクトファイルそのもの。
- Task / Resource: プロジェクトを構成する最小単位。
- Group / GroupCriterion: 今回の主役。データの見せ方を定義する設計図。
特に重要なのが「Group」オブジェクトです。これは、UI上の「グループ化」設定をプログラムから制御するためのインターフェースです。「Group(グループ全体)」の中に「GroupCriterion(グループの条件)」というパーツを組み込むという構造をイメージしてください。
—
2. 独自のグループ化を動的に生成するコード
では、実際に「部署」と「スキル」でリソースをグループ化するスクリプトを見てみましょう。このコードは、既存のグループ設定を上書き、あるいは新規作成します。
Sub CreateDynamicResourceGroup()
Dim proj As Project
Dim grp As Group
Set proj = ActiveProject
‘ 1. 既存のグループ定義をクリアして新しく作成
‘ Nameは識別子。既に存在する場合のハンドリングは実戦では必須です
On Error Resume Next
Set grp = proj.ResourceGroups.Add(“部署×スキル分析”)
On Error GoTo 0
‘ 2. グループ設定を初期化(クリーンな状態から構築する)
grp.GroupCriteria.Clear
‘ 3. 第1階層:部署でグループ化 (FieldID: pjResourceGroup)
‘ Ascending:=Trueで昇順に。
grp.GroupCriteria.Add FieldName:=”グループ”, Ascending:=True, _
FontColor:=pjBlue, CellColor:=pjGray, _
GroupOn:=pjGroupOnEachValue
‘ 4. 第2階層:スキルでグループ化 (例: テキスト1フィールドをスキルとして利用)
‘ 階層構造を作ることで、ドリルダウン可能なビューになります
grp.GroupCriteria.Add FieldName:=”テキスト1″, Ascending:=True, _
FontColor:=pjBlack, CellColor:=pjLightGray, _
GroupOn:=pjGroupOnEachValue
‘ 5. ビューを適用して可視化
‘ これを実行すると、画面が一気に整理されます
ViewApply Name:=”リソース使用状況”, OutlineCode:=”部署×スキル分析”
MsgBox “独自のグループ化設定を適用しました。リソース負荷の可視化完了です。”
End Sub
—
3. ここがハマりどころ!エンジニアの知見
このコードを書く際、初学者が陥りやすい「罠」があります。
① フィールドの指定ミス
`FieldName` に指定する文字列は、プロジェクト設定の「ユーザー設定フィールド」と完全に一致している必要があります。もし「テキスト1」の名前を「スキル」に変更しているなら、コード側もそれに合わせるか、あるいは `FieldID` を使って一意に指定する癖をつけましょう。
② 既存のグループ名と衝突する
`proj.ResourceGroups.Add` は、同じ名前のグループが既に存在するとエラーを吐きます。実務では必ず `On Error Resume Next` で捕捉するか、事前に削除するロジックを挟むのがプロの流儀です。
③ 「GroupOn」の概念
`GroupOn` は「どの単位でまとめるか」を指定します。日付なら `pjGroupOnEachMonth` なども選べますが、リソース属性なら `pjGroupOnEachValue`(値が同じものをまとめる)が基本です。
—
4. 最後に:なぜ「動的」にするのか
なぜわざわざVBAでやるのか? それは、プロジェクトの規模が大きくなればなるほど、「その時々で見たい切り口」が変化するからです。
ある時は「部署別」に、ある時は「習熟度別」に。標準機能のGUIをポチポチ操作して設定を変更するのは、時間の浪費です。VBAでコード化しておけば、ボタン一つで「意思決定に必要なビュー」を呼び出せます。
このコードを土台に、`FieldID` を変えたり、`FontColor` でアラート表示をさせたりと、自分なりのカスタマイズを加えてみてください。
Project VBAの習得は、単なる自動化の手段ではありません。プロジェクトという複雑な生き物を、あなたの意のままに操るための「視座」を獲得することなのです。
さあ、次はどんなビューを創り出しますか? 次回の記事では、このグループ化を応用した「負荷オーバーリソースの自動抽出」についてお話ししましょう。
