Excel VBA 逆引き集 | トランザクション風処理

Excel VBA
スポンサーリンク

トランザクション風処理

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ならキャンセル」。
  • 実務で安心 → 大量データや複数シート更新でも安全に処理できる。

👉 この「トランザクション風処理テンプレ」をベースにすれば、実務での「まとめて更新」「途中でエラーが出ても元に戻す」といった安全な処理が可能になります。

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