変更前のセルの値を元に戻す【ExcelVBA】
Application.Undoメソッドでユーザーの動作を1つ元に戻し、元に戻したセルの値をOffset(0,1)で1列隣のセルに入れる
Undoで動作を戻した際にChangeイベントが発生しないようにApplication.EnableEvents = Falseを事前に入れ
イベントの発生をさせないようにし、終了後、Application.EnableEvents = Trueでイベントを元に戻す
全体ではなく指定した範囲のセルを変更した場合のみ実行させたいのでApplication.Intersectを使用して
Target(変更したセル)と指定した範囲の重なる部分がNothingであれば終了し
重なる部分があれば、指定した範囲内を変更したということですので実行するという形式で実践。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
実際に使用したサンプルコード
Private Sub Worksheet_Change(ByVal Target As Range)
'条件分岐
If Application.Intersect(Target, Range("C6", "C19")) Is Nothing Then Exit Sub
'条件分岐2
If Target.Count <> 1 Then
'イベントを一旦無効にします
Application.EnableEvents = False
'ユーザーの動作を1つ戻す
Application.Undo
'メッセージボックスで警告を出す
MsgBox "複数セルは変更できません"
'イベントを有効に戻す
Application.EnableEvents = True
Exit Sub
End If
'移動後のセルの場所をセットする
Dim 移動後セル As Range
Set 移動後セル = ActiveCell
'イベントを一旦無効にします
Application.EnableEvents = False
'変更した後の値を変数に入れておく
Dim 変更後の値 As Long
変更後の値 = Target.Value
'ユーザーの動作を1つ戻す
Application.Undo
'前回の値を前々回の値に入れる
Target.Offset(0, 2).Value = Target.Offset(0, 1).Value
'元に戻ったセルの値を横のセルに入れる
Target.Offset(0, 1).Value = Target.Value
'変更した後の値をセルに戻す
Target.Value = 変更後の値
'移動後のセルに戻す
移動後セル.Select
'イベントを有効に戻す
Application.EnableEvents = True
End Sub