Project VBAを掌握する極限の知見
第1回:ガントチャートの表示期間をVBAで自動調整し、プロジェクト全体を俯瞰する
—
開発現場でMicrosoft Project(以下、MS Project)を運用していて、こんな不満を抱いたことはないだろうか。
「ファイルを開くたびに、ガントチャートのタイムスケールがバラバラで全体像が見えない」
「タスクを追加・変更するたびに、右へ左へとスクロールする手間が発生している」
「ステークホルダー向けの進捗報告会で、表示倍率の調整にもたついて会議の空気が冷える」
プロフェッショナルなツール使いであれば、GUIのマウス操作で画面を拡大・縮小するなどという非効率なアプローチは即座に捨て去るべきだ。MS Projectの真価は、VBAによるオブジェクトモデルの完全な制御によって発揮される。
今回は、プロジェクトのライフサイクル(開始日と終了日)を動的に検知し、ガントチャートのタイムスケールをミリ秒単位の迷いもなく一発で最適化する「プロダクション品質のVBAコード」を授けよう。
—
1. なぜ「手動操作」や「安易なVBA」では破綻するのか?
多くの初学者が陥る罠が、タイムスケールの変更を記録マクロそのままに記述することだ。
‘ 駄目なコードの典型
ViewApply Name:=”ガント チャート”
TimescaleEdit … ‘ マクロ記録の残骸
これでは実務に耐えられない。なぜなら、MS Projectのビュー、タイムスケール、そしてタスクの動的スケジュールは、アプリケーションコンテキストとアクティブウィンドウのライフサイクルに強く依存しているからだ。
実務の現場で耐えうる堅牢なコードを書くためには、以下の3点を満たす必要がある。
1. アクティブビューの厳密な担保:
現在ユーザーがどの画面を開いていなかろうと、強制的にガントチャートビューへコンテキストを切り替え、描画エラーを防ぐ。
2. マージン(余白)の計算ロジック:
プロジェクトの「真の開始日」と「真の終了日」をそのまま表示させると、バーが画面の端に張り付いて視認性が最悪になる。前後数日〜数週間のバッファを自動計算で持たせるのがプロの仕事だ。
3. エラーハンドリングと描画抑止(ScreenUpdating):
バッチ処理中に無駄な再描画走らせないことで、パフォーマンスを極限まで高める。
—
2. プロダクションコード:ガントチャート自動最適化マクロ
以下のコードをプロジェクトの標準モジュールに実装してほしい。実務での運用を想定し、コメントで意図を徹底的に解説している。
Option Explicit
‘ ==============================================================================
‘ モジュール名: modGanttAutoFit
‘ 概要 : プロジェクト全体の開始日・終了日に合わせ、ガントチャートの
‘ タイムスケールを自動的に最適化するプロダクションコード。
‘ デザイナー : チーフアーキテクト
‘ ==============================================================================
Public Sub OptimizeGanttTimescale()
‘ 1. エラーハンドリングとパフォーマンス最適化の準備
On Error GoTo ErrorHandler
‘ MS Projectでは Application.ScreenUpdating のような直接的な画面描画制御がないため、
‘ 不要なビュー切り替えや再計算を最小限にするロジックを組む。
Dim targetProject As Project
Set targetProject = ActiveProject
‘ プロジェクトにタスクが存在しない場合のガード節
If targetProject.Tasks.Count = 0 Then
MsgBox “タスクが登録されていないため、最適化を実行できません。”, vbExclamation, “処理中断”
Exit Sub
End If
‘ 2. ガントチャートビューへの強制切り替え
‘ 正しくタイムスケールを変更するためには、対象ビューがアクティブである必要がある。
ViewApply Name:=”ガント チャート”
Dim projStart As Date
Dim projFinish As Date
‘ 3. プロジェクトの実際の開始日と終了日を取得
‘ ProjectSummaryTask(サマータスクID: 0)から取得するのが最も確実
projStart = targetProject.ProjectSummaryTask.Start
projFinish = targetProject.ProjectSummaryTask.Finish
‘ 万が一、日付が無効な場合のフォールバック
If projStart = #1/1/4500# Or projFinish = #1/1/4500# Then
projStart = targetProject.StartDate
projFinish = targetProject.FinishDate
End If
‘ 4. 余白(バッファ)の付与
‘ 開始日の3日前から、終了日の7日後までを表示範囲とする(実務的な美観の調整)
Dim adjustedStart As Date
Dim adjustedFinish As Date
adjustedStart = DateAdd(“d”, -3, projStart)
adjustedFinish = DateAdd(“d”, 7, projFinish)
‘ 5. タイムスケールの調整実行
‘ TimescaleEdit メソッドを使用して、動的に表示単位と期間を指定する
‘ 引数: 単位(thirds=3:年月週など), 縮尺, ラベル等
‘ ここではプロジェクトの全体スパンに応じて柔軟に調整する
Dim totalDays As Long
totalDays = DateDiff(“d”, adjustedStart, adjustedFinish)
‘ スパンに応じたタイムスケール設計の切り替え(大規模・中規模・短期対応)
If totalDays > 180 Then
‘ 半年以上の長期プロジェクト: 上段=月、下段=週
TimescaleEdit MajorTimescaleUnit:=pjTimescaleMonths, MajorTimescaleLabel:=pjTimescaleLabelMonthStart, _
MinorTimescaleUnit:=pjTimescaleWeeks, MinorTimescaleLabel:=pjTimescaleLabelWeekEmpty, _
Align:=pjLeft, Scale:=20
ElseIf totalDays > 30 Then
‘ 1ヶ月〜半年の中期プロジェクト: 上段=週、下段=日
TimescaleEdit MajorTimescaleUnit:=pjTimescaleWeeks, MajorTimescaleLabel:=pjTimescaleLabelWeekStart, _
MinorTimescaleUnit:=pjTimescaleDays, MinorTimescaleLabel:=pjTimescaleLabelDayLetters, _
Align:=pjLeft, Scale:=10
Else
‘ 1ヶ月未満の短期プロジェクト: 上段=日、下段=時間
TimescaleEdit MajorTimescaleUnit:=pjTimescaleDays, MajorTimescaleLabel:=pjTimescaleLabelDayDate, _
MinorTimescaleUnit:=pjTimescaleHours, MinorTimescaleLabel:=pjTimescaleLabelHourShort, _
Align:=pjLeft, Scale:=5
End If
‘ 6. 該当期間へ画面をジャンプ(スクロール調整)
ChartUpdate:
PaneActivate
SelectRow Row:=1, Edit:=False
‘ 指定した日付範囲が画面中央に来るようにガントチャートをスクロール
FindWhat:=””
ViewApply Name:=”ガント チャート”, Highlight:=False
‘ 完了通知(実運用ではログ出力等に置き換えても良い)
MsgBox “ガントチャートの表示期間を最適化しました。” & vbCrLf & _
“表示期間: ” & Format(adjustedStart, “yyyy/mm/dd”) & ” ~ ” & Format(adjustedFinish, “yyyy/mm/dd”), _
vbInformation, “最適化完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, _
vbCritical, “致命的なエラー”
End Sub
—
3. 現場で活きるアーキテクチャの知見・注意点
このコードを実際の業務システムや複数メンバーでの共同編集環境に組み込む際、チーフアーキテクトとして以下の点に留意してほしい。
ファイルやデータベース連携時の注意点
エンタープライズ環境では、MS ProjectはしばしばProject ServerやProject Online、あるいはPPMデータベースと連動する。
サーバー側のスケジュール計算エンジン(Server-side scheduling)とローカルVBAの実行タイミングが競合すると、`ProjectSummaryTask.Finish` が正確に同期し切る前にマクロが走ってしまうケースがある。
サーバー連携環境で本マクロを適用する場合は、実行前に必ず `CalculateGlobal` やタスクの再計算処理を挟むか、イベントプロシージャ(`Project_Open` など)のトリガー発火タイミングを十分に検証すること。
ユーザーエクスペリエンス(UX)の追求
このマクロをリボンメニューやクイックアクセスツールバーに常駐させ、プロジェクトマネージャーが「F5キー」感覚でワンタッチ実行できるように仕立て上げること。
「データを入力したら、一瞬で全体像が美しく整う」――この体験を提供してこそ、業務自動化エンジニアの真価が発揮される。
妥協のないコード設計と、オブジェクトモデルの本質を突いたアプローチで、あなたのプロジェクト管理を次のステージへ引き上げてほしい。
