こんにちは。現場の最前線でプロジェクト管理の自動化を設計している、チーフアーキテクトです。
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よりもオブジェクトモデルが少し特殊ですが、そこが面白いところです。一つ一つのプロパティ(属性)が、現実のプロジェクト管理の概念と直結しているからです。
ここをクリアできれば、あなたの自動化スキルは間違いなく現場の宝になります。これからも、魂を込めたコードを書いていきましょう!
