有没有办法在Excel中检查重复值而不使用CountIf函数?

时间:2012-03-09 17:16:20

标签: excel vba excel-vba duplicates

SO上的许多解决方案都涉及使用CountIf来查找重复项。如果我有一个包含100,000多个值的列表,CountIf搜索重复项通常需要几分钟。

是否有更快捷的方法使用CountIf在Excel列 WITHOUT 中搜索重复项?

谢谢!

编辑#1:
在阅读了评论和回复之后,我意识到我需要深入了解更多细节。让我们假装我是一名观鸟者,在我从观鸟旅行回来之后,我输入了1到25或50只新鸟,我在旅行中看到了我看到的“鸟类主列表”。这实际上是一个动态增长的列表,每次添加我都要确保我不会复制列表中已存在的内容。

因此,在我的文件的A列中是鸟的名字。 B-M栏可能包含鸟类的其他属性。我想知道在我最近的观鸟之旅后,我刚刚在A栏中添加的鸟是否存在于我的列表中的某个地方。并且,如果确实如此,我会手动合并2个条目的数据并抛弃一些并经过仔细审查后保留一些。我显然不希望在我的数据库中有相同鸟的重复条目。

所以,最后我想要一些迹象表明其他地方有或没有重复,如果有重复,请告诉我要查看哪一行(或突出显示或着色两个副本)。

8 个答案:

答案 0 :(得分:10)

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

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

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

2)在条件格式中使用Countif来突出显示重复的单元格。有关详细信息,请参阅此链接。

suggestions for a macro to find duplicates in a SINGLE column

修改

我的道歉:)

Countif是第三快的方式!

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

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

<强>后续

似乎我在公式中输了一个错字。是的,对于大量行,CountIf确实需要几分钟,如您的建议。

让我看看我是否可以提出适合您确切需求的VBA代码。

西特

答案 1 :(得分:9)

您可以使用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

答案 2 :(得分:4)

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

主页标签|条件格式&gt;突出显示单元格规则&gt;重复值......

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

或者运行此代码并过滤彩色单元格,在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

附录

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

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

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

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

重复。

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

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

enter image description here

答案 5 :(得分:2)

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

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

这将只删除A列中活动工作表上的任何重复条目。运行需要几毫秒(使用200k行测试)。请注意,这将严格删除所有重复的条目。虽然这不是原始问题的措辞,但我确实认为这仍然符合您的目的。

答案 6 :(得分:0)

查找唯一值的一种简单方法是使用高级过滤器并仅过滤唯一值,然后将其复制并粘贴到其他工作表中,就像移除轴时一样,您将获得包含副本的整个数据。

答案 7 :(得分:0)

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

&#34; 1&#34;将显示重复项。