2017-03-29 224 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