Project VBAを掌握せよ:SQL Serverとタスク構造を同期させる「双方向データ更新エンジン」の極意
こんにちは。現場で泥水をすすりながらVBAの限界を突破してきたエンジニアです。
皆さんは「Project VBA」と聞いて何を思い浮かべますか?「マクロの記録」で生成される不格好なコード? それとも「使いにくい」という先入観でしょうか。
今日は、そんなVBAのイメージを覆す、「SQL ServerとMicrosoft Projectをリアルタイムに同期させる双方向エンジン」の設計思想をお伝えします。ここをクリアすれば、あなたはもう「マクロを使う人」ではなく、プロジェクトの命運をデータで握る「アーキテクト」です。
—
1. なぜ「同期」が必要なのか?
プロジェクト管理において、Projectは「スケジュールを見るためのインターフェース」であり、SQL Serverは「組織の全資産を蓄積する真実のソース(Single Source of Truth)」であるべきです。
人がファイルを開いて手動で書き込む時代は終わりました。「保存時に自動同期」する仕組みこそが、ヒューマンエラーを根絶する唯一の解です。
—
2. アーキテクチャの心臓部:Projectのイベントを捉える
Projectには、ファイル保存を検知する `ProjectBeforeSave` というイベントがあります。これを利用し、保存の瞬間にデータを外部へ「プッシュ」します。
基本的な実装パターン
`ThisProject` モジュールに以下のコードを記述してください。
‘ プロジェクト保存直前に実行されるイベント
Private Sub Project_BeforeSave(ByVal pj As Project, ByVal SaveAsUi As Boolean, Cancel As Boolean)
On Error GoTo ErrHandler
‘ 同期エンジンを呼び出す
Call SyncProjectToSQL(pj)
Exit Sub
ErrHandler:
MsgBox “同期に失敗しました: ” & Err.Description, vbCritical
Cancel = True ‘ 保存を中断する
End Sub
—
3. SQL Serverと対話する:ADOの魔法
VBAからデータベースを叩くには、`ADODB`(ActiveX Data Objects)を使います。プロジェクトのタスク情報をループで回し、SQLの `UPDATE` 文を投げる。この際、「UID(タスク固有ID)」をキーにするのが鉄則です。
同期ロジックの核となるコード
Public Sub SyncProjectToSQL(pj As Project)
Dim conn As Object
Dim tsk As Task
Dim strSQL As String
Set conn = CreateObject(“ADODB.Connection”)
‘ 接続文字列(環境に合わせて変更してください)
conn.Open “Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DBName;Integrated Security=SSPI;”
For Each tsk In pj.Tasks
If Not tsk Is Nothing Then
‘ 存在確認してUPDATE、なければINSERTする「Upsert」処理
strSQL = “UPDATE Tasks SET TaskName = ‘” & tsk.Name & “‘, ” & _
“Start = ‘” & tsk.Start & “‘ WHERE TaskUID = ” & tsk.UniqueID
conn.Execute strSQL
End If
Next tsk
conn.Close
Set conn = Nothing
End Sub
—
4. 初学者が陥りやすい「3つの落とし穴」
ここを乗り越えれば、あなたのコードはプロレベルです。
1. 「無限ループ」の罠
`ProjectBeforeSave` の中でさらに保存命令を出すと、イベントが再帰的に呼ばれアプリが固まります。データの書き込みは「静かに行う」のが鉄則です。
2. 「Nothing」の甘い罠
`pj.Tasks` をループする際、削除されたタスクや空の行に遭遇することがあります。`If Not tsk Is Nothing Then` の判定を忘れると、実行時エラーでプロジェクトが強制終了します。
3. 「パフォーマンス」の無視
数千件のタスクを1件ずつ `conn.Execute` すると遅延が発生します。本番環境では、トランザクション処理やバッチ処理を検討してください。
—
5. 最後に:双方向同期へのステップアップ
今回紹介したのは「プッシュ(Project → SQL)」の片方向ですが、これを逆にする「プル(SQL → Project)」を組み合わせることで、真の双方向同期エンジンとなります。
- プル処理のコツ: SQL Server側の変更履歴テーブルを作成し、プロジェクトを開くとき(`Project_Open` イベント)に、最新の差分だけを `Task.SetField` で流し込む。
「コードを書くこと」が目的ではありません。「プロジェクトという複雑な生命体を、データという血液で循環させること」が、私たちの仕事です。
まずは、このコードをコピーして、ご自身の環境で小さなタスクを同期させてみてください。その瞬間に、プロジェクト管理の景色が変わるはずです。
応援しています。困ったときは、またいつでも聞きに来てくださいね。
