您当前正在使用Worksheet_SelectionChange事件宏来识别何时选择了完整的单行。您需要一个Worksheet_Change事件宏,以便 Sheet2 识别 B1:B15 范围内的值何时已更改并将更改传递回 Sheet1。
因为 Worksheet_Change 是在值更改时触发的,所以您需要禁用Application.EnableEvents 属性,以便在从 Sheet1 的 Worksheet_SelectionChange 子中写入值时不会触发它。
您将需要几个公共变量。一个用来记住更改应该返回到的位置,另一个用来定位 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 中声明的公共范围类型变量来记录值从 Sheet1 传输到 Sheet2 的最后位置。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 进行更改。