突出显示修改后的单元格

Highlighting modified cell

我试图通过宏突出显示从 "a" 修改为 "b" 的列中的单元格(应排除从空白到 "a" 的更改)。谁能帮帮我?

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
Dim KeyCells As Range
Set KeyCells = Range("A:A")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
ActiveCell.Select
Application.Run ("color")
End If
End Sub

Sub color()
With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .color = 255
    .TintAndShade = 0
    .PatternTintAndShade = 0
End With
End Sub

以上代码还突出显示了已编辑单元格下方的单元格。

您可以使用 SelectionChange 事件获取 before 更改的值,然后像这样添加您的条件。

请注意,如果打开工作簿时在目标范围内选择了一个单元格,并且您更改了值而不先更改选择,则此代码将提前退出,因为 ValBeforeChange 的值尚未设置然而。

您可以通过多种方式解决这个问题。您可以向 Workbook_Open 事件添加一些内容到 运行 SelectionChange 例程 您可以使 ValBeforeChange 成为全局变量并设置它最初在 Workbook_Open 事件中,或者您可以将突出显示代码重构为具有 "before" 和 "after" 属性的 class,在打开时实例化一个 class 对象并关闭时清理它。

以下是添加条件检查的方法:

modified from "a" to "b" (should exclude the changes from blank to "a")

Dim ValBeforeChange as String

Private Sub Worksheet_SelectionChange(ByVal Target as Range)
    ValBeforeChange = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    If Not Len(ValBeforeChange) > 0 Then Exit Sub
    If Target.Value = ValBeforeChange Then Exit Sub
    Dim KeyCells As Range
    Set KeyCells = Range("A:A")
    If Application.Intersect(KeyCells, Target) Is Nothing Then Exit Sub
    Highlight Target
End Sub

Sub Highlight(ByRef Target as Range)
    With Target.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

其实我不想添加新的答案。因为这个答案是 CBRF23 的答案的一个小修改。根据他们的意见,我决定添加新的答案,因为我认为这个问题没有得到正确的答案。

我的回答有什么新内容。没什么特别的。但我对代码进行了格式化,我添加了空白值检查并删除了突出显示

在这里,您可以看到不同的代码。

Dim ValBeforeChange As String

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    ValBeforeChange = Target.Value

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.ScreenUpdating = False

    If Not Len(ValBeforeChange) > 0 Then
        Exit Sub
    End If

    If Target.Value = ValBeforeChange Then
        Exit Sub
    End If

    If Application.Intersect(Range("A:A"), Target) Is Nothing Then
        Exit Sub
    End If

    If Target.Value <> "" Then
        Highlight Target, vbRed
    Else
        Highlight Target, xlNone
    End If

End Sub

Sub Highlight(ByRef Target As Range, ByVal colorValue As Variant)

    With Target.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .color = colorValue
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With

End Sub

Dim ValBeforeChange As String

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    ValBeforeChange = Target.Value

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.ScreenUpdating = False

    

    If ValBeforeChange ="" Then
        Exit Sub
    End If
    IF ValBeforeChange <> Target.Value Then
    
    If Application.Intersect(Range("A:A"), Target) Is Nothing Then
    Application.Run("Color")    
    End If
  
    End If
    

End Sub

这段代码运行良好,谢谢大家的帮助:)