Project VBAの深淵へ:AD連携で「コスト管理」を完全自動化する極意
皆さん、こんにちは。現場で泥臭い自動化を積み重ね、VBAとProjectの深淵を覗いてきたチーフアーキテクトです。
「マクロの記録」ボタンを押すだけの世界から一歩踏み出し、Project VBAの門を叩いたあなたへ。今日は、現場のコスト管理において最も重要でありながら、多くの人が手作業で挫折する「リソースのコストセンター自動割り当て」という難所を攻略します。
Active Directory(AD)から部署情報を引き抜き、Projectのリソースに流し込む。これができれば、あなたはもう「入力係」から「運用アーキテクト」へ進化です。さあ、一緒に深掘りしていきましょう。
—
1. なぜ「自動連携」が必要なのか?
プロジェクト管理の現場で最も悲劇的なのは、「予算と実績の乖離」です。原因の多くは、リソース(人)の所属部署が正しくコストセンターに紐づいていないこと。
手作業で一人ずつコストセンターを入力していませんか? それ、Project VBAで一瞬で終わらせましょう。「ADの部署名 = Projectのカスタムフィールド」とマッピングすることで、管理コストはゼロになります。
—
2. 実装の設計図:どのオブジェクトを触るのか
Project VBAでは、リソースを扱うために `ActiveProject.Resources` というコレクションを操作します。
- Resourcesオブジェクト: プロジェクト内の全リソースの集合体。
- Resourceオブジェクト: 個々のリソース。名前やID、そして「カスタムフィールド」を持ちます。
- Text/Numberフィールド: プロジェクトの「ユーザー設定フィールド」には、コスト情報を格納する場所が用意されています。
—
3. 実践コード:AD情報をリソースに流し込む
今回は、VBAからAD情報を取得する「ADO(ActiveX Data Objects)」を用いたアプローチを紹介します。
Sub SyncResourceCostCenter()
‘ 宣言:ProjectとAD接続のためのオブジェクト
Dim proj As Project
Dim res As Resource
Dim conn As Object ‘ AD接続用
Dim rs As Object ‘ AD検索結果用
Set proj = ActiveProject
‘ AD接続設定(環境に合わせてLDAPパスを調整してください)
Set conn = CreateObject(“ADODB.Connection”)
conn.Provider = “ADsDSOObject”
conn.Open “Active Directory Provider”
‘ 全リソースをループ処理
For Each res In proj.Resources
‘ リソースが「作業(Work)」リソースであるか確認(材料リソースは除外)
If res.Type = pjResourceTypeWork Then
‘ ADから該当ユーザーを検索(簡易的なイメージです)
‘ ここではリソース名をアカウント名と仮定してクエリを投げます
Set rs = conn.Execute(“
‘ 検索結果があればカスタムフィールド(Text1)に書き込む
If Not rs.EOF Then
‘ Text1フィールドをコストセンターとして利用
res.Text1 = rs.Fields(“department”).Value
Debug.Print res.Name & ” のコストセンターを ” & res.Text1 & ” に更新しました。”
End If
rs.Close
End If
Next res
conn.Close
MsgBox “コストセンターの自動割り当てが完了しました!”, vbInformation
End Sub
このコードの「魂」:ここがポイント
1. `pjResourceTypeWork`: ここでフィルターをかけるのが重要です。プロジェクトには「資材」や「コスト」というリソースもあります。人間(Work)以外を誤って操作しないための防波堤です。
2. `Text1` フィールド: Projectの標準フィールドは極力触らず、予備の `Text` フィールドをマッピング先にするのが安全です。将来的な拡張性を守る、アーキテクトの嗜みです。
—
4. 陥りやすい「罠」と対策
初心者が必ずぶつかる壁が2つあります。
その①:AD連携時の「検索タイムアウト」
リソースが数千人規模になると、ADへのクエリでProjectがフリーズすることがあります。
- 対策: 一度に全員を更新するのではなく、`res.ID` で条件を絞り、バッチ処理のように分割して実行しましょう。
その②:リソース名の不一致
ADのユーザー名(sAMAccountName)と、Projectのリソース名が完全一致していないケースが多発します。
- 対策: `If res.Name Like “山田” Then` のような「あいまい検索」を挟むか、「社員番号」をキーにする運用を強く推奨します。名前は変わりますが、社員番号は不変だからです。
—
5. 次のステップへ
「コストセンターを自動化した。次はどうする?」
ここまでできれば、あなたは「稼働率調整」の自動化に挑戦できます。例えば、コストセンターごとの予算上限を超えそうな場合、Project VBAでアラートを出し、特定のリソースの稼働率(Units)を自動で調整するロジックを組むことも可能です。
VBAは単なるツールではありません。「プロジェクト管理という混沌を、論理的な秩序に変えるための杖」です。
今日からあなたのプロジェクトは、手作業のミスから解放されます。分からないことがあれば、またいつでも聞いてください。焦らず、一歩ずつ。一緒に最高の環境を創り上げましょう。
