トランザクション風処理
データベースの世界では「トランザクション処理」といって、一連の処理が全部成功したら確定、途中で失敗したら全部取り消すという仕組みがあります。
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で 複数処理をまとめて「成功なら確定」「失敗なら元に戻す」」という仕組み を簡単に作成できます。
