【入門編】Projectリソースの「電子メールアドレス」とActive Directoryの同期ツール – Project VBA解析バイブル

スポンサーリンク

こんにちは!普段は大規模なプロジェクト管理システムの裏側を構築している、チーフアーキテクトの私です。

マクロの記録から一歩抜け出し、「そろそろ本格的にProject VBAを使いこなしたい!」と思っているあなたへ。今回は、現場でめちゃくちゃ役立つ「Active Directory(AD)とProjectリソースのメールアドレス同期ツール」の作り方を伝授します。

Excel VBAなら触ったことがあるという人でも、Microsoft Project(MSP)のオブジェクトモデルは少し勝手が違うので戸惑うかもしれません。でも、安心してください。ここをクリアすれば、Project VBAの基本はバッチリですよ!

一緒に、現場のコミュニケーションロスを撲滅する自動化ツールを作っていきましょう。

—

1. なぜ「ADとリソースの同期」が必要なのか?

プロジェクト管理において、リソース(メンバー)の連絡先情報は命綱です。「タスクの遅延をアラートしたいのに、メールアドレスが古くて届かなかった……」なんて笑えないトラブル、あなたの現場でも起きていませんか?

しかし、メンバーが数人なら手動で直せますが、百名規模の組織になると手作業での更新は不可能に近いです。そこで、企業のマスターデータである Active Directory (AD) から最新情報を取得し、Projectのリソースシートへ一瞬で流し込むVBAマクロの出番となります。

—

2. Project VBAの全体像と「リソース」の罠

まずは、Projectの裏側の仕組みを少しだけ覗いてみましょう。
Excelのセルと違い、Projectのリソースは `ActiveProject.Resources` というコレクション(集まり)で管理されています。

ここで、初学者が絶対にハマる最大の罠をお伝えします。

> 【チーフアーキテクトの警告】
> Projectのリソースには、「仕事」「材料」「コスト」という種類(Type)があります。このうち、メールアドレスを持つのは「仕事(Work)」リソースだけです。「材料(Material)」リソースに対して無理やりメールアドレスを設定しようとすると、容赦なく実行時エラーが飛んできます。

この「オブジェクトの属性を見極める」という視点こそが、VBAを極めるための第一歩です。

—

3. 実装コード:AD連携リフレッシャー

今回は、Windows環境で強力に力を発揮する ADO (ActiveX Data Objects) と ADSI (Active Directory Service Interfaces) を組み合わせて、ADから直接メールアドレスを引いてくるスマートなコードを用意しました。

以下のコードを、ProjectのVBE(Visual Basic Editor)の標準モジュールに貼り付けてください。

‘ ==============================================================================
‘ テーマ名: Active DirectoryとProjectリソースのメールアドレス同期ツール
‘ 概要: ADから最新のメールアドレスを取得し、リソースシートを一括更新します。
‘ ==============================================================================
Sub SyncResourceEmailWithAD()
Dim res As Resource
Dim conn As Object
Dim cmd As Object
Dim rs As Object
Dim adPath As String
Dim updatedCount As Long

‘ エラーハンドリングの基本:万が一の接続失敗に備える
On Error GoTo ErrorHandler

updatedCount = 0

‘ 1. Active Directoryへの接続準備 (LDAPプロトコルを使用)
Set conn = CreateObject(“ADODB.Connection”)
Set cmd = CreateObject(“ADODB.Command”)

conn.Provider = “ADsDSOObject”
conn.Open “Active Directory Provider”
Set cmd.ActiveConnection = conn

‘ 2. プロジェクト内の全リソースをスキャン
For Each res In ActiveProject.Resources
‘ リソースが存在し、かつ「仕事(Work)」リソースであるかチェック
If Not res Is Nothing Then
If res.Type = pjResourceTypeText Then ‘ pjResourceTypeText は仕事リソースを指します

‘ 3. ADから該当する名前(Name)または別名(Initials/Email用ID等)で検索
‘ ※今回はシンプルにリソース名(表示名)でADのcn(Common Name)を検索する例です
adPath = “LDAP://DC=yourdomain,DC=com” ‘ ←ご自身の環境のドメインルートに変更してください

cmd.CommandText = “<" & adPath & ">;(&(objectCategory=person)(objectClass=user)(cn=” & res.Name & “));sAMAccountName,mail;SubTree”

Set rs = cmd.Execute

‘ 4. AD側に見つかった場合のみメールアドレスを更新
If Not rs.EOF Then
Dim adMail As String
adMail = rs.Fields(“mail”).Value

If Not IsNull(adMail) And adMail <> “” Then
‘ リソースの「電子メール アドレス」フィールドに代入
res.EmailAddress = adMail
updatedCount = updatedCount + 1
End If
End If

rs.Close
End If
End If
Next res

‘ 5. 終了報告
MsgBox “同期が完了しました!” & vbCrLf & “更新されたリソース数: ” & updatedCount & “件”, vbInformation, “同期成功”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & “エラー番号: ” & Err.Number & vbCrLf & “内容: ” & Err.Description, vbCritical, “エラー”
End Sub

—

4. コードの深掘り解説:ここがエンジニアのこだわりポイント

初心者の方に向けて、コードの重要なポイントをかみ砕いて解説しますね。

① `For Each res In ActiveProject.Resources`

Excelでいう `For Each cell In Range(…)` と同じ発想です。プロジェクトファイルに登録されているすべてのリソースを上から順に舐めていきます。

② `res.Type = pjResourceTypeText`

先ほどお話しした「罠」を回避するためのガードです。機械や資材(材料リソース)にはメールアドレスという概念がないため、この条件分岐で「人間(仕事リソース)」だけに処理を限定しています。

③ ADODBによるLDAP検索

Windowsの標準機能を使って社内のActive Directoryに直接問い合わせを行っています。社内インフラとProjectがVBAを介してシームレスにつながる瞬間であり、エンジニアとして最もワクワクする部分です。
(※組織のAD構造に合わせて、`adPath` の部分は適宜情シス担当者と相談して書き換えてくださいね)

—

5. 現場でよくある「つまずきポイント」と対策

最後に、このツールを実際に導入する際につまずきやすいポイントを先回りして解決しておきます。

  • Q. 「オブジェクトが必要です」というエラーが出るのですが?
  • A. ProjectのVBE画面で、メニューの [ツール] > [参照設定] を開き、「Microsoft ActiveX Data Objects x.x Library」にチェックが入っているか確認してください。DB接続のお作法として必須です。
  • Q. リソース名とADの登録名が一致しない!
  • A. Projectでは「苗字 名前」、ADでは「漢字フルネーム」や「ローマ字(社内ID)」になっているケースが多々あります。実務では、リソースの「テキスト1(Text1)」フィールドなどにADのログインIDをあらかじめ持たせておき、それをキーにして検索するようにコードをアレンジすると、より堅牢なツールになりますよ。

—

まとめ:自動化の第一歩を踏み出そう

今回は、ProjectリソースとActive Directoryを同期させる実践的なVBAコードをご紹介しました。

「マクロの記録」ボタンを押すだけでは決して見ることのできない、オブジェクト操作の世界はいかがでしたでしょうか?
ここをクリアできれば、あなたはもう単なる「Projectの利用者」ではなく、「プロジェクト管理プロセスのエンジニア」です。

ぜひ自分の環境で動かしてみて、業務効率化の爽快感を味わってください。それでは、次回の極限の知見でお会いしましょう!

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