Access VBAを掌握せよ:トランザクション処理で「データ不整合」という悪夢を断ち切る極意
こんにちは。システム開発の現場で、幾多の「データ消失」という修羅場を乗り越えてきたエンジニアです。
Access VBAを使っていると、最初は「動けばいい」という感覚でコードを書くかもしれません。しかし、業務の規模が大きくなると、ある日突然、「途中でエラーが起きて、半分だけデータが保存されてしまった」という致命的な事態に直面します。
これは、プロとして絶対に避けるべき「データ不整合」です。これを防ぐ唯一の方法が、トランザクション処理です。今回は、DAOを例に、確実に安全を担保する構造化エラーハンドリングの極意を伝授します。
—
1. トランザクションとは「全か無か」の契約である
トランザクションを簡単に言うと、「一連の処理を一つの塊として扱うこと」です。
- BeginTrans: 「ここから取引を開始するぞ!」という宣言。
- CommitTrans: 「すべて正常に完了。確定するぞ!」というサイン。
- Rollback: 「何かが起きた! 全部なかったことにする!」という緊急停止ボタン。
この「Rollback」をいかに確実に実行できるかが、一流のエンジニアとそうでない者の分かれ道です。
—
2. 現場で使える「鉄壁のトランザクション」雛形コード
初心者の方が陥りやすいのは、エラーハンドリングを省略したり、Rollbackを書き忘れたりすることです。以下のテンプレートをコピーし、自分のコードの「型」として体に叩き込んでください。
Public Sub SecureTransactionExample()
Dim db As DAO.Database
Dim ws As DAO.Workspace
‘ エラーが発生した時の飛込先を指定
On Error GoTo ErrorHandler
Set ws = DBEngine.Workspaces(0)
Set db = CurrentDb
‘ トランザクション開始
ws.BeginTrans
‘ — ここに業務ロジックを記述 —
db.Execute “INSERT INTO T_売上 (顧客ID, 金額) VALUES (1, 1000)”, dbFailOnError
db.Execute “UPDATE T_在庫 SET 在庫数 = 在庫数 – 1 WHERE 商品ID = 5”, dbFailOnError
‘ ——————————
‘ すべて成功したらコミット
ws.CommitTrans
MsgBox “処理が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
‘ エラーが発生した場合の処理
‘ ロールバック(開始時点の状態まで巻き戻す)
ws.Rollback
MsgBox “エラーが発生したため、処理を中断しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical
End Sub
このコードの「賢い」ポイント
1. `dbFailOnError`: `db.Execute`を実行する際、この定数を忘れないでください。これがないと、SQLが失敗してもAccessは「何事もなかったかのように」次の行へ進んでしまいます。
2. `On Error GoTo ErrorHandler`: これにより、どの行でエラーが起きても必ずErrorHandlerラベルに飛び、Rollbackを実行して安全を確保します。
3. `Exit Sub`: `ErrorHandler`の手前に必ず置いてください。成功した時にエラーハンドリング処理が走るのを防ぐための「門番」です。
—
3. 陥りやすい「罠」を知る
罠その1:Rollbackを忘れる
エラーが起きた際、Rollbackをしないと「中途半端な状態」で接続が残り続け、次の処理に悪影響を及ぼします。必ず`On Error`で逃げ道を作りましょう。
罠その2:DAOとADOの混同
今回紹介したのはDAO(Accessの標準的な操作)ですが、もしSQL Serverなどの外部データベースに接続する場合、ADOを使う必要があります。ADOの場合は`ws`ではなく`Connection`オブジェクトに対して`BeginTrans`を行います。用途に合わせて使い分けるのが「アーキテクチャを知る者」の嗜みです。
—
最後に:プロへの第一歩
トランザクション処理は、単なるコードのテクニックではありません。「ユーザーの大切なデータを守る」というエンジニアの誠実さの証明です。
「BeginTransからCommitTransの間には、必ずRollbackへの逃げ道を作る」
これさえ守れば、あなたの書くAccess VBAは格段に信頼性が高まります。もしエラーハンドリングで迷ったら、いつでもこの記事に戻ってきてください。皆さんの開発ライフが、より堅牢で素晴らしいものになることを応援しています!
