トランザクション風処理
Excel VBAにはデータベースのような「トランザクション(開始→コミット→ロールバック)」機能はありません。ですが、「まとめて処理して、途中でエラーが出たら元に戻す」という「トランザクション風」の仕組みを作ることは可能です。初心者向けに、コード例とテンプレートをかみ砕いて説明します。
基本の考え方
- 処理前の状態をバックアップ
→ 配列や変数にコピーしておく。 - まとめて処理
→ 複数セルや複数行を一括で変更。 - エラーが出たら元に戻す
→ バックアップを使って復元。 - 成功したら確定
→ バックアップは破棄して終了。
テンプレ1:セル更新をトランザクション風に処理
Sub TransactionLikeProcess()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("A2:A10")
Dim backup As Variant: backup = rg.Value ' バックアップ
On Error GoTo Rollback
' まとめて処理(例:値を2倍)
Dim v As Variant: v = rg.Value
Dim r As Long
For r = 1 To UBound(v, 1)
v(r, 1) = v(r, 1) * 2
Next r
rg.Value = v
' 正常終了 → コミット
MsgBox "処理完了"
Exit Sub
Rollback:
' エラー発生 → ロールバック
rg.Value = backup
MsgBox "エラーが発生したため元に戻しました"
End Sub
VB- ポイント:
backupに元の値を保存。- エラーが出たら
Rollback:にジャンプして復元。 - 正常終了なら「コミット」扱い。
テンプレ2:複数シートをまとめて更新 → エラー時に復元
Sub TransactionLike_MultiSheet()
Dim ws1 As Worksheet: Set ws1 = Worksheets("Sheet1")
Dim ws2 As Worksheet: Set ws2 = Worksheets("Sheet2")
Dim backup1 As Variant: backup1 = ws1.Range("A2:A10").Value
Dim backup2 As Variant: backup2 = ws2.Range("B2:B10").Value
On Error GoTo Rollback
' Sheet1更新
ws1.Range("A2:A10").Value = "更新済"
' Sheet2更新(ここでエラーが出る可能性あり)
ws2.Range("B2:B10").Value = "更新済"
MsgBox "処理完了"
Exit Sub
Rollback:
ws1.Range("A2:A10").Value = backup1
ws2.Range("B2:B10").Value = backup2
MsgBox "エラーが発生したため両方のシートを元に戻しました"
End Sub
VB- ポイント: 複数シートでも同じ考え方。バックアップを取っておけば安全。
テンプレ3:ユーザー操作をトランザクション風に扱う
Sub TransactionLike_UserAction()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("C2:C10")
Dim backup As Variant: backup = rg.Value
Dim ans As VbMsgBoxResult
ans = MsgBox("数量をすべて+10します。よろしいですか?", vbYesNo)
If ans = vbYes Then
Dim v As Variant: v = rg.Value
Dim r As Long
For r = 1 To UBound(v, 1)
v(r, 1) = v(r, 1) + 10
Next r
rg.Value = v
MsgBox "処理完了"
Else
rg.Value = backup
MsgBox "キャンセルしました(元に戻しました)"
End If
End Sub
VB- ポイント: ユーザーに確認を取って「Yesならコミット」「Noならロールバック」。
例題で練習
'例1:セル更新をトランザクション風に処理
Sub Example1()
TransactionLikeProcess
End Sub
'例2:複数シートをまとめて更新
Sub Example2()
TransactionLike_MultiSheet
End Sub
'例3:ユーザー操作をトランザクション風に扱う
Sub Example3()
TransactionLike_UserAction
End Sub
VB初心者向けポイント
- VBAには本物のトランザクションはない → 自分で「バックアップ&復元」を作る。
- On Error GoToでエラー処理 → エラー時に復元する仕組みを作れる。
- バックアップは必須 → 元に戻すために必ず保存しておく。
- ユーザー確認もトランザクション風 → 「Yesなら確定」「Noならキャンセル」。
- 実務で安心 → 大量データや複数シート更新でも安全に処理できる。
👉 この「トランザクション風処理テンプレ」をベースにすれば、実務での「まとめて更新」「途中でエラーが出ても元に戻す」といった安全な処理が可能になります。
