こんにちは!エンジニアリングの世界へようこそ。
今日は、少し背伸びをした「上級者向け」のテーマに挑戦してみましょう。
「マクロの記録」を卒業し、いよいよ実務でバリバリとシステム連携をこなすフェーズに来たあなたなら、「ファイル保存と外部データベース(SQL Server)への記録の同期」という高い壁に直面したことがあるはずです。
「Projectの `.mpp` ファイルは保存できたのに、SQL Serverへの書き込みでエラー落ちした……。結果、ファイルだけが更新されてデータベースと不整合を起こした!」
……こんな悪夢のような状況、エンジニアなら誰しも冷汗をかいた経験があるのではないでしょうか。
今回は、Project VBAとSQL Serverのトランザクションログを巧みに連携させ、「両方成功するか、完全になかったこと(ロールバック)にするか」の二者択一を完璧にコントロールする極意を伝授します。
ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に到達します。一緒に優しく、深く、紐解いていきましょう!
—
1. なぜ「ファイル保存」と「DB記録」の同期は難しいのか?
私たちが普段扱う MS Project のファイル(.mpp)と、企業の基幹データを支える SQL Server は、全く住む世界が違います。
- MS Project: ローカルまたは共有サーバー上の「ファイル」
- SQL Server: トランザクション管理された「リレーショナルデータベース」
VBAからこの二つを同時に操作する場合、次のようなタイムラグや障害が発生します。
[VBAの指示] ──> ① Projectファイルを保存 (.mpp)
──> ② SQL Serverへ進捗やコストをINSERT/UPDATE
もしここでエラーが発生したら…
①だけが保存されて、DBは古いまま! (データ崩壊)
この絶望的な状況を防ぐために、「SQL Server側のトランザクション(ACID特性)」の仕組みをVBAからコントロールし、さらにProject側の保存失敗時にも適切に対応する「ロールバック機構」を構築する必要があるのです。
—
2. 全体アーキテクチャのイメージ
今回目指す仕組みの心臓部は、ADO(ActiveX Data Objects)を使ったSQL Serverへの接続と、トランザクションの明示的な制御(`BeginTrans` / `CommitTrans` / `Rollback`)です。
[処理の流れ]
1. SQL Serverとのコネクション確立 & トランザクション開始
2. 試しにDB側へデータを書き込む(この時点ではまだ確定しない)
3. Projectファイル (.mpp) を上書き保存する
4. もし3でエラーが起きたら ──> DBの変更を「ロールバック(取消)」!
5. 全て成功したら ──> DBの変更を「コミット(確定)」!
「ここをクリアすれば、Project VBAの基本はバッチリですよ!」
難しく聞こえるかもしれませんが、一つひとつの部品は決まったお決まりのパターン(定石)があります。安心してついてきてくださいね。
—
3. 実装コード:トランザクション連携・ロールバック処理の全貌
それでは、開発現場でそのままコピペして使える実用的なVBAコードを公開します。
エラーハンドリング(`On Error GoTo`)を駆使して、安全性を極限まで高めたプロ仕様のコードです。
Sub SaveProjectWithSQLTransaction()
Dim conn As Object
Dim sqlStr As String
Dim isProjectSaved As Boolean
‘ エラーハンドラーの有効化
On Error GoTo ErrorHandler
isProjectSaved = False
‘ —————————————————-
G1. SQL Serverへの接続とトランザクション開始
‘ —————————————————-
Set conn = CreateObject(“ADODB.Connection”)
‘ ※実際の環境に合わせて接続文字列(ConnectionString)を変更してください
conn.ConnectionString = “Provider=SQLOLEDB;Server=your_server_name;Database=your_db_name;Uid=your_user;Pwd=your_password;”
conn.Open
‘ トランザクションの開始(ここから手動制御)
conn.BeginTrans
‘ —————————————————-
2. SQL Serverへのデータ書き込み(例:プロジェクト基本情報の同期)
‘ —————————————————-
sqlStr = “UPDATE ProjectMaster SET LastSavedDate = GETDATE() WHERE ProjectName = ‘” & ActiveProject.Name & “‘”
conn.Execute sqlStr
‘ —————————————————-
3. Projectファイルの保存処理
‘ —————————————————-
‘ あえてここで何らかの理由で保存に失敗するシチュエーションを想定(例:書き込み禁止など)
ActiveProject.FileSave
isProjectSaved = True ‘ 保存成功フラグを立てる
‘ —————————————————-
4. すべて成功したのでコミット(確定)
‘ —————————————————-
conn.CommitTrans
MsgBox “プロジェクトの保存とデータベースの同期が正常に完了しました!”, vbInformation, “成功”
GoTo CleanUp
ErrorHandler:
‘ —————————————————-
5. 異常発生時のロールバック処理(緊急避難)
‘ —————————————————-
Dim errDesc As String
errDesc = Err.Description
‘ コネクションが開いており、トランザクションが走っている場合のみロールバック
If Not conn is Nothing Then
If conn.State = 1 Then
conn.RollbackTrans
MsgBox “エラーが発生したため、データベースの変更をロールバックしました。” & vbCrLf & _
“詳細: ” & errDesc, vbCritical, “ロールバック実行”
End If
End If
‘ もしProjectファイルが中途半端に保存されてしまった場合のケア(必要に応じて)
If isProjectSaved Then
‘ 警告ログなどを残す処理をここに記述
End If
CleanUp:
‘ —————————————————-
6. 資源の解放(メモリリーク防止の鉄則)
‘ —————————————————-
On Error Resume Next
If Not conn Is Nothing Then
If conn.State = 1 Then conn.Close
End If
Set conn = Nothing
On Error GoTo 0
End Sub
—
4. コードの深掘りポイントとエンジニアの知見
このコードが「なぜ現場で信頼されるのか」、重要なポイントをいくつか解説します。
① `On Error GoTo` とロールバックの連動
VBAにおけるエラーハンドリングは、いわばシステムの「安全ネット」です。コードの途中でエラーが発生して処理が中断されたとき、そのまま放置すると SQL Server 側は「ロックされた状態(宙ぶらりんの状態)」になってしまいます。
必ず `Error Handler` 内で `conn.RollbackTrans` を呼び出すことで、データベースの整合性を守るのがプロの作法です。
② 明示的なフラグ管理 (`isProjectSaved`)
「ファイル保存」と「DB書き込み」のどちらを先にやるべきか、というアーキテクチャ上の議論があります。
一般的に、ファイルI/O(ディスクへの書き込み)はDB操作よりも失敗する確率が高いため(ファイルが別の人に開かれている、権限がない等)、「先にDBのトランザクションを張ってからファイルを保存する」のが安全なアプローチです。
万が一ファイル保存に失敗した瞬間に `isProjectSaved = False` のままエラーに飛び、DB側を確実にロールバックさせることができます。
③ クリーンアップ処理の徹底 (`CleanUp`)
オブジェクトの開放(`Set conn = Nothing`)をサボると、VBAのメモリ内にゴミが残り、繰り返しマクロを実行した際にエクセルの強制終了やパフォーマンス低下を引き起こします。エラーが起なかろうが起なかろうが、必ず最後に掃除をしてからプロシージャを抜けるのが鉄則です。
—
5. まとめ
今回は、Project VBAとSQL Serverのトランザクションログを連携させた、高度なロールバック処理について解説しました。
- ファイル保存とDB書き込みは別世界のもの。そのままではデータ不整合の危険がある。
- `BeginTrans` と `RollbackTrans` を使い、失敗時はすべてを巻き戻す仕組みを作る。
- エラーハンドリングとメモリのクリーンアップを徹底し、実用に耐えうる堅牢なコードを書く。
「ここをクリアすれば、Project VBAの基本はバッチリですよ!」
このレベルのコードを自在に操れるようになれば、単なるマクロ作成者ではなく、信頼される「業務自動化アーキテクト」への扉が大きく開かれます。
ぜひご自身の開発環境でも試して、エラーに強い堅牢なシステム構築を体感してみてくださいね。あなたのVBAライフが、より一層エキサイティングなものになりますように!
