从大表中删除重复项

时间:2013-08-07 18:32:26

标签: excel

我想根据大表中列中的重复单元格删除行,而不留下重复样本(如“删除重复项”Excel命令)。如果我有:

1
2
2
3

我希望,结果:

1
3

这可以通过条件格式化完成,然后过滤或排序重复项并删除过滤后的数据,但对于大型工作表来说,这个过程非常慢。 条件格式化需要第二个,但只需点击过滤器需要大约5分钟来显示过滤器上下文菜单,另外20-30分钟可以根据颜色进行实际过滤。我在具有4个内核和大量RAM和100.000行表的不同PC上尝试了这个过程

然后我考虑编写VBA,迭代列单元格,如果单元格是彩色的,则删除整行(这可以在Excel 2010中使用Cells().DisplayFormat),但处理需要更多时间。

有人可以建议更快地删除大页上的重复项吗?

3 个答案:

答案 0 :(得分:3)

编辑:请注意,我使用了2个函数。其中,test是一个测试函数是否有效的函数(根据您的场景必须修改)。

另外,我用测试值将单元格A1填充到A100000。请根据您的需要进行修改。

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

答案 1 :(得分:2)

我处理大型excel文件的方法,我必须删除大块数据:

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

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

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

  2. 将公式拖到底部(向下填充,或选择范围$B$1:$B$100000如果这是您放置辅助列的列,则 Ctrl + D
  3. 复制列并粘贴值以删除公式。这样可以防止在任何过滤期间/之后重新计算。
  4. 按列计算排序。这样可以在以后更快地删除大部分行。
  5. 查找从哪里开始获取2的数量并删除所有行直到底部。
  6. 删除辅助列。
  7. 现在,如果要恢复原始订单,请在计数之后再添加另一列,在上面的步骤3之后,以及在步骤5之后,按升序对此新列进行排序,然后在步骤6中将其删除。

答案 2 :(得分:1)

如果您的数据位于A列中,则此公式应该可以非常有效地执行您需要的操作:

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

此公式计算A1中的值出现在A1:A100000范围内的次数。 (美元符号会保持这个范围,因为你拖下你的公式就会向下移动。)

将其放入B1并向下拖动*至B100000(假设您有100,000行)。

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

*向下拖动的快捷方式是选择B1,然后按Ctrl-End,然后按住shift并单击B100000。然后执行Ctrl-D(这是Fill Down的快捷方式)。