2017-03-29 183 views
0

我想突出显示单元格,当有3个或更多具有相同的值时,我有下面的代码,但它不能正常工作,因为它循环两次到每个范围。有人能告诉我什么是错的吗?通过过滤范围循环excel vba

Sub HighlightCells() 
Dim k As Integer, myCounter As Integer, firstRow As Integer 
Dim myClientExport As Worksheet, myTemplate As Variant 
Dim vRange As Range, myRange As Range 
Dim myAddr As String 

Set myClientExport = Excel.ActiveSheet 
Set vRange = myClientExport.UsedRange.SpecialCells(xlCellTypeVisible) 


firstRow = vRange.Areas(2).Rows(1).Row 
myAddr = Cells(firstRow, 4).Value 
myCounter = 0 
For Each myRange In vRange.Rows 
    k = myRange.Row 

    If k > firstRow Then 
     If myAddr = Cells(k, 4).Value Then 
      myCounter = myCounter + 1 
     Else 
      myAddr = Cells(k, 4).Value 
      myCounter = 0 
     End If 
     Select Case myCounter 
      Case 3 

       For i = 0 To 2 
        OId = Cells(k - i, 1).Value 
       Next i 
       Cells(k, 4).Interior.ColorIndex = 27 
       Cells(k - 1, 4).Interior.ColorIndex = 27 
       Cells(k - 2, 4).Interior.ColorIndex = 27 
      Case Is > 3 
       Cells(k, 4).Interior.ColorIndex = 27 
     End Select 
    End If 
Next myRange 
End Sub 

My data unfiltered look like:

My data filtered look like

我想强调有3个或更多激活指令状态的所有地址。

+0

你可能需要添加它如何您的数据(过滤,过滤的)看起来像 – user3598756

+0

很难按照你的逻辑代码的一些例子,请加载数据的屏幕截图样本和期望的结果 –

+0

谢谢你,我只是添加了未经过滤和过滤的可能数据样本。 – Luisxv

回答

0

我无法让您的代码正常工作。马上我在firstRow = vRange.Areas(2).Rows(1).Row上得到“应用程序定义的或对象定义的”运行时错误。

所以我做的是E列中的CountIf公式: =COUNTIF(D$2:D$7,D2)然后设置条件格式。如果范围是动态的,请使用VBA确定限制并传播公式和条件格式。例如:

Dim rCount As Integer 
rCount = Range("D1", Range("D2").End(xlDown)).Rows.Count 
Range("D2:D" & rCount).Select 
Selection.Cells.FormatConditions.Delete 
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$E2=3" 
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
With Selection.FormatConditions(1).Interior 
    .PatternColorIndex = xlAutomatic 
    .Color = 65535 
    .TintAndShade = 0 
End With 
Selection.FormatConditions(1).StopIfTrue = False 
Range("E2:E" & rCount).Select 
Selection.Formula = "=CountIf($D$2:$D$" & rCount & ", $D2)" 
+0

哦,我没有得到任何错误,但它没有做我所需要的。你的代码不能解决它,我正在过滤范围。我在原始文章中添加了一个未经过滤的数据样本,也许这可以让您更好地了解我想要的内容。谢谢。 – Luisxv

+0

测试我的过滤行上的代码,并据我所知,它的工作原理。隐藏的记录被忽略,输出适合你的例子。 – June7

+0

对不起,但它不起作用。它很接近,但是,只需要计算可见记录,但是每个可见记录的计数器中都包含隐藏的匹配记录。这意味着,如果其中一个可见记录有1行可见,2隐藏,则您的代码计数为3,并在确实不应考虑时强调该记录。我会弄清楚我是否可以对其进行修改,使其完全符合我的需求。非常感谢你,你的代码是一种可能的方式。 – Luisxv

0

您可以尝试这样的事情,看看是否适用于您。 代码将在F列中放置一个CountIFs公式并最终删除它。 您可以按照您的要求调整代码。

Sub HighlightFilteredCells() 
Dim sws As Worksheet 
Dim lr As Long 
Dim cell As Range 
Set sws = Sheets("Sheet1") 
If sws.FilterMode Then sws.ShowAllData 
lr = Cells(Rows.Count, 1).End(xlUp).Row 
sws.Range("F2:F" & lr).Formula = "=COUNTIFS($D$2:$D$" & lr & ",D2,$E$2:$E$" & lr & ",""Active"")" 
sws.Columns(5).Interior.ColorIndex = xlNone 
With sws.Rows(1) 
    .AutoFilter field:=5, Criteria1:="Active" 
    If sws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then 
     For Each cell In sws.Range("F2:F" & lr).SpecialCells(xlCellTypeVisible) 
      If cell.Value >= 3 Then cell.Offset(0, -1).Interior.Color = vbYellow 
     Next cell 
    End If 
End With 
sws.Columns(6).Clear 
End Sub