【実務・中級編】【初心者向け】Project VBAで「イミディエイトウィンドウ」を使いこなすデバッグ術 – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握せよ:イミディエイトウィンドウこそが「最強のデバッグ兵器」である理由

君たちがProject VBAで何百行ものコードを書き、毎回「実行してはエラーで停止し、修正してまた実行する」という非効率な徒労を繰り返しているなら、今日でその悪癖を断ち切ってもらう。

Microsoft Projectのオブジェクトモデルは、Excelのそれとは一線を画すほど複雑だ。`Application`から`Project`、そしてネストされた`Task`や`Assignment`の階層構造を頭の中だけでトレースするのは不可能に近い。

「なぜバグるのか?」と悩む前に、「今、何が起きているのか?」を可視化せよ。
そのための唯一無二の武器が、イミディエイトウィンドウだ。

1. なぜ「ステップ実行」だけでは不十分なのか

初心者はブレークポイントを置いて一行ずつ追うことに固執する。だが、大規模なプロジェクト計画を扱うとき、そのアプローチは破滅を招く。

  • 状態の喪失: 100個のタスクがあるループで、特定の1つだけが異常値を持つ場合、全ループを止めて変数を覗くのは時間の浪費だ。
  • イベントの干渉: プロジェクトの計算エンジンが動いている最中にブレークポイントで止めると、予期せぬ再計算が走り、オブジェクトの状態が変わってしまうことがある。

イミディエイトウィンドウを活用した「ログ出力型デバッグ」は、プログラムを止めずに「Projectの今」を時系列で追いかけるための必須スキルである。

2. プロダクション品質のデバッグログ術

単に `Debug.Print` を使うのではない。どのタスクの、どのプロパティで、どんな値が弾かれたのか。後からログを追える「構造化された出力」を心がけるべきだ。

以下のコードは、タスクの階層を走査しながら、メモリ上の状態を安全に監視するためのテンプレートだ。

‘ ———————————————————
‘ 目的: タスク階層を安全に巡回し、イミディエイトウィンドウに状態を出力する
‘ 備考: 本番環境ではDebug.Printをラッパー関数に入れ、
‘ フラグ管理でON/OFFを切り替えられるようにせよ。
‘ ———————————————————
Public Sub DebugTaskHierarchy()
Dim tsk As Task
Dim proj As Project
Set proj = ActiveProject

Debug.Print “— [DEBUG START] Time: ” & Now & ” —”

For Each tsk In proj.Tasks
‘ Nothing判定は基本。Project VBAでは削除されたタスクが
‘ コレクションに残るケースがあるため必須
If Not tsk Is Nothing Then
‘ インデントをタスクレベルで可視化する
Dim indent As String
indent = Space(tsk.OutlineLevel 2)

‘ ID、名前、開始日を整形して出力
‘ 異常値があればここで即座に発見できる
Debug.Print indent & “ID:” & tsk.ID & ” | Name: ” & tsk.Name & _
” | Start: ” & tsk.Start & ” | %Complete: ” & tsk.PercentComplete

‘ 堅牢な設計: 異常な期間のタスクを検知してログに警告を出す
If tsk.Duration > 48000 Then ‘ 100日以上のタスクを異常と見なす例
Debug.Print ” [WARN] Task ” & tsk.ID & ” has abnormal duration.”
End If
End If
Next tsk

Debug.Print “— [DEBUG END] —”
End Sub

3. 開発現場で生き残るための「3つの鉄則」

① 「Nothing」を恐れろ

Projectのオブジェクトは、親が消えれば子も消える。ループ内でタスクを操作(削除や移動)する場合、必ず `If Not tsk Is Nothing` で生存確認を行え。イミディエイトウィンドウに `tsk.ID` が表示されない場合、それは既にオブジェクトがメモリから解放されている証拠だ。

② データベース/ファイル連携時の「同期の罠」

外部データ(ExcelやSQL Server)と同期させる際、`Task.UniqueID` を必ずキーにせよ。`Task.ID` は表示順序で変わるため、デバッグ時に「どのタスクとどのレコードが紐付いているか」を `Debug.Print` で出力し、IDの不一致をリアルタイムで監視することが、データ破損を防ぐ唯一の策だ。

③ インタラクティブな即時実行

イミディエイトウィンドウは単なる表示場所ではない。`? ActiveProject.Tasks(1).Start` と入力してEnterを押せば、コードを書かずにその瞬間の値を確認できる。
「コードを書いて実行」のサイクルを回すのではなく、「即時実行で確認してからコードを確定させる」。 これがプロの速度だ。

最後に:ツールを作るな、価値を設計せよ

君たちが書くVBAは、単なるマクロではない。プロジェクトの意思決定を支えるバックボーンだ。
デバッグとは、コードの誤りを直す作業ではない。「システムと現実のプロジェクト計画との間に生じている認識のズレ」を埋める作業である。

イミディエイトウィンドウを使いこなし、Projectの内部構造を完全に掌握せよ。
それができたとき、君のコードはただ動くだけのものではなく、誰にとっても保守可能な「資産」へと昇華されるはずだ。

次は、例外処理(`On Error GoTo`)の網をどう張り巡らせるかについて語ろう。準備はいいか。

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