从大的表中删除重复

我想从大的表中删除基于列中的重复单元格的行,而不会留下重复的示例(如“删除重复”Excel命令)。 所以如果我有:

1 2 2 3 

我想,结果是:

 1 3 

这可以通过条件格式化来完成,然后对重复项进行筛选或sorting并删除过滤的数据,但对于大型表单来说,这个过程非常缓慢。 条件格式需要秒,但只需点击filter需要大约5分钟显示filter上下文菜单和额外的20-30分钟做基于颜色的实际过滤。 我尝试了这个过程在不同的4核心PC和大量的内存和100.000行表

然后,我认为写VBA,迭代列单元格,如果单元格着色,然后删除整个行(这是可能的Excel 2010中与Cells().DisplayFormat ),但处理需要更多的时间。

有人可以build议一个更快的方式来删除大表上的重复?

编辑:请注意,我已经使用了2个function。 其中, test是一个函数来testingfunction是否工作(您将不得不修改您的scheme)。

另外,我用单元格A1将A100000填入testing值。 请根据您的需求进行修改。

 Option Explicit Function GetUniqueItems(ByVal src As Range) As Variant Dim returnValue Dim dictOfItemsWith1Value Dim dictOfItemsWithMoreThan1Value Dim countOfCells As Long Dim counter As Long Dim srcValues As Variant Dim currentValue Dim cell As Range srcValues = src.Value countOfCells = src.Cells.Count Set dictOfItemsWith1Value = CreateObject("Scripting.Dictionary") Set dictOfItemsWithMoreThan1Value = CreateObject("Scripting.Dictionary") For counter = 1 To countOfCells currentValue = srcValues(counter, 1) If dictOfItemsWithMoreThan1Value.exists(currentValue) Then dictOfItemsWithMoreThan1Value(currentValue) = dictOfItemsWithMoreThan1Value(currentValue) + 1 Else If Not dictOfItemsWith1Value.exists(currentValue) Then dictOfItemsWith1Value.Add currentValue, 1 Else dictOfItemsWith1Value.Remove currentValue dictOfItemsWithMoreThan1Value.Add currentValue, 1 End If End If Next ReDim returnValue(1 To dictOfItemsWith1Value.Count, 1 To 1) Dim key counter = 1 For Each key In dictOfItemsWith1Value.keys returnValue(counter, 1) = key counter = counter + 1 Next GetUniqueItems = returnValue End Function Sub test() Debug.Print Now Dim uniqueValues uniqueValues = GetUniqueItems(Range("A1:A100000")) Range("A1:A100000").ClearContents Range("A1").Resize(UBound(uniqueValues, 1)) = uniqueValues Debug.Print Now End Sub 

我的方式来处理大的Excel文件,我必须删除大块的数据:

  1. 在最后一列之后,使用countif() (很像KazJaw和DanM的countif)

     =COUNTIF($A$1:$A$100000,A1) 

    $A$1:$A$100000包含您的ID。 相应地改变。

  2. 将公式拖到底部(向下填充,或者select范围$B$1:$B$100000如果这是放置帮助者列的列, 则按Ctrl + D
  3. 复制列和粘贴值以删除公式。 这将防止任何过滤期间/之后的重新计算。
  4. 按照计数列进行sorting。 这使得以后删除大部分的行更快。
  5. find你开始得到2的计数,并删除所有行,直到底部。
  6. 删除帮助者列。

现在,如果要恢复原始顺序,请在计数之后放置另一列,在上面的步骤3之后,在步骤5之后,按升序对此新列进行sorting,然后在步骤6中将其删除。

如果你的数据位于A列,这个公式应该做你需要的相当有效的:

 =COUNTIF(A$1:A$100000,A1) 

此公式计算A1中的值出现在A1:A100000范围内的次数。 (美元符号使得这个范围不会随着您的公式的下移而下移。)

放置在B1中,并向下拖动*到B100000(假设你有100,000行)。

然后只要在B列上做一个filter,只显示1.(超过1意味着你有重复,不应该显示它。)

*拖下来的快捷方式是selectB1,然后按Ctrl-End,然后按住shift并点击B100000。 然后做Ctrl-D(这是一个快速填充下来)。