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

pha*_*han 5 excel vba duplicates excel-vba

SO上的许多解决方案涉及使用CountIf查找重复项.但是,当我有一个100,000+值的列表时,CountIf搜索重复项通常需要几分钟.

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

谢谢!

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

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

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

Sid*_*out 10

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

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

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

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

建议宏在SINGLE列中查找重复项

编辑:

我很抱歉 :)

Countif是第三快的方式!

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

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

跟进

好像我在公式中写了一个拼写错误.是的,对于大量行,CountIf确实需要几分钟,如您所建议的那样.

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

希德


ass*_*ias 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
Run Code Online (Sandbox Code Playgroud)


lor*_*i_m 5

如果使用 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
Run Code Online (Sandbox Code Playgroud)

附录

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

数据选项卡 | 高级过滤器...就地过滤,仅唯一记录,好的。

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