スポンサーリンク

Access VBAで実践!トランザクション管理の設計と実装テクニック

スポンサーリンク
Access
スポンサーリンク

こんにちは、なかぜんです。

Accessで複数のテーブルに対して一括更新を行うとき、「途中でエラーが出たらどうしよう…」「データが中途半端に更新されてしまったら困る…」と不安になった経験はありませんか?

そんなときに力を発揮するのが「トランザクション管理」です。VBAでもしっかり設計・実装することで、業務の信頼性がグッと高まります。

この記事では、トランザクションの基本から実務で使えるVBA実装例、よくある落とし穴や応用ポイントまで、丁寧にご紹介します。


スポンサーリンク

トランザクションとは?

トランザクション=「ひとまとまりの処理」

データベースにおけるトランザクションとは、「複数の処理をまとめて一つの処理単位として扱う」考え方です。

すべてが成功したら確定(コミット)、一部でも失敗したら取り消し(ロールバック)することで、データの整合性を保ちます。

Access VBAでもトランザクション制御は可能

DAO(Data Access Objects)を使えば、Access VBAでも以下の3ステップでトランザクション管理ができます:

  • BeginTrans:トランザクション開始
  • CommitTrans:処理確定(コミット)
  • Rollback:処理取消し(ロールバック)

VBAによるトランザクションの実装例

具体例:受注データと在庫データを一括更新

以下は、受注テーブルと在庫テーブルを同時に更新する処理の例です。どちらかでエラーが出たら全体をロールバックします。

Sub UpdateOrderAndStock()

    Dim db As DAO.Database
    Dim rsOrder As DAO.Recordset
    Dim rsStock As DAO.Recordset

    On Error GoTo ErrHandler

    Set db = CurrentDb
    db.BeginTrans  ' トランザクション開始

    ' 受注データ更新
    Set rsOrder = db.OpenRecordset("T_受注", dbOpenDynaset)
    rsOrder.FindFirst "注文ID = 1001"
    If Not rsOrder.NoMatch Then
        rsOrder.Edit
        rsOrder!数量 = rsOrder!数量 + 5
        rsOrder.Update
    End If
    rsOrder.Close

    ' 在庫データ更新
    Set rsStock = db.OpenRecordset("T_在庫", dbOpenDynaset)
    rsStock.FindFirst "商品ID = 2001"
    If Not rsStock.NoMatch Then
        rsStock.Edit
        rsStock!在庫数 = rsStock!在庫数 - 5
        rsStock.Update
    End If
    rsStock.Close

    db.CommitTrans  ' 成功したので確定
    MsgBox "処理が正常に完了しました", vbInformation

Exit Sub

ErrHandler:
    db.Rollback  ' エラー時はロールバック
    MsgBox "エラーが発生しました:" & Err.Description, vbCritical
End Sub

コードのポイント解説

  • db.BeginTrans で処理開始
  • 各レコードセット操作のあと Update を忘れずに
  • エラー発生時は Rollback で処理をキャンセル
  • 最終的に CommitTrans で確定させます

よくある注意点とミス

1. UpdateやEditの記述漏れ

Edit しても Update を忘れると変更が反映されません。

2. レコードが存在しない場合の処理

NoMatch チェックを怠ると、存在しないレコードに対して処理を続けようとしてエラーになります。

3. Rollbackし忘れ

エラー処理部分で Rollback を忘れると、意図しないデータが残ってしまう危険性があります。


応用編:複数処理の集約やログ出力

1. ログテーブルと組み合わせて管理性アップ

処理の前後で「いつ」「誰が」「何を」行ったかを記録するログ機能と組み合わせると、より実務的です。

2. モジュール化して汎用化

トランザクション処理を関数やクラスモジュールとしてまとめておくと、再利用性が高くなります。

3. SQL文ベースでのトランザクションも可能

VBAから db.Execute "UPDATE ~" を使って直接SQL文で更新する場合もトランザクションの対象にできます。

db.BeginTrans
db.Execute "UPDATE T_受注 SET 数量 = 数量 + 5 WHERE 注文ID = 1001", dbFailOnError
db.Execute "UPDATE T_在庫 SET 在庫数 = 在庫数 - 5 WHERE 商品ID = 2001", dbFailOnError
db.CommitTrans

dbFailOnError を指定することで、エラー時に即座にVBAのエラー処理へ飛ばせます。


まとめ:トランザクションを使いこなして業務の信頼性アップ!

今回はAccess VBAでのトランザクション管理について、基本から応用まで幅広くご紹介しました。

  • トランザクションで「全部成功 or 全部取り消し」が可能
  • VBAでは BeginTrans~CommitTrans~Rollback で制御
  • UpdateやNoMatch、エラーハンドリングの注意が必須
  • 業務に役立つ応用法も組み合わせると強力

「処理の信頼性を上げたい」「データ不整合を防ぎたい」と感じていた方にとって、今回の内容がヒントになればうれしいです。

それでは、また次回の記事でお会いしましょう♪
なかぜんでした!