【実務・中級編】Projectのガントチャート表示をVBAで制御する:ビューの切り替えとフィルタリングの自動化 – Project VBA解析バイブル

スポンサーリンク

MS Project VBAの深淵:ビューとフィルタを支配し、レポーティングの自動化を極める

現場のプロジェクトマネージャーが最も時間を浪費している作業の一つ。それは「進捗会議のたびに、ガントチャートを整え、特定のタスクを抽出し、スクリーンショットを撮る」という泥臭いルーチンワークだ。

もし君が、手作業でビューを切り替え、手作業でフィルタを適用しているなら、今すぐその手を止めろ。MS Projectのオブジェクトモデルを正しく掌握すれば、その作業は「一瞬」で終わる。

今回は、Project VBAにおける「ビュー制御」と「フィルタリング」という、自動化の初歩にして最も強力な領域を、現場レベルの堅牢なコードとともに解説する。

—

1. なぜ「手作業」が害悪なのか:オブジェクトモデルの流儀

Project VBAで最も初心者が陥る罠は、「現在の選択状態(ActiveViewやActiveSelection)に依存したコード」を書いてしまうことだ。

GUI上の状態を追いかけるコードは不安定極まりない。ユーザーが誤って別のビューを開いていれば、即座にエラーの引き金となる。プロの設計においては、「どのビューに切り替えるか」「どのフィルタを適用するか」を明示的に指定し、実行後に「状態を退避・復元する」というライフサイクル管理が不可欠だ。

—

2. 堅牢な自動化を実現する実用コード

以下は、指定したビューへ切り替え、かつ特定のフィルタ(またはカスタムフィルタ)を適用する際のプロダクション仕様のコードだ。

‘ —————————————————————————
‘ プロシージャ名: ApplyReportView
‘ 概要: 指定したビューとフィルタを適用し、環境をクリーンに設定する
‘ —————————————————————————
Public Sub ApplyReportView(ByVal viewName As String, Optional ByVal filterName As String = “”)
On Error GoTo ErrorHandler

‘ 画面更新を停止(パフォーマンス向上とチラつき防止の定石)
Application.ScreenUpdating = False

‘ 1. ビューの切り替え
‘ ビューが存在しない場合に備え、エラーハンドリングを意識する
ViewApply Name:=viewName

‘ 2. フィルタの適用
If filterName <> “” Then
‘ フィルタ名が正しいかを確認するロジックを挟むのが理想的
FilterApply Name:=filterName
Else
‘ フィルタなしの場合は全表示へ
FilterApply Name:=”&All Tasks”
End If

‘ 3. ガントチャートの最適化(全体表示)
ZoomTimescale Entire:=True

Exit Sub

ErrorHandler:
MsgBox “ビューまたはフィルタの適用に失敗しました。” & vbCrLf & _
“エラー詳細: ” & Err.Description, vbCritical
Application.ScreenUpdating = True
End Sub

このコードが「現場の信頼」を勝ち取る理由

  • `ScreenUpdating = False`: 画面描画のオーバーヘッドを排除する。大規模プロジェクトほど、この一行の有無が実行時間に数秒の差を生む。
  • `Entire:=True`: フィルタ適用後にガントバーが見切れる現象を防ぐ。報告資料作成の際、この調整を手作業でやるのは時間の無駄だ。
  • エラーハンドリング: `ViewApply`や`FilterApply`は、設定名がタイポ一つで即座にクラッシュする。堅牢な設計では、`On Error`を駆使してユーザーに状況を伝える必要がある。

—

3. 業務自動化における「3つの鉄則」

現場で長く使われるツールを作るためには、コードの質以上に「設計思想」が重要だ。

① 状態(State)を汚すな

VBAを実行した後にビューが元に戻らないツールは、使用者にストレスを与える。理想は、処理の開始時に`ActiveView.Name`を保持しておき、処理終了時に元のビューへ戻す「復元処理」を組み込むことだ。

② フィルタのハードコードを避ける

フィルタ条件(例:「未完了かつ期限超過」など)をコード内に直接書くと、仕様変更時に地獄を見る。フィルタ名やビュー名は、隠しシート(設定用シート)に定義し、そこから読み込む形式にせよ。Excelと連携させるなら、この設定シートをExcel側に持たせるのが最も保守性が高い。

③ データベース連携の注意点

MS Projectのデータは、`Task`オブジェクトをループで回して抽出するよりも、`FilterApply`で絞り込んだ結果を`Copy`してExcelに貼り付ける方が、圧倒的に高速かつ安定する。オブジェクトを一つずつ参照してプロパティを読み込むのは、数千行を超えるプロジェクトでは「遅延」の原因となるからだ。

—

結論:自動化は「思考の質」である

ビューの切り替えを自動化する。それは単なる作業効率化ではない。「どの情報を、誰に、どう見せるべきか」というプロジェクトの可視化戦略を、コードという形に落とし込む行為だ。

今日から、GUIの操作をコードに置き換えろ。そして、浮いたその時間で、データそのものの分析に脳を使え。それが、本当の意味での「業務自動化エンジニア」の姿だ。

何か詰まったら、またここへ戻ってくるといい。君のプロジェクトが成功することを期待している。

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