【Project VBA極意】ベースライン設定時の「UIロック」戦略:誤操作を物理的に排除する設計論
プロジェクトマネージャーやPMOがVBAで業務効率化ツールを構築する際、最大の敵は「ヒューマンエラー」です。特に、プロジェクトの命運を分ける「ベースライン設定」において、ユーザーが誤ったタスクを選択したまま実行ボタンを押す事故は、データの整合性を根底から破壊します。
中級者から一歩先へ進むには、「操作を制限する」のではなく「UIを制御して選択肢を物理的に絞り込む」という設計思想が必要です。本記事では、ベースライン設定時に特定のタスクのみを表示させ、誤操作をシステム的に無効化するプロフェッショナルな手法を伝授します。
—
1. なぜ「実行時のみフィルタ」が必要なのか
多くの開発者が陥るのが、「選択されているタスクをVBAで判定し、条件に合致しなければエラーを出す」という後追い処理です。これは設計としては「甘い」。ユーザーはエラーメッセージを読み飛ばし、何度も同じミスを繰り返します。
真の自動化エンジニアは、「間違った操作をさせない環境(UI)」を動的に生成します。ベースライン設定時には、対象外のタスクを自動的に非表示(フィルタ)にし、ユーザーが選択できる範囲を強制的に絞り込むべきです。
—
2. 堅牢な実装:`AutoFilter`と`View`の制御
MS ProjectのVBAにおいて、Viewの制御は安定性の要です。単にフィルタをかけるだけでなく、ビューの切り替えや再描画制御を組み合わせることで、動作の軽快さと堅牢性を両立させます。
プロダクションコード例
このコードは、ベースライン対象外のタスクを非表示にし、ユーザーが「設定すべき対象」しか選べない状態を作り出すテンプレートです。
‘ =================================================================
‘ 機能: ベースライン設定用UIフィルタリング
‘ 概要: 指定されたフラグ以外のタスクを非表示にし、誤操作を防止する
‘ =================================================================
Public Sub PrepareBaselineUI()
Dim prj As Project
Set prj = ActiveProject
‘ 画面描画の停止(パフォーマンス向上の鉄則)
Application.ScreenUpdating = False
On Error GoTo Cleanup
‘ 1. 現在のビューを「ガントチャート」へ強制固定(整合性維持)
ViewApply Name:=”&Gantt Chart”
‘ 2. フィルタの適用(「ベースライン設定対象」というカスタムフラグ等の利用を想定)
‘ ※今回は「Flag1がYesのタスクのみ表示」するフィルタを動的に作成・適用
FilterEdit Name:=”BaselineTargetOnly”, TaskFilter:=True, Create:=True, _
FieldName:=”Flag1″, Test:=”equals”, Value:=”Yes”, ShowInMenu:=False
FilterApply Name:=”BaselineTargetOnly”
‘ 3. ユーザーへの通知
MsgBox “ベースライン設定モードに入りました。” & vbCrLf & _
“表示されているタスクのみが設定対象です。”, vbInformation
Cleanup:
Application.ScreenUpdating = True
If Err.Number <> 0 Then MsgBox “エラーが発生しました: ” & Err.Description
End Sub
‘ 戻す時の処理(必須)
Public Sub RestoreFullView()
FilterApply Name:=”All Tasks”
ViewApply Name:=”&Gantt Chart”
End Sub
—
3. 開発現場で陥りやすい「3つの落とし穴」
この実装を行う際、以下の点に注意してください。これらを無視すると、ツールは「動くが使えない」ものになります。
- Viewの永続的な書き換え: `FilterEdit`で作成したフィルタは、ファイル内に残ります。ツール終了時にクリーンアップするか、`ShowInMenu:=False`でUIを汚さない工夫が不可欠です。
- 画面更新の制御: `Application.ScreenUpdating = False`を忘れると、タスクが次々と消える様子がユーザーに見えてしまい、ツールが不安定な印象を与えます。必ずエラーハンドリングとセットで実装してください。
- 例外処理の欠如: プロジェクトが保護されている場合や、カスタムフィールドが定義されていない場合、上記コードはクラッシュします。`On Error`でのガードは「おまじない」ではなく、「実装の責務」です。
—
4. チーフアーキテクトからの助言
今回紹介した手法は、単なる「タスクの絞り込み」ではありません。「ユーザーの視覚情報からノイズを排除し、判断の余地を奪う」という心理学的アプローチを含んだUI制御です。
自動化ツールを作る際は、「いかに機能を詰め込むか」ではなく、「いかにユーザーが間違える可能性をゼロにするか」を突き詰めてください。それが、大規模開発プロジェクトにおけるVBAエンジニアの真価です。
次回の実装では、このフィルタリング状態を「一時的なスナップショット」として保存し、設定完了後に元のビューへ完全に復帰させる機能を追加してみることをお勧めします。
—
エンジニアとしての矜持:
コードは書くことよりも、誰が使っても壊れないように「囲い込む」ことの方が遥かに重要です。あなたのツールが、プロジェクトの品質を支える強固な基盤となることを期待しています。
