【実務・中級編】【初心者向け】特定のキーワードを含むタスクを一括検索し、色付けやフラグ立てを行うタスク走査の基本 – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握する極限の知見:特定のキーワードを含むタスクを一括走査し、視覚化する堅牢な実装手法

開発現場において、Microsoft Project(以下、MS Project)のWBS(Work Breakdown Structure)が数千行規模に肥大化したとき、特定のキーワード(例えば「要件定義」「API連携」「未確定」など)が含まれるタスクを目視で探し出すのは、エンジニアの貴重な時間を無駄に削る悪しき慣習でしかない。

業務自動化ツールを任されたエンジニアであれば、この非効率な手作業をVBA(Visual Basic for Applications)によって一撃で解決するべきだ。

しかし、単に「`ActiveProject.Tasks`を`For Each`で回して色を塗るだけ」のコードを書いて満足してはならない。MS Projectのオブジェクトモデルの特性、特に「タスクが削除された際のインデックスのずれ」「パフォーマンスを著しく低下させる画面描画の罠」「Null値やNothingに対する防衛的プログラミング」を理解していなければ、実務で耐えうる堅牢なツールとは言えない。

今回は、Project VBAのライフサイクルを知り尽くしたチーフアーキテクトの視点から、特定のキーワードを持つタスクを高速かつ安全に走査し、フラグ立てとカラーリングを行うプロダクションコードを伝授する。

—

1. なぜ「力技のループ」は実務で破綻するのか?

初心者が書くVBAコードの多くは、次のような構造をしている。

‘ 【アンチパターン】これでは実務で使い物にならない
Sub BadExample()
Dim t As Task
For Each t In ActiveProject.Tasks
If InStr(t.Name, “要件定義”) > 0 Then
t.ForeColor = pjRed
t.Flag1 = True
End If
Next t
End Sub

このコードには、実務開発の現場においては看過できない致命的な欠陥がいくつか存在する。

1. 画面描画(ScreenUpdating)の制御がない
MS Projectは、タスクのプロパティ(色やフラグ)が変更されるたびに内部のガントチャートやタイムラインを再描画しようとする。数千件のタスクに対してこれを実行すると、処理が異次元に遅くなり、最悪の場合はフリーズする。
2. 削除されたタスクやサマリータスクへの配慮不足
`Tasks`コレクションには、既に削除されたタスクの空きスロットや、プロジェクトサマリータスクが含まれる場合がある。これらを適切にハンドリングしないと、予期せぬ実行時エラーを引き起こす。
3. 大文字・小文字の区別とあいまい検索の欠如
実務のWBSでは、「要件定義」「要件定義書」「req」など、表記揺れが発生する。`InStr`のデフォルト動作(バイナリ比較)では、これを取りこぼす。

これらをすべてクリアし、実戦投入に耐えうる堅牢なアーキテクチャを構築する。

—

2. プロダクションコード:堅牢なタスク走査・視覚化テンプレート

以下のコードは、指定したキーワードをあいまい検索し、該当タスクのフォントカラー変更とフラグ(Flag1)の立て込みを、高速かつ安全に行うための完全版モジュールである。

Option Explicit

‘ ==============================================================================
‘ 処理名 : HighlightAndFlagTasksByKeyword
‘ 概要 : 指定したキーワードを含むタスクを検索し、色付けとフラグ設定を行う
‘ 備考 : パフォーマンス最適化および防衛的プログラミングを実装した決定版
‘ ==============================================================================
Public Sub HighlightAndFlagTasksByKeyword()
‘ 定数の定義
Const TARGET_KEYWORD As String = “要件定義”
Const HIGHLIGHT_COLOR As Long = RGB(255, 0, 0) ‘ 赤色

‘ オブジェクト変数の宣言
Dim targetProj As Project
Set targetProj = ActiveProject

‘ ガード節:プロジェクトが開かれていない、またはタスクが存在しない場合
If targetProj Is Nothing Then
MsgBox “アクティブなプロジェクトが存在しません。”, vbCritical, “エラー”
Exit Sub
End If

If targetProj.Tasks.Count = 0 Then
MsgBox “タスクが登録されていません。”, vbExclamation, “通知”
Exit Sub
End If

‘ 【極重要】パフォーマンス最適化:画面描画と自動再計算を停止
‘ これにより処理速度が数十倍〜数百倍に跳ね上がります
Dim originalScreenUpdating As Boolean
originalScreenUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False

On Error GoTo ErrorHandler

Dim t As Task
Dim matchCount As Long
matchCount = 0

‘ ループ処理の実行
For Each t In targetProj.Tasks
‘ 1. Nothing判定(メモリ上の空きスロット対策)
If Not t Is Nothing Then
‘ 2. サマリータスク(親タスク)を除外したい場合はここで制御可能(今回は対象に含める)
‘ 3. プレースホルダー(ID=0や空行)の除外
If t.ID > 0 And t.Name <> “” Then

‘ 4. 比較(vbTextCompareを指定することで大文字・小文字を区別しない)
If InStr(1, t.Name, TARGET_KEYWORD, vbTextCompare) > 0 Then

‘ 視覚的強調(フォントカラーの変更)
t.ForeColor = HIGHLIGHT_COLOR

‘ 業務ロジック:フラグフィールド(Flag1)をTrueに設定
t.Flag1 = True

‘ 抽出ログ用カウンター
matchCount = matchCount + 1
End If
End If
End If
Next t

‘ 終了処理
Application.ScreenUpdating = originalScreenUpdating

‘ 完了通知
MsgBox “タスクの走査が完了しました。” & vbCrLf & _
“キーワード [” & TARGET_KEYWORD & “] に一致するタスク数: ” & matchCount & ” 件”, _
vbInformation, “処理成功”
Exit Sub

ErrorHandler:
‘ 異常終了時も必ず描画フラグを元に戻す(無限フリーズを防ぐ防壁)
Application.ScreenUpdating = originalScreenUpdating
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error: ” & Err.Description, vbCritical, “システムエラー”
End Sub

—

3. チーフアーキテクトが解説する実装の急所

このコードが「なぜプロフェッショナル仕様なのか」、その設計思想を紐解く。

① `Application.ScreenUpdating = False` の絶対性

MS ProjectのVBAにおいて、UIを更新しながらデータを操作する愚は万死に値する。数千行のWBSに対して`t.ForeColor`を書き換えるたびに、UIのスレッドがブロックされる。冒頭で描画を切り、最後に復元する(しかも`On Error`の例外パスでも確実に復元させる)アプローチは、大規模案件における必須の作法である。

② `Not t Is Nothing` と `t.ID > 0` による防衛網

MS Projectの`Tasks`コレクションは、配列のような連続したメモリ空間ではない。タスクの削除・挿入の歴史的背景から、内部的にポインタが`Nothing`を指すケースや、プロジェクトサマリー(ID=0)が混入する。ここを弾かずにプロパティ(`Name`やキスト等)にアクセスした瞬間、エラー 91(オブジェクト変数が設定されていません)が爆誕する。この堅牢なガード節がシステムを守る。

③ メンテナンス性を高める定数化と大文字小文字の吸収

検索キーワードをコード内にハードコーディングせず、定数(`Const`)として上部に集約している。また、`InStr`の第4引数に`vbTextCompare`を指定することで、ユーザーが「Requirements」と入力しようが「requirements」と入力しようが、確実にあらゆる表記揺れをキャッチできる設計にしている。

—

4. 応用へのステップ:データベースや外部ファイル連携へ

この「特定の条件でタスクを走査し、フラグを立てる」という基本パターンをマスターすれば、次は「Excelや外部データベース(SQL Server / SQLite等)との双方向同期」や「進捗遅延タスクの自動検知とTeams/SlackへのWebhook通知」といった、真の業務自動化領域へとステップアップできる。

外部ファイルから動的にキーワードリストを読み込ませ、それを配列としてメモリ上に展開し、`Tasks`コレクションに対して一括フィルタリングをかけるアーキテクチャに拡張するのもエンジニアとしての腕の見せ所だ。

退屈な手作業の繰り返しは、今日で終わりにしよう。
堅牢なコードを書き、プロジェクトマネジメントの本質である「課題のコントロール」にエンジニアのリソースを集中させることこそが、真の業務効率化である。

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