【入門編】【エラー回避】「タスクが選択されていません」を防ぐ:選択範囲の判定と安全なオブジェクト取得 – Project VBA解析バイブル

スポンサーリンク

【Project VBA極意】「タスクが選択されていません」を撲滅せよ!堅牢なコードへの第一歩

こんにちは。システム開発の現場でVBAと長年対峙してきた者です。

Microsoft ProjectのVBAを触り始めると、誰もが一度は遭遇する壁があります。そう、ユーザーが何も選択していない状態でマクロを実行した瞬間に突きつけられる、あの冷徹なエラーメッセージです。

「タスクを選択してください」と警告を出して終了させるだけなら簡単です。しかし、真に洗練された自動化エンジニアは、エラーを「未然に防ぐ」ことでユーザー体験を最大化します。

今回は、Project VBAの「選択範囲の概念」を解き明かし、あなたのコードを「落ちない堅牢なツール」へと進化させる極意を伝授しましょう。

1. なぜ「タスク未選択」でエラーが起きるのか?

Project VBAにおいて、`ActiveSelection`(現在の選択範囲)というオブジェクトは、あくまで「今、ユーザーが何を選んでいるか」というあやふやな状態を指し示しています。

もしユーザーがタスクを一つも選んでいなければ、`ActiveSelection.Tasks` にアクセスしようとした瞬間に、プログラムは行き場を失い、実行時エラーを投げます。

初心者が陥りやすいのは、「選択されているはずだ」という性善説に基づいたコードです。プロのエンジニアは常に「選択されていないかもしれない」という疑いを持ちます。

2. 堅牢な選択チェックの定型コード

現場でそのまま使える、安全なオブジェクト取得のテンプレートがこちらです。このパターンを一つ覚えておくだけで、あなたのマクロの信頼性は劇的に向上します。

Sub SafelyGetSelectedTasks()
‘ Projectオブジェクトの宣言
Dim proj As Project
Dim tsks As Tasks
Dim tsk As Task

‘ 現在のプロジェクトを取得
Set proj = ActiveProject

‘ 【重要】選択されているタスクがあるかチェックする
‘ ActiveSelection.Tasks は、何も選択されていない場合でも
‘ オブジェクト自体は返すが、Countプロパティで判定可能
If proj.Selection.Tasks Is Nothing Then
MsgBox “タスクが選択されていません。”, vbExclamation
Exit Sub
End If

If proj.Selection.Tasks.Count = 0 Then
MsgBox “タスクを選択してから実行してください。”, vbExclamation
Exit Sub
End If

‘ ここまで来れば安全に処理を開始できる
Set tsks = proj.Selection.Tasks

For Each tsk In tsks
‘ ここにタスクに対する処理を記述する
Debug.Print “処理対象: ” & tsk.Name
Next tsk

MsgBox “全タスクの処理が完了しました。”, vbInformation
End Sub

コードの解説:ここが「プロ」の視点

  • `proj.Selection.Tasks` の検証: 単純に `Is Nothing` を見るだけでは不十分なケースがあります。`Count` プロパティを確認することで、物理的に「タスクが0個」という状態を確実に弾くことができます。
  • 早期リターン(ガード句): `If`文でエラー条件を先に判定し、`Exit Sub` で即座に抜ける。これにより、メインの処理が深いインデントに埋もれるのを防ぎ、コードの可読性を保ちます。

3. オブジェクトモデルをマスターするためのコツ

Project VBAは、Excel VBAとは少し「空気感」が異なります。以下のポイントを意識してください。

1. Application > Project > Task の階層構造:
常にどのプロジェクト(`ActiveProject`)に対して操作しているかを意識しましょう。複数のプロジェクトを開いている場合、`ActiveProject` を明示的に指定しないと意図せぬ挙動を生むことがあります。
2. `Selection` オブジェクトの柔軟性:
`Selection` はタスクだけでなく、リソースやビューに依存して変化します。常に「今、何が選択されているか」を型で意識することが大切です。
3. エラーハンドリングは「おまじない」ではない:
`On Error Resume Next` でエラーを握りつぶすのは最後の手段です。まずは今回のコードのように「条件分岐(IF)」で正攻法に対処する。これがバグの少ないシステムを作る秘訣です。

最後に:ここをクリアすれば、あなたはもう脱初心者

「タスクが選択されていません」というエラーを自力で制御できるようになったということは、あなたはもう「動くコード」を書く段階から「壊れないコード」を設計する段階に足を踏み入れたということです。

Project VBAは、一度仕組みを理解すれば、面倒な工程表の更新やリソース管理を魔法のように自動化してくれる強力な武器になります。

まずは今回の定型コードをコピーして、ご自身の環境で動かしてみてください。何か疑問があれば、いつでも質問してくださいね。あなたの自動化の旅を、これからも応援しています。

ここをクリアしたあなたなら、次は「リソースの割り当て」や「カスタムフィールドの操作」といった、より高度な領域もすぐに使いこなせるはずです。頑張ってください!

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