1

我想从大工作表中删除基于列中重复单元格的行,而不留下重复的样本(就像“删除重复项”Excel 命令一样)。所以如果我有:

1
2
2
3

结果,我想要:

1
3

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

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

有人可以建议一种更快的方法来删除大纸上的重复项吗?

4

3 回答 3

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
于 2013-08-07T19:11:59.873 回答
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. 删除帮助列。

现在,如果要恢复原始顺序,请在计数之后、上面的第 3 步和第 5 步之后再放一列,在第 6 步删除之前按升序对这个新列进行排序。

于 2013-08-07T18:53:15.300 回答
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 的快捷方式)。

于 2013-08-07T18:44:33.183 回答