vba - 检测单元格值是否确实通过编辑而更改

标签 vba excel

Worksheet_Change 在单元格值更改时触发(这就是我想要的),但当您输入单元格就像编辑它但实际上并未更改单元格的值时,它也会触发(这就是我不想发生的事情)。

假设我想向值已更改的单元格添加底纹。所以我编写了这样的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    Target.Interior.ColorIndex = 36
End Sub

现在测试我的工作:更改单元格 A1,该单元格将突出显示。这就是所需的行为。到目前为止,一切都很好。然后,双击 B1 但不要更改那里的值,然后单击 C1。您会注意到 B1 被突出显示!这不是期望的行为。

我是否必须执行此处讨论的捕获旧值的方法,然后在突出显示单元格之前将旧值与新值进行比较?我当然希望我遗漏了一些东西。

最佳答案

我建议在另一个工作表中自动维护工作表的“镜像副本”,以便与更改的单元格的值进行比较。

@brettdj 和 @JohnLBevan 本质上建议做同样的事情,但他们分别将单元格值存储在注释或字典中(确实为这些想法+1)。不过,我的感觉是,从概念上讲,在单元格中备份单元格比在其他对象中备份单元格要简单得多(尤其是注释,您或用户可能希望将其用于其他目的)。

所以,假设我有 Sheet1,用户可以更改其单元格。我创建了另一个名为 Sheet1_Mirror 的工作表(您可以在 Workbook_Open 中创建它,并且如果您愿意,可以将其设置为隐藏 - 由您决定)。首先,Sheet1_Mirror 的内容与 Sheet1 的内容相同(同样,您可以在 Workbook_Open 中强制执行此操作)。

每次触发 Sheet1Worksheet_Change 时,代码都会检查 Sheet1 中“已更改”单元格的值是否与实际不同在 Sheet1_Mirror 中。如果是这样,它会执行您想要的操作并更新镜像表。如果没有,那就没什么了。

这应该会让你走上正轨:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    For Each r In Target.Cells
        'Has the value actually changed?
        If r.Value <> Sheet1_Mirror.Range(r.Address).Value Then
            'Yes it has. Do whatever needs to be done.
            MsgBox "Value of cell " & r.Address & " was changed. " & vbCrLf _
                & "Was: " & vbTab & Sheet1_Mirror.Range(r.Address).Value & vbCrLf _
                & "Is now: " & vbTab & r.Value
            'Mirror this new value.
            Sheet1_Mirror.Range(r.Address).Value = r.Value
        Else
            'It hasn't really changed. Do nothing.
        End If
    Next
End Sub

关于vba - 检测单元格值是否确实通过编辑而更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064439/

相关文章:

VBA : Using a function to set a new sheet

excel - 引用 Outlook VBA 中的 Excel 单元格的应用程序定义或对象定义错误

excel - Excel中的交叉引用矩阵

excel - "Fuzzy Lookup"添加结果

vba - 使用VBA进行多列排序

excel - For循环删除具有特定单元格值条件的行

vba - 在 VBA 中设置对象的集合属性

excel - 无法在 Excel 2016 VBA 中使 Application.DisplayAlerts = False

excel - VBA - 循环遍历 Onedrive 上的文件夹

Excel,在一列中将一个范围附加到另一个范围的末尾