首页 > 解决方案 > 工作表选择更改事件的单元格突出显示

问题描述

我正在尝试在工作表中创建一个选择更改事件,如果单元格中有一个值,则将该单元格的内部颜色删除为无。但是,如果没有值,则保持原来的内部颜色相同。而且,我如何将选择更改事件限制为仅特定列(当然减去空单元格)。到目前为止,我能够想出的 vba 代码是:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  If Target.Value <> "" Then
     Target.Interior.Color = xlNone
  Else
     Target.Interior.Color = 13551615
  End If

End Sub

但是,当我在单元格中输入一些数据时,内部颜色并没有变为无。只有当我点击离开并重新点击该单元格时,内部颜色才会变为无。我需要做些什么来使更改立即生效,这样我就不必单击离开并单击返回?此外,如何写入限制以仅允许此选择更改发生在特定列而不是整个工作表中?

样本数据

标签: excelvba

解决方案


在单元格中输入值时,您的选择不会改变。如果要更改Interior.Color基于新值的值,则需要使用Worksheet.Change事件。

首先,关于选择更改应生效的范围的限制:

检查选择(目标)和范围,在您的情况下,G 列中的某些单元格 Intersect 然后,这是可选的,仅在选择一个单元格而不是更多单元格时进行更改。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Range("G2:G1000")) Is Nothing Then
        If Not Target.CountLarge > 1 Then
            If Target.Value <> "" Then
                Target.Interior.Color = xlNone
            Else
                Target.Interior.Color = 13551615
            End If
        End If
    End If
End Sub

要识别单元格值的更改,请将相同的代码放入Worksheet.ChangeEvent Sub 中:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("G2:G1000")) Is Nothing Then
        If Not Target.CountLarge > 1 Then
            If Target.Value <> "" Then
                Target.Interior.Color = xlNone
            Else
                Target.Interior.Color = 13551615
            End If
        End If
    End If
End Sub

此时,您可能应该将代码外包给单个子程序,并简单地从事件子程序中调用它。


推荐阅读