捕获工作表更改事件中的最终更改

时间:2018-01-23 03:28:42

标签: excel vba excel-vba

在工作表(1)中,我有多个计划更改单元格,A1和其他单元格,其他单元格值取决于我设置函数时的A1值(例如,B1 = A1 + 1)。这样,如果我改变A1的值,其他单元格也会改变值,并且总改变的单元格将是A1加上其他改变的单元格。但是,作为"其他细胞的数量"当我在VBA中运行以下函数时,它非常大:

Private Sub Worksheet_Change(ByVal Target As Range)
    Cells(Target.Cells.Count, 21) = "ok"

End Sub 

第21列将出现3" ok" s,因为大单元格的变化按顺序发生,它激活了Worksheet_Change函数的三倍。 (第一个确定我改变A1,第二个用于更新功能的时间延迟,第三个用于最后一个单元格)但是,我只希望Worksheet_Change在我改变A1的值后捕获最终单元格的变化,我该怎么办?做以避免以前捕获Worksheet_Change函数?

2 个答案:

答案 0 :(得分:0)

将代码修改为仅在A1更改时运行。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = Range("A1").Address Then
        Cells(1, 21).Value = "ok"
    End If
End Sub 

答案 1 :(得分:0)

目标通常不只是一个单元格。确定其中一个更改的单元格是否为带有相交的A1,然后仅处理A1。

如果您打算在同一工作表上更改值,请暂时关闭事件处理,以便Worksheet_Change不会尝试在其自身上运行。

Private Sub Worksheet_Change(ByVal Target As Range)
    if not intersect(target, range("a1")) is nothing then
        on error goto safe_exit
        application.enableevents = false
        dim trgt as range
        for each trgt in intersect(target, range("a1"))
            Cells(trgt.row, 21) = "ok"
        next trgt
    end if
    safe_exit:
        application.enableevents = true
End Sub

由于我不相信a1是你现实世界中Target的实际目标,因此我已经使代码比它可能需要的更加冗长。