仅当单元格值实际上不同时才触发'Worksheet_Change'事件

时间:2018-03-09 12:45:44

标签: excel vba excel-vba events onchange

我编写了代码来从特定页面的URL中提取数据。 我第一次运行代码时会将数据从URL提取到单元格C1

我想在每个单元格值发生变化时显示MsgBox

例如:

  • 我第一次运行代码"Happy"被提取到单元格C1 (单元格值发生变化,因此msgbox“值已更改”)

  • 第二次运行代码然后"Happy"被提取到单元格C1 (意思是没有变化,注意到了)

  • 第三次运行代码,"Sad"被提取到单元格C1,
    所以在这一点上,我想要一个msgbox的细胞更改。

我尝试了以下代码,但即使在单元格中更改了相同的值,它也会显示msgbox。

例如 - 单元格包含文本"Happy"。我在单元格中重写"Happy"并按Enter键,因此尽管单元格中的文本相同,但它显示的单元格的msgbox已更改。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

    ' The variable KeyCells contains the cells that will
    ' cause an alert when they are changed.
    Set KeyCells = Range("A1:C10")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
        ' Display a message when one of the designated cells has been 
        ' changed.
        ' Place your code here.
        MsgBox "Cell " & Target.Address & " has changed."
    End If
End Sub

3 个答案:

答案 0 :(得分:5)

这使用html来检查单元格的先前值是什么,然后将其与新值进行比较。

这也是区分大小写,因此Undo。如果您它区分大小写,请删除HAPPY = HAPpy函数。

请注意,(任何)这些程序(包括您的程序)不会对多个单元格一次更改(如粘贴在一系列单元格中)做出正确反应,但您可以添加代码来处理但是你需要在注释掉的行中进行演示。

但是对于单细胞,这将起到作用:

strconv

更多信息:

答案 1 :(得分:1)

试试这样:

Public PrevValue

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Value <> PrevValue Then
    MsgBox ("value changed")
    PrevValue = Target.Value
End If
End Sub

以前的值现在存储在全局变量中。当值发生变化时,它首先检查该值是否与前一个值相同。

编辑: 如果每次更改不同的单元格,也可以使用

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
PrevValue = Target.Value
End Sub

在更改之前设置当前选定的单元格的值。

答案 2 :(得分:1)

替换:

If Not Application.Intersect(KeyCells, Range(Target.Address))

使用:

If Not Application.Intersect(KeyCells, Target)