【入門編】Project VBAでリソースの顔写真や詳細プロファイルを外部連携する – Project VBA解析バイブル

スポンサーリンク

こんにちは!プロジェクト管理の現場で、日々奮闘されていることと思います。

「マクロの記録」から一歩踏み出し、自分だけの自動化ツールを作りたい。そう思って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上でどう表示させるか(ビューのカスタマイズなど)へと応用を広げていってください。

あなたのプロジェクト管理が、よりスマートで快適なものになりますように。
それでは、次のステージでお会いしましょう!

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