【入門編】【上級者向け】SQL Server連携:プロジェクトの保存情報をデータベースへ自動記録する – Project VBA解析バイブル

スポンサーリンク

こんにちは。現場の最前線でプロジェクト管理の自動化を設計している、チーフアーキテクトです。

Microsoft Project(以下、Project)を単なる「ガントチャート作成ツール」として使っているうちは、まだその真価を引き出せているとは言えません。Project VBAを極めるということは、「散在する個別の.mppファイルを、組織の共有資産(データ)へと昇華させる」ことに他ならないからです。

今回は、脱・初心者を目指す皆さんに、私が現場で実際に組み込んでいる「SQL Serverへの自動保存ログシステム」を伝授します。「保存しました」という個人の記憶に頼るのではなく、システムが自動で「いつ、誰が、どのプロジェクトの、どのベースラインを確定させたか」を記録する。これができるようになれば、Project VBAの基本はバッチリですよ。

さあ、データの海へと漕ぎ出しましょう。

1. なぜ「保存」をトリガーにDBへ書き込むのか?

プロジェクト管理において、最も恐ろしいのは「先週の計画と今の計画、どこがどう変わったのか誰も正確に説明できない」という状態です。

Projectファイルはローカルに保存されがちですが、保存の瞬間にSQL Serverへ以下の情報を飛ばすことで、「プロジェクトの進化の足跡」を完全に可視化できます。

  • プロジェクト名: どの案件か
  • 最終保存者: 誰が責任者か
  • ベースライン情報: 当初の計画からどれだけズレているか

これを手動で行うのは苦行ですが、VBAなら「保存ボタンを押すだけ」で完了します。

2. 準備:SQL Serverに「受け皿」を作る

まずは、情報を格納するテーブルが必要です。SQL Server Management Studio (SSMS) などで、以下の簡単なテーブルを作成しておきましょう。

CREATE TABLE ProjectSaveLog (
LogID INT IDENTITY(1,1) PRIMARY KEY,
ProjectName NVARCHAR(255),
SavedBy NVARCHAR(100),
SaveDateTime DATETIME DEFAULT GETDATE(),
BaselineFinish DATE,
TotalCost MONEY
);

3. 実装:Project VBAで「保存イベント」を制御する

Project VBAには、特定の動作(イベント)が発生した時に自動で動くコードを書く場所があります。今回は「保存する前(`ProjectBeforeSave`)」に処理を割り込ませます。

参照設定の確認

VBAエディタの「ツール」→「参照設定」から、「Microsoft ActiveX Data Objects 6.1 Library」(数字は最新版でOK)にチェックを入れてください。これがSQL Serverと通信するための魔法のツールになります。

コード・セレクション:ThisProjectモジュールに記述

以下のコードを、Project内の `ThisProject` オブジェクトに貼り付けてください。

‘ ======================================================
‘ Project VBA: SQL Server連携 自動ログ保存システム
‘ ======================================================
Private Sub Project_BeforeSave(ByVal pj As Project)
On Error GoTo ErrorHandler

‘ 1. 保存する情報を取得
Dim projName As String
Dim userName As String
Dim blFinish As Variant
Dim totalCost As Double

projName = pj.Name
userName = Application.UserName
totalCost = pj.ProjectSummaryTask.Cost

‘ ベースライン0(最初の計画)の終了日を取得(設定されていなければ”N/A”)
If pj.Baselines.Count > 0 Then
blFinish = pj.Baselines(pjBaseline0).Finish
Else
blFinish = “1900/01/01” ‘ デフォルト値
End If

‘ 2. SQL Serverへの接続設定
‘ ※サーバー名とデータベース名はご自身の環境に合わせて書き換えてください
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

Dim connStr As String
connStr = “Provider=MSOLEDBSQL;” & _
“Data Source=YOUR_SERVER_NAME;” & _
“Initial Catalog=YOUR_DB_NAME;” & _
“Integrated Security=SSPI;” ‘ Windows認証

‘ 3. データベース接続とデータ挿入
conn.Open connStr

Dim sql As String
sql = “INSERT INTO ProjectSaveLog (ProjectName, SavedBy, BaselineFinish, TotalCost) ” & _
“VALUES (‘” & projName & “‘, ‘” & userName & “‘, ‘” & Format(blFinish, “yyyy-mm-dd”) & “‘, ” & totalCost & “);”

conn.Execute sql

‘ 4. 後片付け
conn.Close
Set conn = Nothing

‘ 成功メッセージ(デバッグ時のみ表示させるとスマートです)
‘ MsgBox “プロジェクトの保存情報をDBへ記録しました。”, vbInformation

Exit Sub

ErrorHandler:
MsgBox “DB記録中にエラーが発生しました: ” & Err.Description, vbCritical
If Not conn Is Nothing Then
if conn.State = adStateOpen Then conn.Close
End If
End Sub

4. コードのポイント解説(ここが上級者への分かれ道)

なぜ `Project_BeforeSave` なのか?

`AfterSave` ではなく `BeforeSave` を使う理由は、「保存しようとしているその瞬間の最新の状態」を確実にキャッチするためです。また、もしDBへの書き込みに失敗した場合に、保存自体をキャンセルさせる(`Cancel = True`)といった制御も可能になるからです。

`ProjectSummaryTask` の活用

`pj.ProjectSummaryTask.Cost` を使っています。これは、プロジェクト全体の情報を一行で取得できる「サマリータスク(行番号0)」にアクセスしています。個別のタスクをループで回す必要がないため、パフォーマンスが非常に高く、プロジェクトが数千行あっても一瞬で処理が終わります。

ベースラインのハンドリング

ベースラインは設定されていない場合にアクセスするとエラーを吐く、Project VBAの「落とし穴」の一つです。`if pj.Baselines.Count > 0` でチェックを入れることで、実行時エラーを防ぐ堅牢なコードにしています。

5. 陥りやすいエラーと対策

1. 接続エラー(Login Failed):
SQL Serverの権限設定を確認してください。Windows認証(`Integrated Security=SSPI`)を使っている場合、Projectを操作しているユーザー自身にDBへの書き込み権限が必要です。
2. 型が一致しません:
SQL文を組み立てる際、数値型(Cost)と文字列型(Name)のクォーテーション(`’`)の使い分けに注意してください。
3. 参照設定の欠如:
他の人のPCで動かした時に「ユーザー定義型が定義されていません」と出たら、ほぼ間違いなくADODBの参照設定漏れです。

最後に:このスキルの先にあるもの

おめでとうございます。これであなたは、「ファイルを保存する」という日常的な行為を、「エンタープライズデータの更新」へと進化させることができました。

このログが溜まれば、「どのプロジェクトが、いつ、予算オーバーの予兆を見せたのか」をSQLで集計し、Power BIなどのダッシュボードで全社的に可視化することも容易になります。

Project VBAは、Excel VBAよりもオブジェクトモデルが少し特殊ですが、そこが面白いところです。一つ一つのプロパティ(属性)が、現実のプロジェクト管理の概念と直結しているからです。

ここをクリアできれば、あなたの自動化スキルは間違いなく現場の宝になります。これからも、魂を込めたコードを書いていきましょう!

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