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

Akh*_*ary 1 excel events vba onchange excel-vba

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

我正处于我想要显示MsgBox每当单元格值更改的位置.

例如:

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

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

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

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

例如 - 单元格包含文本"Happy".我"Happy"在单元格中重写并按下回车键,因此尽管单元格中的文本相同,但它显示的单元格的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
Run Code Online (Sandbox Code Playgroud)

ash*_*awg 5

这用于Undo检查单元格的先前值是什么,然后将其与新值进行比较.

也不是区分大小写的HAPPY = HAPpy.如果您希望它区分大小写,请删除这些strconv函数.

请注意,(任何)这些过程(包括您的过程)将无法对多个单元格一次更改做出正确反应(如粘贴在一系列单元格中),但您可以添加代码来处理,但是您需要按照注释中的说明进行操作线.

但对于单细胞,这将起到诀窍:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim KeyCells As Range, vNew, vOld

    If Target.Cells.Count > 1 Then
        MsgBox ("multiple cells changed: " & vbLf & Target.Address)
        'to handle multiple cells changing at omce you'll need to loop like:
        ' dim c as cell
        ' for each c in Target.Cells
        ' ... etc
        Exit Sub
    End If

    Set KeyCells = Range("A1:C10") ' cells to watch

    If Not Application.Intersect(KeyCells, Target) Is Nothing Then

        vNew = Target.Value
        Application.EnableEvents = False
        Application.Undo
        vOld = Target.Value
        Target.Value = vNew
        Application.EnableEvents = True

        'make sure value is different (NOT case sensitive)
        If StrConv(vNew, vbLowerCase) <> StrConv(vOld, vbLowerCase) Then

            'do something here
            MsgBox "Cell " & Target.Address & " changed" & vblf & _
                "From: " & vOld & vblf & _
                "To:   " & vNew

        End If
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

更多信息:

  • @AkhilChaudhary:如果您对答案感到满意,请不要忘记将其标记为已接受,原因有两个:1.它会关闭查询.提供答案的人会得到答案 (2认同)