【问题标题】:excel vba on cell change errorexcel vba关于单元格更改错误
【发布时间】:2014-04-11 11:41:46
【问题描述】:
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

这就是代码,但是当我复制粘贴一个偏移单元格时,比如说 2 列和 3 行 它在行上产生运行时错误 13 类型不匹配

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

为什么? 我只是想让 vba 在每次单元格 A1 更改时做一些事情 A1的值本身就是一个excel求和公式

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您会收到类型不匹配错误,因为您尝试将 范围(包含许多单元格)单个单元格 进行比较。如果您想在每次单元格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 - 您无法使用上述方法跟踪 公式 的变化。我在这个问题中详细介绍了如何做到这一点:Using Worksheet_Calculate event for tracking changes of formula

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 它不起作用,因为 OP 说 i copy paste a set off cell, let's say 2 columns and 3 rows,在这种情况下 Target.Address 会是这样的:$A$1:$B$3,这显然不等于 $A$1
      • 显然。您对他正在做的事情的阅读可能与我对它的阅读不同,但我的阅读是,他希望仅在他做出影响 A1 中的公式的更改时才触发它(因此原始代码中的 equals 语句)而不是当他做出可能包括 A1 的更改时。当然,我可能是错的。
      【解决方案3】:

      由于未定义 Target.Range,您会收到错误消息。您应该只引用 Target(范围对象)或 Target.Address(范围对象的地址)。其次,根据上下文, Range("A1") 指的是单元格 A1 本身(范围对象)或单元格 A1 中的值(文字值)。您需要仔细考虑要与什么进行比较。

      如您所说,如果您希望在 Range("A1") 中的值发生变化时进行比较,那么您应该遵循 Simoco 的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-22
        相关资源
        最近更新 更多