excel vba上的单元格更改错误

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Range = Range("A1") Then If Range("A1").Value <> Range("A2").Value Then Range("C1").Value = Range("C1").Value + 1 Range("A2").Value = Range("A1").Value End If End If End Sub 

这是代码,但是当我复制粘贴一个closures单元格,让我们说2列和3行它产生运行时错误13types不匹配在线

 If Target.Range = Range("A1") Then 

为什么? 我只是想要vba每次做一些事情,单元格A1改变A1的值本身就是一个excel总和公式

你会得到type-mismatch错误,因为你试图比较范围(包含许多单元格)单个单元格 。 如果你想在每次单元格A1改变时做一些事情,请使用下面的代码:

 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False On Error GoTo ErrHandler If Not Intersect(Target, Range("A1")) Is Nothing Then If Range("A1").Value <> Range("A2").Value Then Range("C1").Value = Range("C1").Value + 1 Range("A2").Value = Range("A1").Value End If End If ExitHere: Application.EnableEvents = True Exit Sub ErrHandler: Resume ExitHere End Sub 

还要注意我正在使用Application.EnableEvents = False – 对于使用它的Worksheet_Change事件来说,这是一个很好的习惯。 它可以防止每次更改事件处理程序代码中的任何单元时,无限的代码自行触发。

UPD:

顺便说一句, the value of A1 itself is an excel sum formula – 你不能使用上述方法跟踪公式的变化。 我详细介绍了如何在此问题中执行此操作: 使用Worksheet_Calculate事件来跟踪公式的更改

Simoco的答案应该适合你。 另一种方式(我通常使用的方式,只是出于习惯)是比较地址:

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = Range("A1").Address Then If Range("A1").Value <> Range("A2").Value Then Range("C1").Value = Range("C1").Value + 1 Range("A2").Value = Range("A1").Value End If End If End Sub 

您正在收到错误,因为Target.Range未定义。 您应该只引用Target(Range对象)或Target.Address(Range对象的地址)。 其次,取决于上下文,Range(“A1”)引用单元格A1本身(Range对象)或单元格A1(文字值)中的值。 你需要仔细想想你想比较什么。

如果像你所说的那样,只要Range(“A1”)中的值发生变化就要进行比较,那么你应该遵循Simoco的build议。