【入門編】Taskの「実績開始日」と「実績終了日」をVBAで強制的に上書きする際の注意点 – Project VBA解析バイブル

スポンサーリンク

プロジェクトを意のままに操る:VBAで「実績」を強制上書きする際の鉄則

こんにちは。Project VBAの世界へようこそ。
「マクロの記録」から一歩踏み出し、自らコードを記述する領域へ足を踏み入れたあなたに、今日は「Task(タスク)の実績開始日・終了日をVBAで制御する」という、中級者への登竜門をお話しします。

多くの人がここで「なぜか日付が勝手に変わる」「エラーが出る」と頭を抱えます。それは、Projectの「自動計算エンジン」という強力なシステムを無視して値をねじ込もうとするからです。

この壁さえ越えれば、あなたはProjectの「使い手」になれます。一緒に紐解いていきましょう。

1. なぜ「実績日」の操作は難しいのか?

Projectのタスクには「自動計算ロジック」が働いています。例えば、タスクを「実績完了」にしようと終了日を代入しても、Projectは「残存作業時間はどうする?」「予定終了日と矛盾していないか?」と、裏側で必死に計算し直します。

VBAで値を書き換える際、単に `Task.ActualFinish = Date` と書くだけでは、計算の整合性が取れずに値が弾かれたり、意図しないスケジュール変動を引き起こしたりするのです。

成功の鍵:更新の順序

「実績」を入力する際は、以下の鉄則を守ってください。

1. 進捗率を明示的にセットする(0%から値を動かす)
2. 「実績開始日」を先に確定させる
3. 「実績終了日」を最後に確定させる

2. 実践:安全かつ確実に実績を書き込むコード

では、現場で使える「安全な更新テンプレート」を紹介します。ポイントは、`Task.PercentComplete` を起点にして、Projectのエンジンに「これから実績を更新するぞ」という合図を送ることです。

Sub UpdateTaskActuals(targetTask As Task, actualStart As Date, actualFinish As Date)
‘ エラーハンドリングはVBAの嗜みです
On Error GoTo ErrorHandler

With targetTask
‘ 1. まず進捗率を更新し、Project側に「実績入力モード」であることを認識させる
‘ 進捗を0%より大きくすることで、実績入力のトリガーを引きます
If .PercentComplete = 0 Then .PercentComplete = 1

‘ 2. 実績開始日の書き込み
‘ ※重要:Projectの制約条件と競合しないよう注意
.ActualStart = actualStart

‘ 3. 実績終了日の書き込み
‘ 実績が完了したことを明示するために、進捗率を100%にする
.ActualFinish = actualFinish
.PercentComplete = 100

Debug.Print “タスク「” & .Name & “」の実績を更新しました。”
End With

Exit Sub

ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub

3. 陥りやすい「3つの罠」

初学者が必ずと言っていいほど踏む「罠」を整理しておきます。

① 「手動スケジュール」と「自動スケジュール」の混同

タスクモードが「自動」の場合、実績を入力した瞬間にProjectがスケジュールを再計算します。これが嫌な場合は、更新前に一時的にタスクを「手動」にする手法もありますが、基本は「実績を入力したら、その結果としてスケジュールが確定する」というProjectの設計思想に従うのが最も健全です。

② 日付形式の不整合

`ActualStart` などに代入する際は、必ず `Date` 型または `String` 型の正しい日付形式であることを確認してください。特にExcelからデータを引っ張ってくる際は、データ型が `Variant` になりがちなので、`CDate()` 関数で明示的に変換する癖をつけましょう。

③ 完了後の再計算

`PercentComplete = 100` になったタスクに対して、後から実績日を変更しようとすると、Projectは「完了しているのに日付を変えるのか?」と混乱します。一度100%未満に戻してから更新し、再度100%にするという「揺さぶり」が必要なケースもあります。

4. チーフアーキテクトからのアドバイス

VBAでProjectを操作する際、最も重要なのは「Projectの思考プロセスを尊重すること」です。

コードを書くとき、画面の向こう側にいるProjectのエンジンが「今、どんな計算をしているのか?」を想像してみてください。力技で値を代入するのではなく、Projectが納得する「手順」で情報を与えてあげる。これが、エラーを出しにくい堅牢な自動化エンジニアへの第一歩です。

まずは、あなたのプロジェクトファイルで、特定のタスクを1つだけ指定して、このコードを試してみてください。もし動かなければ、それは「制約条件(Constraint)」が邪魔をしている証拠です。その制約を見つけることこそが、トラブルシューティングの醍醐味ですよ。

ここをクリアしたあなたなら、もうProject VBAの基礎は完璧です。次は「リソース割り当て」や「ビューの制御」といった、より高度な領域へ進みましょう。応援しています!

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