自动将Sheet 1 A1:A2复制到Sheet 2 A1:A2当Sheet1 A1:A2更改时

时间:2013-07-21 00:02:10

标签: vba excel-vba excel

目标:如果工作表1上A1:A2中的任何值发生变化,则表2中A1:A2中的值应自动使用这些值更新。以下表1事件处理程序无法工作:

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
像往常一样,VBA令人头脑发麻的不透明语法是我的垮台。任何有关实现上述简单任务的建议都将受到赞赏,因为它将引用VBA参考指南,该指南实际上对解释VBA的隐藏细节非常有用。

1 个答案:

答案 0 :(得分: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