【テクニカル・上級編】【中級者向け】ベースライン設定時に、設定対象外のタスクを自動的に「非表示」にして誤操作を防ぐUI制御 – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵:ベースライン設定における「UIセーフティ」とメモリ制御の極意

Project VBA(Microsoft Project Object Model)を扱っていると、往々にして遭遇する壁がある。それは「ユーザーインターフェース(UI)の曖昧さ」だ。特にベースラインの設定という、プロジェクトの命運を分かつクリティカルな操作において、ユーザーの誤操作を許容する余地はない。

今回は、ベースライン設定時に「設定対象外」のタスクを動的にフィルタリングし、視覚的なノイズを遮断することで、ヒューマンエラーを物理的に排除するアーキテクチャを解説する。

1. なぜ「ビュー制御」なのか:UIの制約とリスク

Projectにおけるベースライン設定は、単なるデータ書き込みではない。それはプロジェクトの「現在地」を固定する行為だ。ここでユーザーが不用意なタスクを選択していた場合、予期せぬスコープの固定が行われ、後々の進捗管理が破綻する。

我々エンジニアがすべきことは、ダイアログを表示する前に、「操作可能な対象物だけを視界に残す」という環境構築だ。これには、MS Projectのビュー・フィルタ・オブジェクトを精緻に操作する必要がある。

2. 実装の設計指針:ライフサイクルとパフォーマンス

この処理において、以下の3つの鉄則を守る必要がある。

1. オブジェクトの明示的解放: `ActiveProject` や `View` などの参照を保持したままにしない。メモリリークはProjectの動作を不安定にし、最悪の場合、データ不整合を招く。
2. イベントの抑制: ビューの切り替え時に発生する不要なイベント(`Project_BeforeTaskChange`等)を一時的に無効化し、処理速度と安定性を確保する。
3. 状態の復元: フィルタリング後は、必ず元のビュー状態へ復元する「ロールバック機構」を組み込むこと。

3. 実装:Safety Baseline Controller

以下のコードは、対象外タスクをフィルタで隠蔽し、安全にベースライン設定へ誘導する最小構成のロジックである。

Option Explicit

‘ 伝説的なチーフアーキテクトによる、セーフティ・ベースライン制御モジュール
Public Sub SecureBaselineSetup()
Dim prj As Project
Set prj = ActiveProject

‘ 1. エラーハンドリングと環境保護(イベント抑制)
On Error GoTo Cleanup
Application.EnableEvents = False

‘ 2. 現在のビューを保存(復元用)
Dim originalView As String
originalView = prj.CurrentView

‘ 3. フィルタ定義:カスタムフィルタを動的に適用
‘ ここでは「アクティブかつマイルストーンではないタスク」のみに絞り込む例
‘ 実際にはプロジェクト固有の「管理対象フラグ」等を用いるのがベストである
FilterApply Name:=”&All Tasks” ‘ 一度リセット
FilterEdit Name:=”SafetyFilter”, TaskFilter:=True, Create:=True, OverwriteExisting:=True, _
FieldName:=”Flag1″, Test:=”equals”, Value:=”Yes”
FilterApply Name:=”SafetyFilter”

‘ 4. ここでユーザーにベースライン設定を促す
MsgBox “フィルタリングが完了しました。対象タスクのみが表示されています。” & vbCrLf & _
“この状態でベースライン設定を行ってください。”, vbInformation

‘ ベースライン設定ダイアログを呼び出す(SendKeysは推奨されないが、APIが提供されない場合の最終手段)
‘ 理想的にはカスタムフォームでパラメータを取得し、BaselineSaveメソッドを使用する

Cleanup:
‘ 5. 状態の復元とオブジェクト解放
FilterApply Name:=”&All Tasks”
ViewApply Name:=originalView
Application.EnableEvents = True

‘ オブジェクトの明示的解放
Set prj = Nothing

If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub

4. プロフェッショナルのための深掘り:Windows APIによる制御

もし、より高度な「ウィンドウのロック」を要求されるなら、`User32.dll` を利用し、MS Projectのメインウィンドウを一時的に「入力不可」にするアプローチも存在する。

`EnableWindow` APIを用いることで、ベースライン設定ダイアログが開いている間、背後のメインウィンドウの操作を物理的に遮断できる。

If VBA7 Then
Private Declare PtrSafe Function EnableWindow Lib “user32” (ByVal hwnd As LongPtr, ByVal fEnable As Long) As Long
Else
Private Declare Function EnableWindow Lib “user32” (ByVal hwnd As Long, ByVal fEnable As Long) As Long
End If

‘ 呼び出し例:
‘ EnableWindow(Application.hWnd, 0) ‘ メインウィンドウを無効化
‘ … ダイアログ表示処理 …
‘ EnableWindow(Application.hWnd, 1) ‘ メインウィンドウを有効化

5. 結びに代えて:アーキテクトの矜持

VBAはレガシーと言われることもあるが、Projectの深層を操るには、依然として最も強力な武器だ。重要なのは「動けばいい」という考えを捨てること。

今回解説した「ビュー制御によるUIセーフティ」は、単なる機能追加ではない。システムを利用する現場の担当者が、無意識のうちに「正しい操作」しか選べないように導く、UI/UXの防衛的プログラミングなのだ。

技術の細部に宿る魂を忘れるな。それが、世界最高峰の自動化エンジニアとしての最低条件だ。

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