【问题标题】:Is there a way to check for duplicate values in Excel WITHOUT using the CountIf function?有没有办法在不使用 CountIf 函数的情况下检查 Excel 中的重复值?
【发布时间】:2012-03-27 03:38:54
【问题描述】:

这里的很多解决方案都涉及使用CountIf 来查找重复项。但是,当我有一个包含 100,000 多个值的列表时,CountIf 通常需要几分钟来搜索重复项。

有没有更快的方法来使用 CountIf 在 Excel 列中搜索重复项没有

谢谢!

编辑 #1:
在阅读了 cmets 和回复后,我意识到我需要更详细地介绍。假设我是一名观鸟者,在我从观鸟之旅返回后,我将旅行中看到的 1 到 25 或 50 只新鸟输入到我的“看到的鸟类总表”中。这确实是一个动态增长的列表,每次添加时,我都想确保不会复制列表中已经存在的内容。

因此,在我的文件的 A 列中是鸟类的名称。 B-M 列可能包含鸟类的其他属性。我想知道我最近一次观鸟旅行后刚刚在 A 列中添加的鸟是否已经存在于我列表中的其他地方。而且,如果是这样,我会手动合并 2 个条目的数据,并在仔细审查后丢弃一些并保留一些。我显然不想在我的数据库中有同一只鸟的重复条目。

所以,最终我想知道其他地方是否存在重复项,如果有重复项,请告诉我要查看哪一行(或突出显示或着色两个重复项)。

【问题讨论】:

  • 在这种情况下,您可以使用Data Validation 来防止您输入重复的鸟名。见here

标签: vba excel duplicates


【解决方案1】:

据我所知(如果您使用 Excel 2007/2010/2011)最快的方法是使用 Data (In Ribbon) |删除重复项以查找重复项的总数或删除重复项。您可能希望在测试之前将数据移动到临时表。

第二快的方法是使用 Countif。现在 Countif 可以以多种方式用于查找重复项。以下是两种主要方式。

1) 在数据旁边插入一个新列并放入公式并简单地将其复制下来。

2) 在条件格式中使用 Countif 来突出显示重复的单元格。更多详情,请查看此链接。

suggestions for a macro to find duplicates in a SINGLE column

编辑:

我的道歉:)

Countif 是第三快的方式!

第二快的方法是使用数据透视表;)

您查找重复项的主要目的到底是什么?你想删除它们吗?或者你想突出它们吗?还是别的什么?

跟进

好像我在公式中打错了。是的,对于大量行,CountIf 确实按照您的建议需要几分钟。

让我看看我能否提供一个 VBA 代码来满足您的确切需求。

席德

【讨论】:

  • 我对我的问题添加了更多编辑以回答您的问题。我不想删除它们,只需突出显示它们,以便我可以手动查看它们。请看我添加了什么。
  • @phan:那么你需要的是我上面提到的条件格式。有关详细信息,请参阅此链接 :) stackoverflow.com/questions/9469438/… 我也在上面的帖子中更新了此链接。
  • 有没有办法通过在鸟名旁边的列中添加字母“X”来“标记”行,而不是突出显示重复条目?我刚刚意识到,如果我在超过 100,000 个列表中突出显示单元格,我将不得不进行大量滚动。但是,如果我用标记标记该行,比如“X”,我可以使用“X”过滤器并查看重复的条目。
  • @phan:哇!你正在做的就是大量的观鸟活动! :D 在这种情况下,请选择第一个选项,在其中插入一列并添加 countif 公式并过滤值 > 然后 1。
  • 好的,你是说我必须使用 CountIf?我的整个问题是我是否可以避免它......
【解决方案2】:

您可以使用 VBA - 以下函数在不到一秒的时间内返回 100,000 个列表中的唯一条目列表。用法:选择一个范围,输入公式 (=getUniqueListFromRange(YourRange)) 并使用 CTRL+SHIFT+ENTER 进行验证。

Public Function getUniqueListFromRange(parRange As Range) As Variant
' Returns a (1 to n,1 to 1) array with all the values without duplicates

  Dim i As Long
  Dim j As Long
  Dim locKey As Variant
  Dim locData As Variant
  Dim locUniqueDict As Variant
  Dim locUniqueList As Variant

  On Error GoTo error_handler
  locData = Intersect(parRange.Parent.UsedRange, parRange)

  Set locUniqueDict = CreateObject("Scripting.Dictionary")

  On Error Resume Next
  For i = 1 To UBound(locData, 1)
    For j = 1 To UBound(locData, 2)
      locKey = UCase(locData(i, j))
      If locKey <> "" Then locUniqueDict.Add locKey, locData(i, j)
    Next j
  Next i

  If locUniqueDict.Count > 0 Then
    ReDim locUniqueList(1 To locUniqueDict.Count, 1 To 1) As Variant
    i = 1
    For Each locKey In locUniqueDict
      locUniqueList(i, 1) = locUniqueDict(locKey)
      i = i + 1
    Next
    getUniqueListFromRange = locUniqueList
  End If

error_handler:         'Empty range

End Function

【讨论】:

  • 很好 - 字典方法也可以有效地用于标记重复项。这可能比其他方法更快 - 更像是 O(n) 而不是 O(n^2)。
【解决方案3】:

如果使用 Excel 2007 或更高版本(可能来自 100,000 多个值),您可以选择:

首页标签 |条件格式 > 突出显示单元格规则 > 重复值...

右键单击突出显示的单元格并按选定的单元格颜色过滤以仅显示重复项(请注意,但条件格式可能会很慢)。

或者运行此代码并过滤彩色单元格,这只需一秒钟即可处理 100,000 个单元格:

Sub HighlightDupes()

Dim i As Long, dic As Variant, v As Variant

Application.ScreenUpdating = False
Set dic = CreateObject("Scripting.Dictionary")

i = 1
For Each v In Selection.Value2
    If dic.exists(v) Then dic(v) = "" Else dic.Add v, i
    i = i + 1
Next v

Selection.Font.Color = 255
For Each v In dic
    If dic(v) <> "" Then Selection(dic(v)).Font.Color = 0
Next v

End Sub

附录

要仅选择没有代码或公式的重复值,我发现此方法很有用:

数据标签 |高级过滤器... 就地过滤,仅唯一记录,OK。

现在选择唯一值的范围并按 Alt+; (转到特殊...仅可见单元格)。使用此选择清除过滤器,您将看到所有未选择的单元格都是重复的,然后您可以按 Ctrl+9(隐藏行)仅显示重复项。如果需要,可以将这些行复制到另一个工作表或用“X”标记。

【讨论】:

  • +1 关于高级过滤器的好建议。不幸的是,高级过滤器在处理大量行时也会花费大量时间。
  • 谢谢,这是真的,高级过滤器在对大型选择进行过滤时并不那么快,但至少在我的系统上它仍然比填写 =COUNTIF($A$2:A2,A2) 快(使用 Excel 在 20,000 行上大约 5 秒对 9 秒) 2010),复制到另一个范围时速度要快得多。
【解决方案4】:

当你找到他们时,你没有提到你想做什么。如果你只是想看看他们在哪里......

Sub HighLightCells()
   ActiveSheet.UsedRange.Cells.FormatConditions.Delete
   ActiveSheet.UsedRange.Cells.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual,  Formula1:=ActiveCell
   ActiveSheet.UsedRange.Cells.FormatConditions(1).Interior.ColorIndex = 4
End Sub

【讨论】:

  • 我在我的问题中添加了更多信息以解决您的问题。
【解决方案5】:

通过数据验证防止重复
您可以使用数据验证来防止输入重复的鸟名。 See Debra Dalgelish's site这里

处理现有的重复项
我的免费Duplicate Master addin会让你

  • 选择
  • 颜色
  • 列表
  • 删除

重复。

但更重要的是它会让你运行比精确字符串更复杂的匹配,即

  • 不区分大小写/区分大小写的搜索(示例如下)
  • 修剪/清理数据
  • 删除所有空格(包括 CHAR(160))请参阅下面的“mapgie”和“magpie”示例
  • 运行正则表达式匹配(例如,下面的示例将 s$ 替换为 "" 以删除复数)
  • 匹配任何列组合(即 A 列、所有列、A 列和 B 列等)

【讨论】:

    【解决方案6】:

    我很惊讶没有人提到 RemoveDuplicates 方法。

    ActiveSheet.Range("A:A").RemoveDuplicates Columns:=1
    

    这将简单地删除 A 列中活动工作表上的所有重复条目。运行需要几毫秒(用 200k 行测试)。请注意,这将严格删除所有重复的条目。虽然这不是最初问题的措辞,但我相信这仍然符合您的目的。

    【讨论】:

    • 好东西,这是在最近的版本中实现的吗?
    【解决方案7】:

    查找唯一值的一种简单方法是使用高级过滤器并仅过滤唯一值,然后将它们复制并粘贴到其他工作表中,因为当删除枢轴时,您将获得包含重复项的整个数据。

    【讨论】:

      【解决方案8】:

      对范围进行排序 并在下一列中输入 `=if(a2=a1;1;if(a2=a3;1;0))

      “1”表示重复。

      【讨论】:

        猜你喜欢
        • 2019-06-17
        • 1970-01-01
        • 2015-05-11
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多