突出显示基于某些单元格匹配的行

请原谅,如果我在这里期待太多,但我认为必须有一个更快的方式比我一直这样做。

所以我有电子表格,我必须根据某些列的条件(在这个例子中,列FGHIJK进行比较)sorting和匹配行,并突出显示匹配行的颜色,所以它不同于其他行,并继续这直到每一行都是彩色的。 以下是我需要的开始数据和理想结束的图像。

我的问题来自不知道如何告诉它来查看和比较适当的列。 如果我告诉它只看一列,我可以得到它的工作。 例如,如果我所看到的是J列,但是可以在图片中看到, J列可以在其他列中具有不同的variables,这会导致其颜色不同。 我希望这里有人可能知道一个更简单的方法来做这件事,因为我已经挣扎了几天,似乎没有得到什么快。

这里是我在网上find的代码,可以根据一个variables来改变行。 通过这个代码,它可以看到列J的RRR,并突出显示所有具有RRR的行,即使它们在其他列中匹配。

 Sub ChangeColor() lRow = Range("F" & Rows.Count).End(xlUp).Row Set MR = Range("F2:K" & lRow) For Each cell In MR If cell.Value Like "*RRR*" Then cell.EntireRow.Interior.ColorIndex = 20 Next End Sub 

( http://i.imgur.com/Nte31Bn.jpg ) Screentshot

编辑! 所以我已经能够根据一些反馈和想法在这里拼凑一个工作代码。 这不是最漂亮,但用户拜伦有一个惊人的更短,更快的代码,我可能会修补,以得到我所需要的。

 Sub Highlight_Duplicate_Entry() Range("AA2").Select ActiveCell.FormulaR1C1 = _ "=CONCATENATE(RC[-13],RC[-12],RC[-11],RC[-10],RC[-9],RC[-8])" Range("AA2").Select Selection.AutoFill Destination:=Range("AA2:AA279"), Type:=xlFillDefault Range("AA2:AA400").Select Dim cel As Variant Dim myrng As Range Dim clr As Long Set myrng = Range("AA2:AA" & Range("AA65536").End(xlUp).Row) myrng.Interior.ColorIndex = xlNone clr = 36 For Each cel In myrng If Application.WorksheetFunction.CountIf(myrng, cel) > 1 Then If WorksheetFunction.CountIf(Range("AA2:AA" & cel.Row), cel) = 1 Then cel.EntireRow.Interior.ColorIndex = clr clr = clr + 1 Else cel.EntireRow.Interior.ColorIndex = myrng.Cells(WorksheetFunction.Match(cel.Value, myrng, False), 1).Interior.ColorIndex End If End If Next lRow = Range("AA" & Rows.Count).End(xlUp).Row Set MR = Range("AA2:AA" & lRow) For Each cell In MR If cell.Value Like "*SMLS*" Then cell.EntireRow.Interior.ColorIndex = 20 Next Columns("AA:AA").Select Selection.ClearContents Range("K2").Select End Sub 

检测相同数据的范围相当容易。 标准的方法是使用将值连接在一起的@xQbert方法。 在VBA中,这很容易,因为有一个Join函数,它将把一个数组变成一个string。 这在Excel公式中更困难(或者更加繁琐),因为CONCATENATE需要分开单独的项目。

使用Join你可以创build一个“ID”,这个行就是所有连接在一起的单元格。 如果将其与Dictionary结合使用,则可以将所需的行颜色存储在此处,然后将该颜色应用于该行。

这里唯一困难的部分是决定要使用哪种颜色。 我目前只是做随机数字通常使可用的东西。 如果您知道需要多less种颜色,则可以将其扩展为使用颜色列表。

代码要求您添加引用( Tools->References )到Microsoft Scripting Runtime能使Dictionary工作。

 Sub ColorForUnique() 'must add a reference to Microsoft Scripting Runtime Dim dict As New Scripting.Dictionary 'build range from block of data 'only check columns F:K for matches Dim rng_match As Range Set rng_match = Intersect( _ Range("B2:M8"), _ Range("F:K")) Dim rng_row As Range For Each rng_row In rng_match.Rows Dim id As String id = Join(Application.Transpose(Application.Transpose(rng_row.Value)), "") If Not dict.Exists(id) Then dict.Add id, RGB(Application.RandBetween(0, 255), Application.RandBetween(0, 255), Application.RandBetween(0, 255)) End If rng_row.EntireRow.Interior.Color = dict(id) Next rng_row End Sub 

代码的限制/注释

  • 我正在使用双Transpose强制.Value是一个值的一维数组。 这和循环的使用.Rows意味着这只适用于连续的数据块。 如果所有的列不在一起,你可以build立一个不同的循环。

某些任意数据的结果图片显示所需的着色。 我使用你的列,这样你就可以运行这个代码。

之前

之前

后

编辑允许颜色select :这个代码可以很容易地扩展,以允许颜色select,而不是随机着色。 该Dictionary提供了一个很好的内置计数器,使用Dictionary.Count来播放多less个ID。 您可以将其用作select颜色的索引。 你也可以使用整数作为颜色来使用,尽pipe这些颜色不是那么理想。

修改颜色添加步骤以使用函数而不是随机数字:

 If Not dict.Exists(id) Then dict.Add id, GetColor(dict.Count + 1) End If 

然后定义GetColor函数来提供所需的颜色。 如果您喜欢,也可以用ColorIndex值填充。 如果你这样做,使用Interior.ColorIndex更改颜色。 这个函数有两个选项。 一个是随机颜色,另一个则是从ColorBrewer调色板返回颜色。

 'random colors always Function GetColor(index As Integer) As Long GetColor = RGB(Application.RandBetween(0, 255), _ Application.RandBetween(0, 255), Application.RandBetween(0, 255)) End Function 'first 10 colors from the ColorBrewer palette Function GetColor(index As Integer) As Long Dim colors(1 To 10) As Long colors(6) = RGB(166, 206, 227) colors(1) = RGB(31, 120, 180) colors(7) = RGB(178, 223, 138) colors(3) = RGB(51, 160, 44) colors(8) = RGB(251, 154, 153) colors(2) = RGB(227, 26, 28) colors(9) = RGB(253, 191, 111) colors(4) = RGB(255, 127, 0) colors(10) = RGB(202, 178, 214) colors(5) = RGB(106, 61, 154) 'protect against bad index If index > UBound(colors) Or index < LBound(colors) Then GetColor = RGB(255, 255, 255) Else GetColor = colors(index) End If End Function