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

Excel VBA
スポンサーリンク

トランザクション風処理

データベースの世界では「トランザクション処理」といって、一連の処理が全部成功したら確定、途中で失敗したら全部取り消すという仕組みがあります。
Excel VBAには本格的なトランザクション機能はありませんが、「トランザクション風」に見せることは可能です。
初心者向けに、コード例やテンプレートをかみ砕いて説明します。


基本の考え方

  • 目的:
    • 複数の処理をまとめて「成功なら確定」「失敗なら元に戻す」
  • Excelでの工夫:
    • 変更前の値をバックアップしておく
    • エラーが出たらバックアップを復元する
    • 成功したらバックアップを破棄する

テンプレ1:セル更新のトランザクション風処理

Sub TransactionLike_UpdateCells()
    On Error GoTo ErrHandler
    
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim backup1 As Variant, backup2 As Variant
    
    ' 変更前の値をバックアップ
    backup1 = ws.Range("A1").Value
    backup2 = ws.Range("B1").Value
    
    ' 一連の処理(例:セル更新)
    ws.Range("A1").Value = "更新後A"
    ws.Range("B1").Value = "更新後B"
    
    ' 故意にエラー発生(存在しないシート参照)
    Worksheets("NoSheet").Activate
    
    ' 正常終了
    MsgBox "処理成功!変更を確定しました。"
    Exit Sub
    
ErrHandler:
    ' エラー時はバックアップを復元
    ws.Range("A1").Value = backup1
    ws.Range("B1").Value = backup2
    
    MsgBox "エラー発生!変更を元に戻しました。"
End Sub
VB
  • ポイント:
    • 変更前の値を変数に保存しておく。
    • エラーが出たら復元して「なかったこと」にする。

テンプレ2:複数行の更新をトランザクション風に扱う

Sub TransactionLike_UpdateRows()
    On Error GoTo ErrHandler
    
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim backupRange As Variant
    
    ' 更新対象範囲をバックアップ
    backupRange = ws.Range("A1:B5").Value
    
    ' 一連の処理
    ws.Range("A1:B5").Value = "更新後"
    
    ' 正常終了
    MsgBox "処理成功!変更を確定しました。"
    Exit Sub
    
ErrHandler:
    ' エラー時はバックアップを復元
    ws.Range("A1:B5").Value = backupRange
    MsgBox "エラー発生!変更を元に戻しました。"
End Sub
VB
  • ポイント:
    • 範囲をまとめて Variant に保存できる。
    • 復元も一括で可能。

テンプレ3:ファイル操作のトランザクション風処理

Sub TransactionLike_File()
    On Error GoTo ErrHandler
    
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' バックアップコピーを作成
    fso.CopyFile "C:\temp\data.xlsx", "C:\temp\data_backup.xlsx"
    
    ' 一連の処理(例:ファイル削除)
    fso.DeleteFile "C:\temp\data.xlsx"
    
    ' 正常終了
    MsgBox "処理成功!変更を確定しました。"
    ' バックアップを削除
    fso.DeleteFile "C:\temp\data_backup.xlsx"
    Exit Sub
    
ErrHandler:
    ' エラー時はバックアップを復元
    fso.CopyFile "C:\temp\data_backup.xlsx", "C:\temp\data.xlsx"
    MsgBox "エラー発生!ファイルを元に戻しました。"
End Sub
VB
  • ポイント:
    • ファイル操作は「バックアップコピー」を作っておく。
    • エラー時はバックアップから復元。

テンプレ4:共通の「トランザクション風」関数を作る

Sub RunTransactionLike()
    On Error GoTo ErrHandler
    
    Log "処理開始"
    
    ' Step1
    Call Step1
    ' Step2
    Call Step2
    
    Log "処理成功!確定"
    Exit Sub
    
ErrHandler:
    Log "エラー発生!ロールバック"
End Sub

Sub Step1()
    Log "Step1 実行"
    ' 何かの処理
End Sub

Sub Step2()
    Log "Step2 実行"
    ' 故意にエラー
    Err.Raise 1001, , "Step2でエラー"
End Sub

Sub Log(ByVal msg As String)
    Debug.Print Format(Now, "yyyy-mm-dd HH:NN:SS") & " | " & msg
End Sub
VB
  • ポイント:
    • 「開始」「成功」「エラー」をログに残す。
    • 処理の流れが分かりやすくなる。

例題で練習

'例1:セル更新をトランザクション風に扱う
'例2:範囲更新をトランザクション風に扱う
'例3:ファイル操作をトランザクション風に扱う
'例4:共通ログ関数で処理の流れを記録
VB

初心者向けポイント

  • Excelには本物のトランザクションはない → バックアップ&復元で「風」にする
  • エラー処理と組み合わせるのが基本
  • セルや範囲はVariantに保存できる → 復元が簡単
  • ファイルはコピーを取っておく → ロールバック可能
  • ログを残すと流れが分かりやすい

👉 この「トランザクション風処理テンプレ」を覚えておけば、Excel VBAで 複数処理をまとめて「成功なら確定」「失敗なら元に戻す」」という仕組み を簡単に作成できます。

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