0

Objective: If any values in A1:A2 on sheet 1 change, then the values in A1:A2 on sheet 2 should automatically update with these values. The following sheet 1 event handler fails to work:

Private Sub Worksheet_Calculate()

Application.EnableEvents = False

Dim target As Range
Set target = Range("A1:A2")

    If Not Intersect(target, Sheets(2).Range("A1:A2")) Is Nothing Then
        Range("A1:A2").Value = Sheets(2).Range("A1:A2").Value
    End If

Application.EnableEvents = True

End sub

As usual, VBA's mind-numbingly opaque syntax is my downfall. Any advice in implementing the above simple task would be appreciated, as would referral to a VBA reference guide that is actually useful in explaining the hidden minutia of VBA.

4

1 回答 1

1

正如其他人所说,您需要将事件处理程序放在要监视的工作表中。

Worksheet_Change将响应用户所做的更改。如果单元格因其他原因发生更改,例如公式计算,则不调用此事件。

Worksheet_Calculate将响应重新计算的工作表。它不知道工作表上的哪些单元格发生了变化。要在您的用例中使用它,要么复制单元格并接受它会做一些不必要的复制,要么跟踪A1:A2您自己的值以在更改时复制

关于您的代码的注释:

  • Range引用您的代码所在的工作表的不合格引用。 Me.
  • CodeName无论用户如何称呼或移动它,您都可以引用工作表来引用特定工作表。
  • 试图Intersect在不同的工作表上做一个范围是没有意义的,而且会出错
  • Sheets(1)并且Sheet1可能不是同一个工作表。集合索引按照Sheets工作表在 Excel 中的显示顺序,并且可以由用户更改。

这是您的代码的重构(将其放在 Sheets 1 模块中以将工作表 1 上的更改复制到工作表 2)

Private Sub Worksheet_Calculate()
    If Sheet2.Cells(1, 1).Value <> Me.Cells(1, 1).Value Or _
       Sheet2.Cells(1, 2).Value <> Me.Cells(1, 2).Value Then

       Application.EnableEvents = False
       Sheet2.Range("A1:A2").Value = Me.Range("A1:A2").Value
       Application.EnableEvents = True
    End If

End Sub
于 2013-07-21T00:50:50.190 回答