こんにちは、なかぜんです。
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、エラーハンドリングの注意が必須
- 業務に役立つ応用法も組み合わせると強力
「処理の信頼性を上げたい」「データ不整合を防ぎたい」と感じていた方にとって、今回の内容がヒントになればうれしいです。
それでは、また次回の記事でお会いしましょう♪
なかぜんでした!
