プロジェクトを意のままに操る: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の基礎は完璧です。次は「リソース割り当て」や「ビューの制御」といった、より高度な領域へ進みましょう。応援しています!
