有条件地格式化范围

时间:2015-09-28 16:21:18

标签: excel vba excel-vba excel-2007

我想要比较两个数据范围,如果匹配则会格式化。所以我想格式化一个范围1单元格,如果任何数据与范围2中的数据匹配。这是我到目前为止 - 它一直工作,直到我将数据更改为范围2但不更新它:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim myRange As Range, cell As Range
Set myRange = Range("a9:a12")

For Each cell In myRange
If cell.Value = ActiveCell.Value And Not IsEmpty(ActiveCell.Value) Then
ActiveCell.Interior.ColorIndex = 3

End If
Next cell
End Sub

问题是单元格仍然保留了从第一个代码块格式化的颜色,那么如果第二个范围内的数据发生变化,如何更改它呢?

  Private Sub Worksheet_Change(ByVal Target As Range)
  Dim myRange1 As Range
  Set myRange1 = Range("f9:f12")

  If Not Intersect(Target, Range("f1:f6")) Is Nothing Then
  If Application.WorksheetFunction.CountIf(myRange1,   ActiveCell.Value) > 0 _
  Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.Color =   xlNone
  End If
End Sub

2 个答案:

答案 0 :(得分:3)

这是你在尝试的吗?

If cell.Value = ActiveCell.Value And _
Not IsEmpty(ActiveCell.Value) Then
    ActiveCell.Interior.ColorIndex = 3
Else
    ActiveCell.Interior.Color = xlNone
End If

修改

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim myRange As Range

    Set myRange = Range("a9:a12")

    If Application.WorksheetFunction.CountIf(myRange, ActiveCell.Value) > 0 _
    Then ActiveCell.Interior.ColorIndex = 3 Else ActiveCell.Interior.Color = xlNone
End Sub

修改

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim myRange As Range
    Set myRange = Range("f9:f12")

    If Not Intersect(Target, myRange) Is Nothing Then
        If Application.WorksheetFunction.CountIf(myRange, Target.Value) > 0 _
        Then Target.Interior.ColorIndex = 3 Else Target.Interior.Color = xlNone
    End If
End Sub

答案 1 :(得分:0)

您的循环似乎采用了一种效率低下的路线,而忽略了提供给您的其中一种工具(例如目标)。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'important for _SelectionChange event macros
    'only process the cells to the extents of the data, not whole rows or columns
    If Not Intersect(Target, Target.Parent.UsedRange) Is Nothing Then
        Dim c As Range
        For Each c In Intersect(Target, Target.Parent.UsedRange)
            c.Interior.ColorIndex = 3 + _
                4145 * IsError(Application.Match(c.Value2, Range("A9:A12"), 0))
        Next c
    End If
End Sub

对于Worksheet_SelectionChange事件宏,目标表示一个或多个当前选择的单元格。通过循环选择当前选择中的每个单元格,可以在更大的范围内执行此伪条件格式。目标或选择可以是任意数量的单元格,直到工作表中的单元格总数,但ActiveCell property只能是单个单元格。

我已将/ color off开关上的颜色缩小为单个工作表MATCH function和一些小数学。这消除了循环标准单元格。

因为您可能希望在某个时刻选择整个行或列,所以我已经包含了一个单元处理“限制”,它将处理工作表上数据的范围。如果没有要处理的单元格上限,则在使用Worksheet_SelectionChange时很容易陷入对空行单元格的整行或列进行不必要的处理。

Worksheet_SelectionChange cell formatting