【问题标题】:Color code duplicate entries in a field of an excel using alternating colors使用交替颜色的 Excel 字段中的颜色代码重复条目
【发布时间】:2016-05-28 01:15:11
【问题描述】:

我已从 MySQL 数据库中提取重复列表到 Excel 工作表。此 excel 显示我们有重复的条目 (~1,900),有时基于 excel 表的单个字段的条目一式三份。

例如:

10019
10019
10048
10048
10060
10060

我怎样才能对重复的对进行着色,以便可以轻松地将它们可视化为每对的一对。基本上我想用交替的颜色填充每个重复的对,这样我就可以很容易地看到这些对。

【问题讨论】:

  • 类似的问题和答案在这里,stackoverflow.com/a/35252399
  • 有一个很好的 SUMPRODUCT functionISODD function 结合使用,可以形成一个很好的条件格式规则,但是 1900 行对于循环处理来说实在是太多了。计算滞后以分钟为单位,而不是秒。我建议一些 VBA 或帮助列。

标签: mysql vba excel duplicates


【解决方案1】:

您所说的过程称为“重复条带”。一对Scripting.Dictionary 对象应该很容易解决这个问题。

Sub colorDuplicateColor2()
    Dim d As Long, dODDs As Object, dEVNs As Object, vTMPs As Variant
    Dim bOE As Boolean
    
    Set dODDs = CreateObject("Scripting.Dictionary")
    Set dEVNs = CreateObject("Scripting.Dictionary")
    dODDs.CompareMode = vbTextCompare
    dEVNs.CompareMode = vbTextCompare
    
    With Worksheets("Sheet7")
        If .AutoFilterMode Then .AutoFilterMode = False
        
        With .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp))
            
            With .Columns(1)
                .Cells.Interior.Pattern = xlNone
            End With
            
            With .Resize(.Rows.Count - 1, 1).Offset(1, 0)
                vTMPs = .Value2
            End With
            
            For d = LBound(vTMPs, 1) To UBound(vTMPs, 1)
                'the dictionary Items have to be strings to be used as filter criteria
                If Not (dODDs.exists(vTMPs(d, 1)) Or dEVNs.exists(vTMPs(d, 1))) Then
                    If bOE Then
                        dODDs.Item(vTMPs(d, 1)) = CStr(vTMPs(d, 1))
                    Else
                        dEVNs.Item(vTMPs(d, 1)) = CStr(vTMPs(d, 1))
                    End If
                    bOE = Not bOE
                End If
            Next d
            
            With .Columns(1)
                .AutoFilter Field:=1, Criteria1:=dODDs.Items, Operator:=xlFilterValues
                .SpecialCells(xlCellTypeVisible).Interior.Color = RGB(210, 210, 210)
                'use this to band the entire row
                '.SpecialCells(xlCellTypeVisible).EntireRow.Interior.Color = RGB(210, 210, 210)
                'use this to band the row within the UsedRange
                'Intersect(.Parent.UsedRange, .SpecialCells(xlCellTypeVisible).EntireRow).Interior.Color = RGB(210, 210, 210)
                .AutoFilter
                .AutoFilter Field:=1, Criteria1:=dEVNs.Items, Operator:=xlFilterValues
                .SpecialCells(xlCellTypeVisible).Interior.Color = RGB(255, 200, 200)
                .Cells(1).EntireRow.Interior.Pattern = xlNone
            End With
            
        End With
        
        If .AutoFilterMode Then .AutoFilterMode = False
    End With
    
    dODDs.RemoveAll: Set dODDs = Nothing
    dEVNs.RemoveAll: Set dEVNs = Nothing
    Erase vTMPs

End Sub

数据当然必须按重复条件列排序。

      

这个过程可以很容易地针对整行或数据块内的行进行调整。

【讨论】:

  • 在对成对进行颜色编码时效果很好,我如何让它突出显示整行而不是单个单元格。
  • 我曾认为这可能会增加这个过程。您是指整行 (A:XFD) 还是数据块的范围(可能是第 1 行的列标题标签的限制)?
  • 我提供了两个替代方案,但不幸的是,我现在无法测试它们。
  • 最好将行着色为有列标题的宽度。
  • Work's great @Jeeped 除了它还突出显示了电子表格标题。
猜你喜欢
  • 1970-01-01
  • 2011-01-27
  • 2019-09-18
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2016-07-08
  • 2015-10-29
  • 2013-05-12
相关资源
最近更新 更多