我想根据大表中列中的重复单元格删除行,而不留下重复样本(如“删除重复项”Excel命令)。如果我有:
1
2
2
3
我希望,结果:
1
3
这可以通过条件格式化完成,然后过滤或排序重复项并删除过滤后的数据,但对于大型工作表来说,这个过程非常慢。 条件格式化需要第二个,但只需点击过滤器需要大约5分钟来显示过滤器上下文菜单,另外20-30分钟可以根据颜色进行实际过滤。我在具有4个内核和大量RAM和100.000行表的不同PC上尝试了这个过程
然后我考虑编写VBA,迭代列单元格,如果单元格是彩色的,则删除整行(这可以在Excel 2010中使用Cells().DisplayFormat
),但处理需要更多时间。
有人可以建议更快地删除大页上的重复项吗?
答案 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文件的方法,我必须删除大块数据:
在最后一列之后,使用countif()
(非常像KazJaw和DanM的countif)
=COUNTIF($A$1:$A$100000,A1)
$A$1:$A$100000
包含您的ID。相应地改变。
$B$1:$B$100000
如果这是您放置辅助列的列,则 Ctrl + D )现在,如果要恢复原始订单,请在计数之后再添加另一列,在上面的步骤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的快捷方式)。