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

SO上的很多解决scheme都涉及使用CountIf来查找重复项。 但是,如果我有一个超过100,000个值的列表, CountIf通常需要几分钟的CountIf来search重复项。

有没有更快的方法来searchExcel列中的重复项没有使用CountIf?

谢谢!

编辑#1:
在阅读了评论和回复后,我意识到我需要进一步细化。 让我们假装自己是一个观鸟者,从观鸟之旅回来之后,我可以在我的旅行中看到的1到25或50只新鸟的任意一个input到我看到的“鸟类名单”中。 这真是一个dynamic增长的列表,每增加一个,我都想确保我不重复列表中已存在的内容。

所以,在我的文件A栏是鸟的名字。 BM列可能包含鸟类的其他属性。 我想知道在我最近的观鸟之旅ALREADY之后,我刚刚在A列中添加了一只鸟,是否存在于我列表中的其他地方。 而且,如果是这样的话,我会手动合并这两个条目的数据,扔掉一些,仔细审查后保留一些。 我显然不想在我的数据库中有同样的鸟重复的条目。

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

如果使用Excel 2007或更高版本(可能来自100,000个以上的值),可以select:

主页选项卡| 条件格式>突出显示单元格规则>重复值…

右键单击突出显示的单元格,然后按所选单元格颜色进行过滤,以显示重复项目(但请注意,条件格式设置可能会很慢)。

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

附录

要select没有代码或公式的重复值,我发现这个方法很有用:

数据选项卡| 高级filter…就地过滤,唯一logging,确定。

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

我知道的最快速的方法(如果您使用的是Excel 2007/2010),就是使用Data(In Ribbon)| 删除重复项以查找重复项的总数或删除重复项。 在testing之前,您可能需要将数据移动到临时表单。

最快的方法是使用Countif。 现在Countif可以用很多方式查找重复。 这里有两个主要的方法。

1)在数据旁边插入一个新的列,然后把公式复制下来。

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

build议macros在单列中查找重复项

编辑:

我很抱歉 :)

Countif是第三快的方式!

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

你究竟发现重复的主要目的是什么? 你想删除它们吗? 或者你想强调他们? 或者是其他东西?

跟进

好像我在公式中犯了一个错字。 是的,对于大量的行,CountIf确实需要几分钟。

让我看看是否可以拿出一个VBA代码来满足您的确切需求。

希德

您可以使用VBA – 以下函数在不到一秒的时间内返回100,000个列表中的唯一条目列表。 用法:select一个范围,input公式(= 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 

你找不到你想要做的事情。 如果你只是想看看他们在哪里…

 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 

防止重复数据validation
您可以使用数据validation来防止您input重复的鸟名。 请参阅Debra Dalgelish的网站

处理现有的重复
我的免费重复主插件会让你

  • select
  • 颜色
  • 名单
  • 删除

重复。

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

  • 不区分大小写/区分大小写的search(下面的示例)
  • 修剪/清洁数据
  • 删除所有空格(包括CHAR(160)), 请参阅下面的“mapgie”和“magpie”示例
  • 运行正则expression式匹配( 例如下面的示例用""replaces$以除去复数)
  • 匹配列的任何组合(即列A,所有列,列A和B等)

在这里输入图像说明

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

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

这将简单地删除A列中活动工作表上的任何重复条目。运行需要几毫秒(用200k行进行testing)。 请注意,这将严格删除所有重复的条目。 虽然这不是原来的问题,但我相信这仍然符合你的目的。

find唯一值的一个简单方法是使用高级filter并仅过滤唯一值,并将它们复制并粘贴到其他工作表中,因为当数据透视表被移除时,您将获得具有复制内容的整个数据。

如果(a2 = a1; 1; if(a2 = a3; 1; 0))

“1”将显示重复。