【入門編】DAO.Recordsetの「Update」失敗時のロールバック処理とトランザクション管理 – Access VBA解析バイブル

スポンサーリンク

Access VBAで「データが壊れる」を防ぐ!トランザクション管理の鉄則

こんにちは。Accessの現場で泥臭いトラブルをいくつも乗り越えてきた、一人のエンジニアとしてお話しします。

Access VBAで「テーブルAに書き込み、次にテーブルBに書き込む」という処理を書くとき、もしテーブルBの書き込みでエラーが起きたらどうなるでしょう? テーブルAにはデータが残り、テーブルBには何も書かれない――そんな「不完全なデータ」がデータベースを蝕みます。

これを防ぐのが「トランザクション」です。今日は、あなたの書くコードを「プロ仕様」に変える、不可欠な技術を伝授します。

1. トランザクションとは「安全な一括払い」

トランザクションを簡単に言うと、「処理のグループ化」です。

  • 開始 (BeginTrans): ここからが「ひとまとめの作業」ですよ!
  • 確定 (CommitTrans): すべて成功しました。データベースに反映してください!
  • 破棄 (Rollback): あ、エラー発生! なかったことにしてください!

この3ステップを使いこなすだけで、あなたのAccessアプリの信頼性は劇的に向上します。

2. 実践!DAO.Recordsetを使った堅牢なコード

では、現場でそのまま使える「型」を見てみましょう。`DBEngine(0)(0)`を使ってデータベースを操作します。

Public Sub UpdateDataWithTransaction()
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset

‘ エラーが発生したらエラー処理へジャンプ
On Error GoTo ErrorHandler

‘ ワークスペースとデータベースの設定
Set ws = DBEngine(0)
Set db = CurrentDb

‘ 【重要】トランザクションの開始
ws.BeginTrans

‘ テーブルAの更新
Set rs1 = db.OpenRecordset(“T_売上ヘッダー”, dbOpenDynaset)
rs1.AddNew
rs1!受注日 = Date
rs1.Update

‘ テーブルBの更新(あえてエラーを誘発するような処理をここに書くイメージ)
Set rs2 = db.OpenRecordset(“T_売上明細”, dbOpenDynaset)
rs2.AddNew
rs2!商品ID = 9999 ‘ 仮に存在しないIDを入れるなど
rs2.Update

‘ 全て成功したら確定
ws.CommitTrans
MsgBox “更新が正常に完了しました。”, vbInformation

ExitProc:
‘ 後始末(必ず実行する)
If Not rs1 Is Nothing Then rs1.Close
If Not rs2 Is Nothing Then rs2.Close
Set rs1 = Nothing: Set rs2 = Nothing
Exit Sub

ErrorHandler:
‘ 【重要】エラー発生時はロールバック
ws.Rollback
MsgBox “エラーが発生したため、処理を中断しました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical
Resume ExitProc
End Sub

3. なぜ「エラー処理」が必須なのか?

初心者がやりがちなのは、`ws.BeginTrans` だけ書いて `Rollback` を忘れるケースです。これではエラーが起きたとき、データベースのロックが解除されず、「アプリがフリーズした」「他の人がデータを開けない」といった致命的な事態を招きます。

ここが極意:

1. 必ず `On Error GoTo` を置く: エラーを無視してはいけません。無視すると、データベースは「まだ作業中かな?」と待ち続けてしまいます。
2. `ws.Rollback` を迷わず呼ぶ: `Rollback` を呼ぶことで、VBAは「あ、今の作業は全部無効ね」と判断し、データベースの状態をクリーンな状態に巻き戻してくれます。
3. `Exit Sub` の前に `Resume` を置く: 正常時も異常時も、最後にオブジェクトを閉じる(Close)処理を必ず通すように設計しましょう。

4. 最後に:エンジニアとしての心構え

「データが消えた」「二重登録された」というトラブルは、現場で最もエンジニアを冷や汗をかかせる瞬間です。しかし、今日紹介したトランザクションを実装していれば、そのような事故は未然に防げます。

「プログラムは常に失敗するもの」という前提でコードを書く。これが、マクロの記録を卒業し、真の自動化エンジニアへと至る第一歩です。

まずは、既存のコードにこの `BeginTrans` と `Rollback` の枠組みを一つ入れてみてください。たったそれだけで、あなたの書くAccess VBAは、今日から一気に「プロの品質」に近づきますよ。

質問があれば、いつでも聞いてくださいね。応援しています!

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