現在、Worksheet_SelectionChangeイベント マクロを使用して、1 行全体が選択されたことを認識しています。B1:B15 範囲の値がいつ変更されたかを認識し、その変更を Sheet1 に戻すには、Sheet2のWorksheet_Changeイベント マクロが必要です。
Worksheet_Change は値の変更時にトリガーされるため、Application.EnableEvents プロパティを無効にして、Sheet1 の Worksheet_SelectionChange サブから値を書き込んだときにトリガーされないようにする必要があります。
いくつかのパブリック変数が必要になります。1 つは変更を戻す位置を記憶するためのもので、もう 1 つは Sheet2 のターゲット セルを見つけるためのものです。これらは、モジュール コード シートでのみ公開できます。
Book1 - Module1 (コード)
Option Explicit
Public Const sRNG As String = "B1:B15"
Public rRNG As Range
元の Worksheet_SelectionChange にいくつかの小さな変更を加え、イベント処理の無効化を追加しました。
Book1 - Sheet1 (コード)
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = Columns.Count And Target.Rows.Count = 1 And _
CBool(Application.CountA(Target)) Then '<~~ one complete non-blank row
On Error GoTo bm_Safe_Exit
Application.EnableEvents = False
With Sheet2.Range(sRNG)
Set rRNG = Target.Cells(1, 1).Resize(.Columns.Count, .Rows.Count)
.Cells = Application.Transpose(rRNG.Value)
End With
End If
bm_Safe_Exit:
Application.EnableEvents = True
End Sub
Worksheet .CodeName プロパティを使用してSheet2を識別しました。これは、ワークシートの名前を慣習的に変更しても変更されないためです。
値が変更された後に値を返す行を特定する方法については、少し不明確です。Module1 で宣言された public range-type 変数を使用して、シート 1 からシート 2 に値が転送された最後の場所を記録しました。Sheet2 を変更すると、最後に記録された場所に戻ります。
Book1 - Sheet2 (コード)
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(sRNG)) Is Nothing Then
Debug.Print rRNG.Address(0, 0, external:=True)
On Error GoTo bm_Safe_Exit
Application.EnableEvents = False
rRNG = Application.Transpose(Range(sRNG).Value)
End If
bm_Safe_Exit:
Application.EnableEvents = True
End Sub
「記憶された」場所はメモリ内にのみあることに注意してください。ワークブックを閉じて再度開くと、実質的に「ゼロ」になります。Sheet1 から新たに値をロードしない限り、Sheet2 を変更しないでください。