【入門編】リソースの「割り当て」に特定のカスタムフィールド値を一括コピーする同期ツール – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握せよ:リソース情報を「割り当て」へ同期する究極の自動化術

こんにちは。現場で泥臭い自動化と格闘し、時に洗練されたコードに救われてきたエンジニアの端くれです。

今日は、Project VBAの「深淵」に触れる話をしましょう。多くの人がマクロの記録で満足する中、あなたは一歩先へ進もうとしている。素晴らしいことです。

今回取り上げるのは「リソースシートの情報を、紐づく全てのアサインメント(割り当て)へ一括コピーする」というテーマ。これは単なるデータ転送ではありません。Projectという「生き物」の構造を理解し、オブジェクトを正しく操作する極めて重要な演習です。

—

1. なぜ「割り当て」への同期が必要なのか?

Projectのデータ構造は、大きく分けて3層あります。
1. Task(タスク): 「何を」するか
2. Resource(リソース): 「誰が」するか
3. Assignment(割り当て): 「誰が・何を・どれくらい」するか

例えば、リソースに「所属部署」や「スキルレベル」というカスタムフィールドを作ったとします。リソースシートで書き換えても、既存の割り当てには自動で反映されません。 これを放置すると、レポートを作るたびに「データが古い!」と怒られることになります。

これを自動化することで、あなたは「データ管理」という退屈な作業から解放され、本来のエンジニアリングに集中できるのです。

—

2. 実装の設計図:オブジェクトを辿る旅

今回のコードを書く上で、最も大切なのは「リソースから割り当てを見つけ出すルート」を知ることです。

  • `ActiveProject.Resources`: 全リソースの集合
  • `Resource.Assignments`: そのリソースに関連する全ての割り当ての集合

この二つの階層をループで回すのが、今回のミッションです。

実践コード:リソース情報の同期スクリプト

Sub SyncResourceToAssignments()
Dim res As Resource
Dim asgn As Assignment
Dim targetValue As String

‘ エラーハンドリング:何かが起きた時のための安全装置
On Error Resume Next

‘ プロジェクト内の全てのリソースをループ
For Each res In ActiveProject.Resources
‘ リソースが有効であるか確認(空行などを弾く)
If Not res Is Nothing Then

‘ ここで同期したいカスタムフィールドの値を取得
‘ 例: Text1フィールドの値をコピー対象とする
targetValue = res.Text1

‘ このリソースに紐づく全ての割り当てへ反映
For Each asgn In res.Assignments
‘ 割り当て側のText1へ値をセット
asgn.Text1 = targetValue

‘ 進行状況を確認するためのデバッグ出力
Debug.Print “更新: ” & asgn.TaskName & ” (” & res.Name & “) -> ” & targetValue
Next asgn
End If
Next res

MsgBox “リソース情報の同期が完了しました!”, vbInformation
End Sub

—

3. ここをクリアすれば一人前!陥りやすい罠

このコードを書いていて、「なぜか動かない」「エラーになる」という壁にぶつかるかもしれません。以下の3点に注意してください。

① `Nothing` のチェックを怠らない

Projectの`Resources`コレクションには、ユーザーが意図しない「空行」が含まれることがあります。`If Not res Is Nothing` という一文があるかないかで、コードの堅牢性は天と地ほどの差が出ます。

② カスタムフィールドの番号(Text1, Number1など)

Projectのカスタムフィールドは、リソース側と割り当て側で必ず同じ番号を指定してください。リソースの`Text1`を割り当ての`Text2`に入れても、データが混線して後で苦労するのは自分自身です。

③ 実行パフォーマンスへの配慮

もしプロジェクトが数千行ある場合、ループ処理は重くなります。`Application.ScreenUpdating = False` を冒頭に入れ、最後に `True` に戻すことで、画面描画を停止し劇的に速度を向上させることができます。

—

4. さあ、次のステップへ

今回のスクリプトは、あなたの自動化ツールボックスにおける「基本の型」です。ここから発展させて、以下のような要件にも対応できるようになります。

  • 条件付きコピー: 特定のリソースタイプのみ同期する。
  • ログ出力: 更新した内容をテキストファイルに書き出し、監査証跡を残す。
  • ボタン化: リボンメニューに配置して、ワンクリックで最新化する。

「動くコード」を書くことは難しくありません。しかし、「誰が保守しても壊れない、美しいコード」を書くのは至難の業です。あなたは今日、その第一歩を踏み出しました。

何か具体的なエラーや、もっと高度な実装(APIとの連携など)で詰まったら、いつでも聞いてください。Projectの深い部分まで、一緒に解き明かしていきましょう。

応援しています。あなたの自動化ライフが、より快適で創造的なものになりますように。

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