こんにちは!プロジェクト管理の現場で、日々リソースのコストや稼働率の管理に頭を悩ませていませんか?
「プロジェクトのメンバーが異動した」「組織変更に伴ってコストセンター(部署コード)が変わった」……。そのたびに、MS Projectのリソースシートを開いて手動でポチポチ書き換えていませんか? 5人や10人ならまだしも、数百人規模のリソースを抱える組織でそれをやっていたら、あなたの貴重な時間がいくらあっても足りません。
今回は、Active Directory(AD)から最新の部署情報(コストセンター)を自動で取得し、Projectのリソースカスタムフィールドへ一発で同期する連携スクリプトを解説します。
ここをクリアすれば、Project VBAと外部連携の基本はバッチリです! マクロの記録頼みから脱却し、ワンランク上の自動化エンジニアへの扉を一緒に叩いてみましょう。
—
1. 全体像の把握:何をやっているのか?
今回の仕組みは、いわば「情報のパスポートコントロール」です。
1. Active Directory (AD) には、社員の最新の所属部署やコストセンターが格納されています。
2. Project VBA からWindowsの仕組み(VBScript / ADSI)を呼び出し、ADへ問い合わせに行きます。
3. 取得したコストセンターのデータを、Projectのリソースが持つ「カスタムフィールド(Text1など)」に書き込みます。
これをボタン一つ、あるいはプロジェクト起動時に自動実行できるようにします。
—
2. Project VBAの基本と「リソース」を操作する作法
Excel VBAと違って、Project VBAには「タスク」「リソース」「アサインメント」という独特の三位一体のオブジェクトモデルが存在します。
特にリソースを操作する場合、`ActiveProject.Resources` というコレクションを相手にします。Excelの「セル」の感覚で扱うと少し戸惑うので、まずは基本のイディオムを抑えましょう。
Sub Sample_ResourceLoop()
Dim r As Resource
‘ プロジェクト内の全リソースをループする
For Each r In ActiveProject.Resources
‘ リソースが有効(名前が空白でない)場合のみ処理
If Not r Is Nothing Then
If r.Name <> “” Then
Debug.Print r.Name & ” のIDは ” & r.ID & ” です。”
End If
End If
Next r
End Sub
Excelの `Cells(i, j)` のような座標指定ではなく、`For Each` でオブジェクトを直接掴みに行くのがProject VBAの流儀です。
—
3. 実装コード:AD連携・コストセンター自動同期スクリプト
それでは、現場でそのままコピペして使える実践的なコードを公開します。
このスクリプトは、リソースの「名前(またはメールアドレス)」をキーにしてADを検索し、取得した部署コードをリソースのユーザー定義フィールド(`Text1`)に流し込みます。
Sub SyncCostCenterFromAD()
Dim r As Resource
Dim adSearcher As Object
Dim adUser As Object
Dim query As String
Dim empEmail As String
Dim updatedCount As Long
updatedCount = 0
‘ 画面描画を停止してパフォーマンスを爆発的に上げる(お作法)
App.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ ユーザーフレンドリーなメッセージ
MsgBox “Active Directoryとの同期を開始します。”, vbInformation, “コストセンター同期”
For Each r In ActiveProject.Resources
If Not r Is Nothing Then
If r.Name <> “” Then
‘ ※前提: リソースの「電子メール アドレス」に社内メアドが登録されていること
empEmail = r.EmailAddress
If empEmail <> “” Then
‘ ADSI (Active Directory Service Interfaces) を使ってユーザーを検索
‘ ※実際の環境に合わせてLDAPパスや属性名(Departmentなど)を調整してください
Set adSearcher = CreateObject(“ADODB.Connection”)
adSearcher.Provider = “ADsDSOObject”
adSearcher.Open “Active Directory Provider”
‘ LDAPクエリの構築(メールアドレス一致で検索)
query = “
Dim rsAD As Object
Set rsAD = adSearcher.Execute(query)
If Not rsAD.EOF Then
‘ ADから部署名(Department属性)を取得
Dim deptName As String
deptName = rsAD.Fields(“department”).Value
‘ Projectのリソースカスタムフィールド「Text1」にコストセンターとして書き込む
r.Text1 = deptName
updatedCount = updatedCount + 1
End If
rsAD.Close
adSearcher.Close
End If
End If
End If
Next r
App.ScreenUpdating = True
MsgBox “同期が完了しました。” & vbCrLf & “更新されたリソース数: ” & updatedCount, vbInformation, “成功”
Exit Sub
ErrorHandler:
App.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
コードのポイント解説
- `App.ScreenUpdating = False`: 大量のリソースを一括処理する際、画面の再描画を挟むと極端に処理が遅くなります。プロの現場ではお馴染みの高速化テクニックです。
- `r.EmailAddress` との紐付け: ADから正確な個人を特定するため、リソースシートの「電子メール」列に会社のメールアドレスを入力しておくことが前提条件になります。ここを社員番号(リソースの「コード」フィールド)に書き換えることも可能です。
- `r.Text1`: Projectのリソースカスタムフィールド(文字列型)です。UI上で「コストセンター」という名前にリネームしておくと、ユーザーにとって非常に分かりやすくなります。
—
4. 現場でありがちな「陥りやすいエラー」と対策
初心者がこの領域に踏み込んだとき、必ずと言っていいほどハマるポイントがいくつかあります。事前に防ぎ方を知っておきましょう。
① 「オブジェクトが必要です」 (Error 424)
- 原因: `ActiveProject.Resources` の扱いや、ADOオブジェクトの生成 (`CreateObject`) でスペルミスがある場合や、参照設定が外れている場合に起因します。
- 対策: 今回のコードのように、`CreateObject` を使った「レイトバインディング(実行時バインディング)」を採用すると、事前の参照設定すらいらず、環境依存のエラーを防ぎやすくなります。
② ADの接続先(LDAP)が見つからない
- 原因: コード内の `LDAP://DC=yourdomain,DC=local` 部分が、あなたの会社の実際のドメイン名になっていないためです。
- 対策: 社内のインフラ担当者に、正しいActive Directoryのドメイン構造を確認してください。
③ 処理が途中でフリーズするように重い
- 原因: リソース数が数千人規模になると、一人ずつADに問い合わせる通信コスト(ネットワーク遅延)が積み重なります。
- 対策: 今回はシンプルに1件ずつクエリを投げていますが、本番運用では一度ADから全ユーザーの情報を配列やDictionaryに一括キャッシュし、メモリ上で突き合わせるアルゴリズムに昇華させると、爆速で終わるようになります。
—
まとめ:自動化の第一歩を踏み出そう
今回は、Active Directoryと連携してProjectのリソース情報を自動同期するスクリプトを解説しました。
「手動でのデータ入力」という不毛な作業から解放されるだけでなく、プロジェクト管理のデータ信頼性が圧倒的に向上します。ここをクリアできれば、次は「稼働率(Calendar)の自動調整」や「コスト単価(Standard Rate)の自動更新」など、より高度なリソース管理の世界へ進むことができます。
ぜひ、あなたの手元の環境で試してみてください。「ここをもっとこうしたい!」という疑問があれば、いつでも次のステップへ伴走しますよ。バッチリ自動化をキメて、スマートなプロジェクトマネジメントを実現しましょう!
