Project VBAの闇を照らす:実行時エラー「1101」を完全に制圧するプロのタスク操作術
こんにちは。現場で泥臭い自動化を積み重ね、Project VBAの酸いも甘いも噛み分けてきたエンジニアです。
Project VBAを触り始めた皆さんが必ずと言っていいほど直面する壁、それが「実行時エラー1101:このタスクは別のタスクにリンクされています」や、それに類する操作エラーです。
「なぜ動かないのか?」「なぜ追加したそばから消えるのか?」と頭を抱える夜は今日で終わりにしましょう。Projectのタスクは、単なる行の集合体ではありません。緻密な依存関係という「網」で繋がれた生きた有機体なのです。
今日は、この「1101」を回避し、堅牢なタスク管理を実現するための極意を伝授します。
—
1. なぜ「1101」エラーは起きるのか?
Projectのタスクは、親子関係(WBS)と先行タスク(依存関係)でガチガチに固められています。
- 循環参照の禁止: AがBを待ち、BがAを待つようなループ構造を作ろうとすると、Projectは怒ります。
- 不適切な削除: 子タスクを持つ親タスクを強引に操作しようとしたり、リンクされたタスクを無理に引き剥がそうとすると、内部の整合性が取れなくなりエラーを吐きます。
つまり、「操作の順序」と「存在チェック」を疎かにすると、必ずエラーという名のしっぺ返しが来るのです。
—
2. プロが実践する「安全なタスク追加」の鉄則
タスクを追加する際、いきなり `Tasks.Add` していませんか? それがエラーの温床です。まずは「本当にその位置に追加してよいか?」を確認する手順が必要です。
安全なタスク追加の設計例
Sub SafeTaskAddition()
Dim proj As Project
Dim tsk As Task
Set proj = ActiveProject
‘ 1. エラーハンドリングの準備(不測の事態に備える)
On Error GoTo ErrorHandler
‘ 2. タスク追加前の整合性チェック
‘ 新しいタスクを追加する前に、対象のIDが有効か確認する
‘ ID 10番の直後に挿入する場合の例
Set tsk = proj.Tasks.Add(“新規タスク”, 11)
‘ 3. プロパティの設定はオブジェクトを特定してから
With tsk
.Start = Date
.Duration = “3d”
‘ 必要に応じてWBS階層を調整(OutlineIndentを使う)
.OutlineIndent
End With
MsgBox “タスクが安全に追加されました!”, vbInformation
Exit Sub
ErrorHandler:
‘ 1101エラーが発生した際の情報を提供
MsgBox “エラー発生: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical
End Sub
ポイント: `On Error GoTo` でエラーを握りつぶすのではなく、何が起きたかログを出すのがプロの第一歩です。
—
3. 依存関係(リンク)を操作する際の「魔法の呪文」
依存関係を構築する際、`tsk.Predecessors` を直接いじると非常に不安定になります。ここで重要なのは、「リンクはタスク側ではなく、リンクオブジェクト側から操作する」という視点です。
依存関係を安全に設定するコード
Sub SafeLinkTask()
Dim tskPre As Task, tskSucc As Task
‘ ID:1 と ID:2 のタスクを取得
Set tskPre = ActiveProject.Tasks(1)
Set tskSucc = ActiveProject.Tasks(2)
‘ 依存関係を設定する前に「リンクが存在しないか」をチェック
‘ 無意味な重複リンクを避けることでエラーを回避する
If Not tskSucc.Predecessors Like “” & tskPre.UniqueID & “” Then
‘ FSリンク(終了-開始)でリンクを構築
tskSucc.PredecessorsLink.Add tskPre
Else
Debug.Print “すでにリンク済みです”
End If
End Sub
—
4. 現場で生き残るための「3つの極意」
初学者の皆さんが陥りやすい罠を回避するための、私の経験則をまとめました。
1. 「記録」を信じるな: マクロの記録で生成されるコードは冗長です。`ActiveProject.Tasks(i)` のような直接参照ではなく、`Task` オブジェクトを一度変数にセットしてから操作する習慣をつけましょう。
2. IDとUniqueIDを使い分けろ: `ID` は行番号(変わる可能性がある)、`UniqueID` はそのタスク固有のID(変わらない)。リンク設定には必ず `UniqueID` を使いましょう。
3. 最後に保存する: `Application.CalculateAll` を呼び出すタイミングを制御してください。頻繁な再計算は動作を重くし、エラーの引き金になります。
—
最後に:自動化は「対話」である
Project VBAを操るということは、単にコードを書くことではありません。「Projectという巨大なシステムの論理構造を理解し、そのルールの上で踊る」ということです。
エラーが出たときは、「自分が何をしたか」ではなく「Projectが何を禁止しているか」に耳を傾けてみてください。そうすれば、必ず解決策が見えてきます。
ここをクリアしたあなたは、もう立派な自動化エンジニアの入り口に立っています。自信を持って、次のタスクへ進みましょう!
—
何か不明な点や、特定のタスク操作で詰まっていることがあれば、いつでも聞いてくださいね。応援しています!
