こんにちは!プロジェクト管理の現場で、日々奮闘されていることと思います。
「マクロの記録」から一歩踏み出し、自分だけの自動化ツールを作りたい。そう思ってVBAの世界に飛び込んだものの、Excelとは一味違うMicrosoft Project(MSP)独特のオブジェクト構造に面食らっていませんか?
大丈夫。ここをクリアすれば、あなたもProject VBAの基本を完全にバッチリ押さえた「一人前の自動化エンジニア」です!
今回は、現場で即戦力となる「リソース情報の外部連携(データ同期)」をテーマに、社内データベース(今回は模範としてExcelやADO経由を想定)からリソースの詳細プロファイルを取得し、MSPのカスタムフィールドに流し込む極意を伝授します。
顔写真のパス、専門スキル、所属部署など、リソースの「顔」となる情報を綺麗に同期させ、リッチなプロジェクトリソース管理を実現しましょう。
—
なぜ、MSPのリソース管理に外部連携が必要なのか?
大規模なプロジェクトになればなるほど、MSPのリソースプールと、人事システムや社内DBとの乖離に悩まされます。
「新しいメンバーがアサインされたのに、MSP側のスキル情報が古いまま……」
これを手作業で更新するのは、百害あって一利なしです。
VBAを使って「リソースのID(ユニークIDや略称)」をキーにして自動同期するパイプラインを構築すれば、一瞬で最新の状態にアップデートできます。
今回実現するアーキテクチャのイメージ
[ 社内DB / マスターExcel ] ──(IDをキーに検索)──> [ Project VBA ] ──> [ MSPのカスタムフィールド ]
—
押さえておくべきMSPリソースの基本構造
Excelのセル操作と違い、MSPには「リソース(Resource)」と、それに紐づく「リソース・カスタムフィールド(Text1〜30など)」特有のライフサイクルがあります。
初心者 gracious エラーを生みがちなポイントですが、MSPのリソースは `ActiveProject.Resources` というコレクションで管理されています。そして、カスタムフィールドへの書き込みには `Text` プロパティ や `Number` プロパティ を使用します。
—
実装コード:リソースプロファイル自動同期マクロ
それでは、現場でそのままコピペして使える実用的なコードを公開します。
今回は、外部データソースとして同じPC内にある「社員マスター.xlsx」を想定し、リソースの「略称(Initials)」または「名前(Name)」をキーにして、カスタムフィールドに情報を流し込むロジックを組み上げています。
Sub SyncResourceProfiles()
‘ =================================================================
‘ テーマ: リソースの詳細プロファイルを外部データから同期する
‘ 執筆者: チーフアーキテクト
‘ =================================================================
On Error GoTo ErrorHandler
‘ 画面描画と警告を停止して爆速化(お約束のプロの技)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim 匠Res As Resource
Dim ExternalWb As Workbook
Dim MasterSheet As Worksheet
Dim MatchRow As Range
Dim TargetFilePath As String
Dim FoundCount As Long
FoundCount = 0
‘ 1. 外部マスターファイルのパスを指定(環境に合わせて変更してください)
TargetFilePath = ThisWorkbook.Path & “\社員マスター.xlsx”
‘ ファイルの存在確認
If Dir(TargetFilePath) = “” Then
MsgBox “外部マスターファイルが見つかりません: ” & vbCrLf & TargetFilePath, vbCritical, “ファイルエラー”
GoTo Finally
End If
‘ 2. 外部Excelを読み取り専用でサイレントオープン
Set ExternalWb = Workbooks.Open(Filename:=TargetFilePath, ReadOnly:=True, UpdateLinks:=False)
Set MasterSheet = ExternalWb.Sheets(“Master”) ‘ マスターシート名
‘ 3. プロジェクト内の全リソースを巡回(ライフサイクルの基本)
For Each 匠Res In ActiveProject.Resources
‘ リソースが空行(Null)でないかチェック
If Not 匠Res Is Nothing Then
‘ ここではリソースの「略称(Initials)」を社員IDと見立てて検索キーにします
‘ ※「名前(Name)」をキーにしたい場合は 匠Res.Name に変更してください
Dim SearchKey As String
SearchKey = 匠Res.Initials
If SearchKey <> “” Then
‘ マスターシートのA列(社員ID/略称列)から合致するセルを検索
Set MatchRow = MasterSheet.Columns(“A”).Find(What:=SearchKey, _
LookAt:=xlWhole, _
LookIn:=xlValues)
If Not MatchRow Is Nothing Then
‘ — データの同期実行 —
‘ MSPのカスタムフィールドへ流し込む
‘ Text1: 部署名
‘ Text2: スキル・資格
‘ Text3: 顔写真ファイルパス
匠Res.Text1 = MatchRow.Offset(0, 1).Value ‘ B列: 部署
匠Res.Text2 = MatchRow.Offset(0, 2).Value ‘ C列: スキル
匠Res.Text3 = MatchRow.Offset(0, 3).Value ‘ D列: 写真パス
FoundCount = FoundCount + 1
End If
Set MatchRow = Nothing
End If
End If
Next 匠Res
‘ 4. 外部ファイルを保存せずに閉じる
ExternalWb.Close SaveChanges:=False
‘ 終了処理
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox “同期が完了しました!” & vbCrLf & _
“更新されたリソース数: ” & FoundCount & ” 件”, vbInformation, “同期成功”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “致命的エラー”
Finally:
‘ エラー時でも確実にオブジェクトと画面設定を復元
If Not ExternalWb Is Nothing Then ExternalWb.Close SaveChanges:=False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
—
ここで躓きやすい!陥りがちなエラーと回避の極意
Project VBAを書き始めると、多くの人が同じ壁にぶつかります。先輩からのアドバイスとして、つまづきやすいポイントを先回りして解説しておきますね。
1. 「オブジェクトが必要です」エラー (Error 424)
- 原因: `ActiveProject.Resources` をループしている際、プロジェクト内に「完全に空行のリソース(ゴミデータ)」が存在していると、プロパティを参照した瞬間にエラーになります。
- 対策: コード内にも入れていますが、必ず `If Not 匠Res Is Nothing Then` でオブジェクトの存在確認を行いましょう。さらに `Initials`(略称)や `Name` が空文字でないかのガードを入れるのがプロの作法です。
2. カスタムフィールドの「名前(Field Name)」と「内部名(Text1)」の混乱
- 原因: MSPでは、画面上のカスタムフィールド名を「スキル」などに変更できますが、VBAのコード内では基本的に `Text1`, `Text2` といったフィールド固有のインデックスで指定します。
- 対策: 画面の「名前の変更」で混乱しないよう、どの `Text` フィールドに何のデータを格納するのか、チーム内で設計書(コメント)を必ず残すようにしましょう。
—
まとめ:ここをクリアすれば、基本はバッチリ!
お疲れ様でした!今回のコードを通じて、以下のMSP VBAの核心に触れました。
- `ActiveProject.Resources` を使ったリソースコレクションの走査
- 外部ファイル(Excelなど)とのセキュアな連携とメモリ管理
- エラーハンドリングとパフォーマンス最適化(ScreenUpdatingの制御)
これらをマスターしたあなたなら、単なるマクロの記録者ではなく、立派な「Project自動化エンジニア」です。このコードをベースに、顔写真をMSPのUI上でどう表示させるか(ビューのカスタマイズなど)へと応用を広げていってください。
あなたのプロジェクト管理が、よりスマートで快適なものになりますように。
それでは、次のステージでお会いしましょう!
