【入門編】【実務中級】Projectの「ガントチャート」の表示期間をVBAで自動調整し、プロジェクト全体を俯瞰する – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で、MS Projectのガントチャートを見ながら「あぁ、右端が切れちゃってるな」「期間が短すぎてスケジュール全体が見づらい…」と、毎回マウスでタイムスケールをカチカチ調整していませんか?

マクロの記録ボタンを押して一生懸命コードを作ってみたものの、いざ動かしてみたらエラーの嵐……。そんな経験はありませんか?

大丈夫。ここをクリアすれば、あなたももう「マクロの記録に頼る初心者」ではありません。今日は、Project VBAの核心に迫りながら、プロジェクトの開始日と終了日に合わせてガントチャートの表示期間を美しく自動最適化する、実務直結のテクニックを伝授します。

プロの知見をたっぷり詰め込んで優しく解説するので、一緒にマスターしていきましょう!

なぜ、ガントチャートの自動調整が必要なのか?

MS Projectを実務で使っていると、こんなイライラを感じたことはありませんか?

  • プロジェクトの全体像を把握したいのに、タイムスケールが細かすぎてスクロールしないと全体が見えない。
  • 逆に、数日間のタスクを見るために数年分のタイムスケールが表示されてしまい、バーが米粒のように小さくなる。

これを人間の手で毎回「表示」タブから調整するのは、エンジニアの仕事ではありません。「VBAに一瞬で計算させ、最適なビューをレンダリングさせる」。これが、業務自動化のプロのアプローチです。

Projectオブジェクトモデルの基礎知識

まず、Excel VBAとMS Project VBAの決定的な違いを押さえましょう。
Excelの主役が「Range(セル)」なら、Projectの主役は「Project(プロジェクト)」「Task(タスク)」です。

今回操作するのは、画面上のタイムスケール(表示期間)。これを司るのが、MS Projectの強力なメソッドである `TimescaleEdit` です。

しかし、ただメソッドを叩くだけでは動きません。「プロジェクト全体の『始まり』と『終わり』の正確な日付を拾い、それに少しだけマージン(余裕)を持たせてタイムスケールに教え込む」というロジックが必要になります。

実装コード:ガントチャート自動調整マクロ

それでは、開発環境(VBAエディタ:`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてください。実務でそのまま使えるように、細かくコメントを入れています。

‘ ==============================================================================
‘ 【マクロ名】OptimizeGanttTimescale
‘ 【概要】プロジェクト全体の開始日と終了日を算出し、ガントチャートの
‘ タイムスケールを美しく自動最適化する
‘ ==============================================================================
Sub OptimizeGanttTimescale()
Dim prj As Project
Dim dStart As Date
Dim dFinish As Date
Dim t As Task

‘ アクティブなプロジェクトを取得
Set prj = ActiveProject

‘ エラーハンドリング:タスクが1つもない場合は処理を中断
If prj.Tasks.Count = 0 Then
MsgBox “プロジェクトにタスクが登録されていません。”, vbExclamation, “処理中断”
Exit Sub
End If

‘ 初期値を設定
dStart = #12/31/2099#
dFinish = #1/1/1900#

‘ 【重要】プロジェクト内の全タスクを走査し、真の「最早期開始日」と「最晩期終了日」を特定する
‘ ※ summaryタスクやマイルストーンも含めた全体の境界を正確に捉えるため
For Each t in prj.Tasks
‘ ヌルタスク(削除された行など)をスキップ
If Not t Is Nothing Then
‘ 概要タスクや有効なタスクのみを対象にする場合などの条件をここに挟むことも可能
If t.Start < dStart Then dStart = t.Start If t.Finish > dFinish Then dFinish = t.Finish
End If
Next t

‘ 万が一、日付が正しく取得できなかった場合の安全策
If dStart >= dFinish Then
MsgBox “有効なスケジュール期間が検出されませんでした。”, vbCritical, “エラー”
Exit Sub
End If

‘ 【プロの技】開始日の「3日前」、終了日の「3日後」にマージンを持たせることで、
‘ ガントチャートのバーが端っこに張り付くのを防ぎ、視認性を劇的に向上させる
dStart = DateAdd(“d”, -3, dStart)
dFinish = DateAdd(“d”, 3, dFinish)

‘ 画面の更新を一時停止(描画速度の向上とチラつき防止)
ScreenUpdating True ‘ 動作確認のためあえてTrueにしていますが、大規模PJではFalse推奨

‘ ガントチャートビューに切り替え(対象ビューが存在することを確認)
ViewApply Name:=”ガント チャート”

‘ タイムスケールを自動調整するメソッドを実行
‘ スタート日とフィニッシュ日を指定し、単位を「日 (TimescaleUnit_Days)」に設定
On Error Resume Next
TimescaleEdit StartDate:=dStart, EndDate:=dFinish, MajorScale:=pjTimescaleWeeks, MinorScale:=pjTimescaleDays

If Err.Number <> 0 Then
MsgBox “タイムスケールの調整中にエラーが発生しました: ” & Err.Description, vbCritical
Err.Clear
Else
MsgBox “ガントチャートの表示期間を最適化しました!” & vbCrLf & _
“表示期間: ” & Format(dStart, “yyyy/mm/dd”) & ” ~ ” & Format(dFinish, “yyyy/mm/dd”), _
vbInformation, “完了”
End If
On Error GoTo 0

End Sub

コードの注目ポイント・初心者がつまずきやすい罠

1. なぜわざわざループで日付を探すのか?

`ActiveProject.ProjectStart` や `ProjectFinish` といったプロパティもありますが、これらはプロジェクトサマリータスクの設定や手動入力に依存するため、実際のタスクの動きとズレることが多々あります。
ループを回して全タスクの `Start` と `Finish` を比較・抽出するやり方は、「予期せぬズレを防ぐための実務上の防衛策」です。

2. マージン(余白)の重要性

デザインの基本ですが、画面の端ギリギリにスケジュールが表示されると非常に息苦しい印象を与えます。コード内の `DateAdd(“d”, -3, dStart)` で前後に3日間の呼吸スペース(マージン)を作っている点が、プロならではのこだわりです。

3. ビューのコンテキストエラー

Excelと違い、Project VBAは「今どの画面(ビュー)を開いているか」によって実行できるメソッドが制限されることがあります。`ViewApply` を使って確実に「ガント チャート」ビューにフォーカスを当ててから `TimescaleEdit` を叩くのが、エラーを回避する鉄則です。

まとめ:ここをクリアすればProject VBAは怖くない!

いかがでしたか?
「マクロの記録」では絶対に吐き出してくれない、実務で本当に必要とされるロジックの組み方が見えてきたのではないでしょうか。

プロジェクト管理において、「見やすい資料・見やすい画面」を素早く提供することは、プロジェクトマネージャーやエンジニアにとって強力な武器になります。この自動化スクリプトをあなたのツールボックスに加えれば、毎日の定型作業から解放されるはずです。

ここをクリアできれば、Project VBAの基本はもうバッチリです!
ぜひ自分の環境で試して、ワンランク上のオートメーションを体感してくださいね。それでは、次回の極限知見でお会いしましょう!

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