【入門編】SQL Serverからリソース情報を取得しProjectの「リソースシート」を同期する連携ツール – Project VBA解析バイブル

スポンサーリンク

こんにちは!現場でバリバリと自動化を進めていると、「Excelだけじゃなく、Microsoft Projectのデータもデータベースと同期させたい!」という壁にぶつかることがありますよね。

「マクロの記録」が使えないProject VBAの世界は、一見するととっつきにくく感じるかもしれませんが、本質さえ掴んでしまえば、Excel VBAと書き方はほとんど同じです。

今回は、「SQL Serverから最新のリソース情報を取得し、Projectのリソースシートへ自動同期する連携ツール」の作り方を、実務でそのまま使えるコードとともに徹底解説します。

ここをクリアすれば、Project VBAの基本と外部データ連携の勘所はバッチリですよ。一緒にマスターしていきましょう!

—

1. なぜ「リソースの同期」を自動化するのか?

大規模なプロジェクトになればなるほど、社内のリソース(人員や設備)の変動は激しくなります。

  • 新規メンバーの追加
  • 部署異動による単価(コスト)の変更
  • 稼働率(Max Units)の調整

これらを毎回手作業でProjectのリソースシートに打ち込んでいるようでは、入力ミスが起きるだけでなく、プロジェクトマネージャーの貴重な時間が溶けてしまいます。

そこで、「人事DB(SQL Server)の情報を夜間や起動時に自動で読み込み、Project側へ一発反映させる仕組み」を作るのです。

—

2. 実装の全体像とデータフロー

今回構築するVBAのデータ連携フローは以下の通りです。

1. ADODBを使ってSQL Serverに接続する。
2. 最新のリソースデータ(名前、標準単価、最大稼働率など)をSQLで取得する。
3. Project側の「リソースシート(`ActiveProject.Resources`)」を走査し、既存データがあれば更新、なければ新規追加する。

—

3. 実装コード:SQL Server連携リソース同期ツール

以下のコードを、Project側のVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。

実務でそのまま使えるよう、エラーハンドリングと丁寧なコメントを入れています。

‘ ==============================================================================
‘ テーマ: SQL Serverからリソース情報を取得しProjectのリソースシートを同期する
‘ 依存関係: Microsoft ActiveX Data Objects 2.8 Library (参照設定を推奨)
‘ ==============================================================================
Sub SyncResourcesFromSQLServer()
‘ 1. 変数の宣言
Dim conn As Object
Dim rs As Object
Dim connStr As String
Dim sql As String

Dim projRes As Resource
Dim found As Boolean
Dim targetName As String

‘ 画面描画を停止して処理速度を爆発的に上げる(Project VBAの鉄則!)
Application.ScreenUpdating = False

On Error GoTo ErrorHandler

‘ 2. 接続文字列の設定(環境に合わせて書き換えてください)
connStr = “Provider=SQLOLEDB;Server=YOUR_SERVER_NAME;Database=YOUR_DB_NAME;Uid=YOUR_USER;Pwd=YOUR_PASSWORD;”

‘ 3. ADODBオブジェクトの生成
Set conn = CreateObject(“ADODB.Connection”)
Set rs = CreateObject(“ADODB.Recordset”)

‘ 4. データベース接続
conn.Open connStr

‘ 5. リソース情報を取得するSQLクエリ
‘ (例: 社員マクロから「名前」「標準単価」「最大稼働率」を取得)
sql = “SELECT ResourceName, StandardRate, MaxUnits FROM M_Resources WHERE IsActive = 1;”
rs.Open sql, conn

‘ 6. 取得したレコードをProjectのリソースシートに同期
Do While Not rs.EOF
targetName = rs(“ResourceName”).Value
found = False

‘ 既存のリソースシートを探索
For Each projRes In ActiveProject.Resources
If Not projRes Is Nothing Then
If projRes.Name = targetName then
found = True
Exit For
End If
End If
Next projRes

If found Then
‘ — 【既存更新】 —
‘ 既に存在する場合は、単価や稼働率を最新にアップデート
projRes.StandardRate = rs(“StandardRate”).Value & “/h”
projRes.MaxUnits = rs(“MaxUnits”).Value / 100 ‘ ProjectのMaxUnitsは小数表現 (100% = 1.0)

Else
‘ — 【新規追加】 —
‘ 存在しない場合は新しくリソースを作成
Set projRes = ActiveProject.Resources.Add(targetName)
projRes.StandardRate = rs(“StandardRate”).Value & “/h”
projRes.MaxUnits = rs(“MaxUnits”).Value / 100

End If

rs.MoveNext
Loop

‘ 7. 後片付け
rs.Close
conn.Close

Application.ScreenUpdating = True
MsgBox “リソース情報の同期が正常に完了しました!”, vbInformation, “同期完了”
Exit Sub

ErrorHandler:
‘ エラー時のクリーンアップ
Application.ScreenUpdating = True
If Not rs Is Nothing Then If rs.State = 1 Then rs.Close
If Not conn Is Nothing Then If conn.State = 1 Then conn.Close

MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “連携エラー”
End Sub

—

4. コードの重要ポイントと初学者がハマりやすい罠

ここからは、先輩エンジニアとして「絶対に押さえておいてほしいポイント」を3つ解説します。

① `Application.ScreenUpdating = False` の魔力

Projectは、リソースやタスクを追加・変更するたびにガッツリと画面やスケジュールを再計算(再描画)します。数千件のリソースをループで回すときにこれを放置すると、PCがフリーズしたかと絶望するほど遅くなります。データ処理の鉄則として、処理の最初で画面更新を止め、最後に戻すようにしましょう。

② Project独特のデータ型のクセ

Excelと違い、Projectのプロパティには独特の型や単位があります。

  • 単価 (`StandardRate`): 数値だけでなく `”/h”`(時間あたり)などの単位文字列を付与するか、文字列として渡す必要があります。
  • 最大稼働率 (`MaxUnits`): 画面上では `100%` と表示されますが、VBAの内部値としては `1.0` が100%を意味します。そのため、SQL側が「100」という整数で保持している場合は、コードのように `100で割る` 変換が必要になります。

③ オブジェクトのライフサイクル管理

データベース接続 (`ADODB.Connection`) やレコードセット (`ADODB.Recordset`) は、メモリやDB側の接続リソースを大量に消費します。エラーが起きたときでも確実に `Close` できるよう、今回のコードのように `ErrorHandler` を設けてリソースリークを防ぐのがプロの作法です。

—

5. おわりに:ここをクリアすれば、あなたもProject VBAの担い手

お疲れ様でした!SQL ServerとProjectをVBAで繋ぐという、一見ハードルが高そうな処理も、こうして紐解いてみると基本の組み合わせであることが分かったかと思います。

外部DBとの連携ができるようになれば、単なる「手動のスケジュール管理ツール」だったMicrosoft Projectが、「企業のリソース最適化を担う強力なハブシステム」へと生まれ変わります。

ぜひご自身の環境に合わせて接続文字列やSQLを調整し、現場で動かしてみてくださいね。
あなたの自動化ライフを、これからも応援しています!

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